SpriteCollision und DrawText - Problem

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Tur0k
Beiträge: 187
Registriert: 16.02.2009 21:41
Computerausstattung: 4.00 GB RAM, 2x 2.20Ghz, 340GB+500GB

SpriteCollision und DrawText - Problem

Beitrag von Tur0k »

Hallo Community!

Ich hab ein kleines Problem mit SpriteCollision:
Wenn ich versuche, meine Figur nach oben zu bewegen bzw. von unten nach oben.
dann bleibt Sie bei folgender Position (Y: 115) stehen und bewegt sich nicht weiter.
*siehe Bild:*
Bild
Wie kann ich die Figur so bewegen, das sie so stehen bleibt:
Bild

Code:

Code: Alles auswählen

    If SpritePixelCollision(0, PlayerX, PlayerY, 2, 50, 50)
    
    If KeyboardPushed(#PB_Key_D)
    PlayerX = PlayerX-1
    EndIf
    
    If KeyboardPushed(#PB_Key_A)
    PlayerX = PlayerX+1
    EndIf
    
    If KeyboardPushed(#PB_Key_S)
    PlayerY = PlayerY-1
    EndIf
    
    If KeyboardPushed(#PB_Key_W)
    PlayerY = PlayerY+1
    EndIf
    
    EndIf

Code inkl. Bilder:
http://www.file-upload.net/download-169 ... D.zip.html

##############################################

2. Problem

Wenn ich mit folgenden Code versuche, einen Text anzuzeigen, während ich die Rechte Maustaste klicke:

Code: Alles auswählen

    If GetAsyncKeyState_(#VK_RBUTTON)
    Start3D()
    DisplaySprite3D(4, WindowMouseX(0)-55, WindowMouseY(0)+15)
    If StartDrawing(ScreenOutput())
      
      DrawingMode(#PB_2DDrawing_Transparent)
      BackColor(RGB(0,155,155)) ; Change the text back and front colour
      FrontColor(RGB(255,255,255)) 
      DrawText(10,50,"Hello, this is a test")

      StopDrawing()
    EndIf

    Stop3D()
    Else
    ;Nichts
    EndIf
Dann bekomme ich folgenden Fehler:

Code: Alles auswählen

[ERROR] The specified output is NULL (0 value)
Danke und Mfg. Tur0k
buuh* :D
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag von gnasen »

Das Problem liegt darin, dass SpriteCollision prüft ob 2 Sprites sich berühren.
Sobald die Figur mit dem Kopf die Wand berührt, prüfst du, ob die Sprites kollidieren. Da sie es tun, kann sie nicht weiter.

Bild

(Rote Rahmen = Spritekanten / Kollisionsboxen)

Lösung: Nimm nicht das ganze Sprite der Figur zur kollision, sondern zB nur die Füße.
Erstell dir am besten eine einfache Box-Box Kollision (gibts im Forum) und wähle die Kollisionsbox deiner Figur ungefähr so:

Bild

Nun läuft deine Figur wie gewollt bis zur Wand.
pb 4.51
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag von KeyKon »

Naja, du musst die entweder die SpriteCollision mit den richtigen Tile machen, oder, was glaube ich der übliche weg bei TileEngines is (Ich nehme an es handelt sich bei dir um eine TileEngine) ganze ohne SpriteCollision arbeiten und im TileArray eben festlegen welche Tiles "begehbar" sind und welche nicht (was du dann natürlich auch überprüfen musst)

EDIT:

Zu Problem 2: Du kannst keine DirectDrawing machen während du im 3D-Modus bist, du musst das Drawing entweder nach Stop3D() oder vor Start3D() machen, um solche Error zu vermeiden empfiehlt es sich auch immer zu überprüfen ob der DrawingBereich überhaupt verfügbar is:

If StartDrawing()
Drawingzeugs
StopDrawing()
EndIf
(\/) (°,,,°) (\/)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ich würde auch zu einer tile-weise prüfung raten, denn auch die Füße-Lösung hätte den Nachteil,
dass das männeken dann nicht weiter hinter die mauer treten kann.

ganz allgemein ist es praktischer, mit koordinaten zu arbeiten.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Tur0k
Beiträge: 187
Registriert: 16.02.2009 21:41
Computerausstattung: 4.00 GB RAM, 2x 2.20Ghz, 340GB+500GB

Beitrag von Tur0k »

Vielen Dank für eure Antwort, gnasen, KeyKon und Kaeru Gaman!

Wie sieht so eine TileArray aus?

Edit:
2. Problem:

Auch wenn ich StartDrawing nach Stop3D schreibe, bekomm ich immer noch die gleiche Fehlermeldung.

Mfg. Tur0k
buuh* :D
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Auch wenn ich StartDrawing nach Stop3D schreibe, bekomm ich immer noch die gleiche Fehlermeldung.

benutzt du Engine3D?
dann geht Screendrawing garnicht.


> Wie sieht so eine TileArray aus?

http://www.purebasic.fr/german/viewtopi ... 634#116634
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Tur0k
Beiträge: 187
Registriert: 16.02.2009 21:41
Computerausstattung: 4.00 GB RAM, 2x 2.20Ghz, 340GB+500GB

Beitrag von Tur0k »

Kaeru Gaman hat geschrieben:> Auch wenn ich StartDrawing nach Stop3D schreibe, bekomm ich immer noch die gleiche Fehlermeldung.

benutzt du Engine3D?
dann geht Screendrawing garnicht.


> Wie sieht so eine TileArray aus?

http://www.purebasic.fr/german/viewtopi ... 634#116634
Ok, danke!
Ich schau es mir an! :)

Mfg. Tur0k
buuh* :D
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag von KeyKon »

Komisch, an und für sich müsste so alles seine Richtigkeit haben:

Code: Alles auswählen

  If GetAsyncKeyState_(#VK_RBUTTON)
    If Start3D()
      DisplaySprite3D(4, WindowMouseX(0)-55, WindowMouseY(0)+15)
      Stop3D()
    EndIf
    If StartDrawing(ScreenOutput())
     
      DrawingMode(#PB_2DDrawing_Transparent)
      BackColor(RGB(0,155,155)) ; Change the text back and front colour
      FrontColor(RGB(255,255,255))
      DrawText(10,50,"Hello, this is a test")

      StopDrawing()
    EndIf
  Else
    ;Nichts
  EndIf
Bei welcher Zeile bzw. welchem Befehl kommt denn die Fehlermeldung?
(\/) (°,,,°) (\/)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Komisch, an und für sich müsste so alles seine Richtigkeit haben:

wie gesagt, wenn er noch ne Engine3D drinne hat, funzt da garnix mehr mit screendrawing.
aber hab jetzt nicht sein projekt runtergeladen, um das zu testen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag von KeyKon »

Kaeru Gaman hat geschrieben:> Komisch, an und für sich müsste so alles seine Richtigkeit haben:

wie gesagt, wenn er noch ne Engine3D drinne hat, funzt da garnix mehr mit screendrawing.
aber hab jetzt nicht sein projekt runtergeladen, um das zu testen.
Die Screenshots sehen für mich jetz nich danach aus...

EDIT: Hab den Code gerade geladen, is keine Engine3D() drin, aber der Code sieht ziemlich böse aus...

Einige Tipps an Turok:

- LoadSprite() hat nix in der Anzeige-Schleife zu suchen, genauso wenig das CreateSprite3D() danach, das muss alles vor der Schleife und dem eigentlichen Spiel passieren, sonst wird ja für jedes Frame das Bild neu geladen...
- Desweiteren sollte man (glaube ich zumindest) nur einen Start3D() : Stop3D() block in der Schleife haben, alles am besten alles was mit Sprite3D() werkelt zusammenfassen und in einem zug abhandeln... (Dann klappts vll auch mit dem Drawing ;-) )
- Im übrigen hast du beim Einrücken ein wenig geschlampt, das kann einen ziemlich verwirren, insbesondere wenn der Code mal ziemlich lang is...
- Es emfpiehlt sich auch, gerade wenn es sich um ein Game handelt, das ja bestimmt mal viele Sprites haben wird mit Konstanten und Enumeration zu arbeiten anstatt mit Zahlen zu hantieren
- Wenn du im WindowedScreen arbeitest und die Mousedaten eh mit den Windowbefehelen abfragst brauchst du InitMouse() nicht verwenden...
- Desweiteren solltest du auch nur die ImageDecoder einbinden die du wirklich brauchst, genau deswegen kann man sie ja einzeln einbinden...
- Wozu ist CreateImage(0, 300, 200) da?
- StrF() für Normale LongVariablen ist auch überflüssig, einfach Str() nehmen...
Zuletzt geändert von KeyKon am 10.06.2009 00:45, insgesamt 7-mal geändert.
(\/) (°,,,°) (\/)
Antworten