Kollisionsproblem ála Sokoban

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Aracos

Betreff: Kollisionsproblem ála Sokoban

BeitragSa, Apr 26, 2008 15:51
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Apr 26, 2008 19:07
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Apr 27, 2008 16:38
Antworten mit Zitat
Benutzer-Profile anzeigen
ja bei sokoban sollen die steine bewegt werden Wink
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

BeitragSo, Apr 27, 2008 23:21
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Very Happy

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

BeitragMi, Apr 30, 2008 11:14
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Apr 30, 2008 21:49
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group