Problem bei Pixel - Kollision mit TileMap....
Übersicht

![]() |
RoneBetreff: Problem bei Pixel - Kollision mit TileMap.... |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
ich progrogrammiere gerade ein kleines Jump and Run. Das ganze sollte eigendlich nur zur Einarbeitung einer Freundin in BMax dienen...aber naja. Die Kollision des Spielers mit den Tiles soll dabei Pixelgenau sein, damit der Spieler auch Schrägen usw. entlang laufen kann. -> Das allein klappt auch wunderbar, allerdings bekomm ich die Kollision mit den Wänden nicht hin .... ![]() Aber wenn die Kollision mit den Wänden klappt, klappt das mit dem Boden nicht... Ich hab mal ne kleine Testanwendung gemacht, wäre nett wenn jemand einen Tip hat... Code: [AUSKLAPPEN] SuperStrict Graphics 640 , 480 SetBlend ALPHABLEND '--------------------------------------------- 'Map Global tile:Int RestoreData Level Global map:Int[][] map= map[..20] For Local I:Int = 0 To 19 map[I] = map[I][..15] Next For Local y:Int = 0 To 14 For Local x:Int = 0 To 19 ReadData Tile map[x][y] = Tile Next Next '--------------------------------------------- 'tileset Incbin "tiles.png" Global tileset:TImage = LoadAnimImage("incbin::tiles.png",32,32,0,6) '--------------------------------------------- 'PLAYER '--------------------------------------------- 'position Global XPos:Float = 100 , YPos:Float = 100 'speed Global vy:Float = 0 , vx:Float = 0 'springen Global Jump:Int=0,JState:Int=0,press:Int=0 '--------------------------------------------- 'main loop While Not KeyHit(KEY_ESCAPE) Cls Steuerung() MovePlayer() Collision() DrawMap() DrawImage tileset,Xpos,Ypos,3 Flip Wend '--------------------------------------- Function DrawMap() For Local x:Int = 0 To 19 For Local y:Int = 0 To 14 If map[x][y] Then DrawImage tileset,x*32,y*32,map[x][y]-1 Next Next End Function Function Steuerung() If KeyDown(KEY_LEFT) Then vx= -3 ElseIf KeyDown(KEY_RIGHT) Then vx = 3 Else vx = 0 EndIf JState = KeyDown(KEY_SPACE) If Not Jump And Not press And JState Then vy = - 15 Jump = 1 press=1 ElseIf Not JState press = 0 EndIf End Function Function MovePlayer() vy:+ 0.5 If vy > 12 Then vy = 12 Ypos :+ vy Xpos :+ vx End Function Function Collision() Local x1:Int = (Xpos) / 32 If x1 < 0 Then x1 = 0 If x1 > 19 Then x1 = 19 Local x2:Int = (Xpos+32) / 32 If x2 < 0 Then x2 = 0 If x2 > 19 Then x2 = 19 Local y1:Int = (Ypos+32) / 32 - 1 If y1 < 0 Then y1 = 0 If y1 > 14 Then y1 = 14 Local y2:Int = (Ypos+32) / 32 If y2 > 14 Then y2 = 14 If y2 < 0 Then y2 = 0 '----------------------------------------------------------- If vy > 0 Then 'Boden For Local ix:Int = x1 To x2 For Local iy:Int = y1 To y2 If Map[ix][iy] Then While ImagesCollide(tileset , Xpos , Ypos , 3 ,tileset , ix*32,iy*32, Map[ix][iy]-1) YPos:- 1 Jump = 0 JState = 0 vy=0 Wend EndIf Next Next ElseIf vy <= 0 Then 'Decke For Local ix:Int = x1 To x2 For Local iy:Int = y1 To y2 If Map[ix][iy] Then While ImagesCollide(tileset , Xpos , Ypos , 3 ,tileset , ix*32,iy*32, Map[ix][iy]-1) YPos:+ 1 vy=0 Wend EndIf Next Next EndIf Rem If vx > 0 Then 'rechts For Local ix:Int = x1 To x2 If Map[ix][y1] And Map[ix][y1] <> 3 And Map[ix][y1] <> 1 Then While ImagesCollide(tileset , Xpos , Ypos , 3 ,tileset , ix*32,y1*32, Map[ix][y1]-1) XPos:-1 vx = 0 Wend EndIf Next ElseIf vx < 0 Then 'links For Local ix:Int = x1 To x2 If Map[ix][y1] And Map[ix][y1]<>1 And Map[ix][y1] <> 3 Then While ImagesCollide(tileset , Xpos , Ypos , 3 ,tileset , ix*32,y1*32, Map[ix][y1]-1) XPos:+1 vx=0 Wend EndIf Next EndIf EndRem End Function '--------------------------------------- EndGraphics End #Level DefData 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 DefData 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 DefData 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 DefData 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 2, 2, 5, 0, 0 DefData 0, 0, 0, 6, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 DefData 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 DefData 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 DefData 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3 DefData 1, 0, 0, 0, 0, 0, 0, 2, 2, 2, 5, 0, 0, 0, 0, 0, 0, 0, 3, 2 DefData 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2 DefData 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 2 DefData 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 2, 2 DefData 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 2, 2, 2 DefData 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 2, 2, 2, 2 DefData 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 mfg Rone Edit: ...das Tileset |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich empfehle dir dringend, die im Anfängerboard geposteten Einsteigerlinks zu besuchen, speziell Assaris Kollisionstutorial, denn TileMaps mit der alten Blitzmethod zu testen ist extrem ineffizient (für 100 bilder ImageCollide) und umständlich verglichen mit dem was die Kollisionsmasken dir an Leistung liefern. (weil du dann, solange die TileMap sich nicht bewegt, die Kollisionsmaske niemals neu zeichnen musst) | ||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Rone |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zitat: Ich empfehle dir dringend, die im Anfängerboard geposteten Einsteigerlinks zu besuchen, speziell Assaris Kollisionstutorial, denn TileMaps mit der alten Blitzmethod zu testen ist extrem ineffizient (für 100 bilder ImageCollide) und umständlich verglichen mit dem was die Kollisionsmasken dir an Leistung liefern. (weil du dann, solange die TileMap sich nicht bewegt, die Kollisionsmaske niemals neu zeichnen musst) Danke für den Tipp, werde mir das auf jeden Fall mal angucken...
Mir war zwar bewusst, dass BMax Kollisions- Layer und Masken bietet, hatte mir das bislang aber noch nichtdamit beschäftigt. Naja, für diesen Fall reicht mir die alte Methode, da es nun so läuft wie ich wollte ![]() Wie ich das sehe liegt der Vorteil bei der neuen Methode vorallem dabei, dass CollideImage() ne Liste mit den Kollidierten objekten zurückliefert, was mir speziell für Kollision mit Tilemaps kein Vorteil bringt, da ich anhand der X/Y position sowieso das Tile habe, zumal ich nur einen Kollisions layer benutze...oder irre ich mich da und CollideImage() ist prinzipiell schneller? mfg |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ImageCollide nutzt die gleichen Kollisionsroutinen wie CollideImage. Es nutzt lediglich einen eigenen Collisionslayer den es immer wieder löscht.
Falls du vor hast, auf deiner TileMap auch so Dinge wie "interaktion" einzubauen (berührungen von Dingen, anklicken etc), dann ist die Kollisionsmasken Methode um einiges schneller. Denn die Optimierungen, die du für ImageCollide nutzt, kannst du auch mit Kollisionsmasken nutzen. Du erhälst aber den zusätzlichen Vorteil, dass du solange die Kollisionsmaske (-> Tilemap) sich nicht bewegt, die maske auch für die 3x3 Tiles wo du drauf stehst nicht neu zeichnen musst. Vorteil: Wenn du 3x das gleiche Tilemap Tile mit einem dynamischen Objekt kollidieren lassen willst, muss die Tilemap nur 1x gezeichnet werden mit CollideImage, während ImageCollide es 3x zeichnen muss. Ich persönlich mache es so, dass ich einen dynamischen Layer habe (zb 1), wo alle sich bewegenden Objekte drauf sind, die sich jedes Frame ändern. Auf einem anderen Layer (14) habe ich dann die statischen Kollisionsdinge. Dabei ist es so, dass ich die dynamischen Objekte nur auf Layer 1 schreibe, sie aber gegen Layer 1 und 14 teste (denn zum testen muss man es nicht drauf schreiben). Und dann halt jedes Frame Layer 1 löschen, während Layer 14 nur gelöscht und neu gezeichnet wird, wenn die TileMap sich bewegt. Klingt hoffentlich nicht allzu wirr. Assari bzw. die D Übersetzung zeigen die Vorteile und Unterschiede. Prinzipiell kann man eigentlich jede Optimierung die man "mit der alten Blitz Kollision" nutzt auch mit der neuen nutzen um diese noch effizienter zu machen. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group