Kollisionsproblem ála Sokoban
Übersicht

AracosBetreff: Kollisionsproblem ála Sokoban |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo!
Hab da ein kleines Problemchen (*Doh*) und zwar versuche ich das Grundprinzip von Sokoban darzustellen. Problem das ich momentan habe: Die Kollisionsdetection funktioniert eigentlich ganz gut, nur das sobald der spieler den block bewegt beide zusammenhängen und sich ab dann wie ein einzelnes Objekt bewegen. (kann man das verstehen?) Danke für jede Hilfe! Code: [AUSKLAPPEN] Graphics 800,600,32,2
SetBuffer BackBuffer() y = 250 x = 300 x1 = 500 y1 = 400 Repeat Cls ClsColor 255,0,0 ;Pic Loading; Bild = LoadImage ("1.png") MaskImage Bild,255,0,255 DrawImage Bild,x,y Bild2 = LoadImage ("stahl.png") MaskImage Bild2,255,0,255 DrawImage Bild2,x1,y1 ;Kollisionsabfrage; If ImagesOverlap (bild, x, y, bild2, x1, y1) If KeyDown(203) Then x1=x1-5 EndIf If ImagesOverlap (bild, x, y, bild2, x1, y1) If KeyDown(205) Then x1=x1+5 EndIf If ImagesOverlap (bild, x, y, bild2, x1, y1) If KeyDown(200) Then y1=y1-5 EndIf If ImagesOverlap (bild, x, y, bild2, x1, y1) If KeyDown(208) Then y1=y1+5 EndIf ;für pixelgenaue kollision: frame1 nach y und frame2 nach y1 einfügen) und anstatt imagesoverlap, imagescollide; ;BEWEGUNG; If KeyDown(203) Then x=x-5 EndIf If KeyDown(205) Then x=x+5 EndIf If KeyDown(208) Then y=y+5 EndIf If KeyDown(200) Then y=y-5 EndIf ;SEITENBEGRENZUNG; If y<0 Then y=0 EndIf If y>545 Then y=545 EndIf If x>765 Then x=765 EndIf If x<0 Then x=0 EndIf Flip Until KeyDown(1) End |
||
Carpe Diem |
Lador |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo Aracos.
Also, zuerst einmal solltest du deine Bilder außerhalb der Schleife laden. ClsColor muss auch nicht in die Schleife. Ich verstehe dein Problem nicht ganz: Bei Sokoban sollen doch die Steine verschoben werden, oder etwa nicht? MFG Lador |
||
Aracos |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ja bei sokoban sollen die steine bewegt werden ![]() aber nur durch schieben nicht durch ziehen. momentan kann bei meinem prog. der spieler die blöcke schieben und ziehen! ich finde nur keinen weg das zu verhindern! Ich müsste im Endeffekt einen Weg finden das die Kollisionsabfrage nur für die jeweilige richtung anspricht von der, der spieler kommt. in pseudosprache bräuchte ich ungefähr so etwas (zumindest glaube ich das): Wenn der Spieler den block berührt dann schiebe den block in bewegungsrichtung des spielers ausser der spieler bewegt sich in irgendeine andere Richtung -> dann lass den block los mfg Aracos |
||
Carpe Diem |
![]() |
kriD |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du kannst ja beim Blockschieben alle Blöcke (bis auf den momentan geschobenen) und Wände usw. als Hindernisse ansehen.
Dann prüfst du , ob 2 Felder in Bewegungsrichtung ein Hinderniss ist. wenn nicht, dann darf der kleine Kerl schieben ![]() Pseudocode: Code: [AUSKLAPPEN] if blockschieben=1 then
for x = 0 to map_width for y = 0 to map_height if kisten_map (x,y)=1 then kollision_map (x,y)=1 if wand_map (x,y)=1 then kollision_map (x,y)=1 next next select player_richtung ;rechts case 1 if kollision_map (player_x+2,player_y)=0 then player_schieberlaubniss=1 ;unten case 2 if kollision_map (player_x,player_y+2)=0 then player_schieberlaubniss=1 end select ;player_x und player_y sind tile-angaben endif if player_schieberlaubniss=1 then in playerrichtung schieben else stehenbleiben und player mit zu schiebender Kiste kollisieren lassen endif Das ganze kann man sicherlich noch gut verbessern/optimieren.. nur ein Ideenansatz.. gl hf MfG kriD |
||
Wenn ich du wäre, wäre ich lieber ich! |
Pitje Puck |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Da du für ein Sokoban Spiel wahrscheinlich sowiso eine Teilmap benutzten wirst, brauchst du gar keine Kollisionsabfrage. Immer wenn die Spielfigur eine Tilegrenze übertritt, kannst du überprüfen was auf dem nächsten Feld ist.
Ist es leer -> Spielfigur bewegen Ist es eine Wand -> nicht bewegen Ist es eine Box -> Ist das Feld hinter der Box leer -> Spielfigur und Box bewegen |
||
![]() |
Travis |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich mache immer für jedes Objekt vier Variablen, die angeben ob eine Bewegung nach links,rechts,oben,unten möglich ist. Gilt auch für den Spieler. Steht z.B. rechts von der Kiste eine Wand, ist die Bewegung nach rechts unmöglich.
Steht jetzt der Spieler links neben einer Kiste und will nach rechts, wird geprüft ob die Kiste verschoben werden kann. Wenn nicht, wird die Bewegung nach rechts für den Spieler blokiert (ebenfalls per Variable). Ist es aber möglich, wird der Spieler auf das gleiche Feld wie die Kiste gesetzt. Der Spieler muss eine Variable haben, die angibt in welche Richtung er sich als letztes bewegt hat. In diese Richtung wird im Kollisionsfall (Spieler auf Kiste) auch die Kiste verschoben. Mit der Methode kann man die Kisten unmöglich mitziehen. |
||
www.funforge.org
Ich hasse WASD-Steuerung. Man kann alles sagen, man muss es nur vernünftig begründen können. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group