Seite 1 von 1

Probleme mit meinem 2D Shooter

Verfasst: 22.10.2004 18:08
von MDM
Hi,

Ich programmiere derzeit einen kleinen 2D Shooter. Doch in der kollisionsabfrage sind noch einige Bugs.
Wenn sich die Spielfigur an einer steigung befindet, die höher als 3 pixel ist, lässt sie sich in die andere Richtung nicht mehr bewegen. :|

Hier mal der Code:

Code: Alles auswählen

InitSprite()
InitKeyboard()



OpenScreen(800, 600, 32, "soldiers reloaded")

LoadSprite(0, "Maps\test\front.bmp", 0)
LoadSprite(1, "Maps\test\back.bmp", 0)
LoadSprite(2, "Maps\test\col.bmp", 0)

LoadSprite(3, "GFX\worm0.bmp", 0)
LoadSprite(4, "GFX\worm1.bmp", 0)

LoadSprite(5, "GFX\worm0r.bmp", 0)
LoadSprite(6, "GFX\worm1r.bmp", 0)


s.l
s = 3

x.l
y.l

r.l

x = 50
y = 50




Repeat
ExamineKeyboard()

;Fall Routine
DisplayTransparentSprite(3, x, y)
If SpritePixelCollision(2, 0,0, 3, x, y-1)

Else
 y = y + 1
EndIf



;Rechts------------------------
If KeyboardPushed(#PB_Key_Right)

s = 5

 If SpritePixelCollision(2, 0, 0, s, x+1, y)
 
  If SpritePixelCollision(2, 0, 0, s, x+1, y-1)
 
   If SpritePixelCollision(2, 0, 0, s, x+1, y-2)
  
    If SpritePixelCollision(2, 0,0 , s, x+1 , y-3)
   
    Else
    x = x + 1
    y = y - 3
    EndIf
  
   Else
   x = x + 1
   y = y - 2
   EndIf 
   
  Else
  x = x + 1
  y = y - 1
  EndIf 

 Else
 x = x + 1
 EndIf 

EndIf 
;------------------------------




;Links-------------------------
If KeyboardPushed(#PB_Key_Left)

s = 3

If SpritePixelCollision(2, 0, 0, s, x-1, y)
 
  If SpritePixelCollision(2, 0, 0, s, x-1, y-1)
 
   If SpritePixelCollision(2, 0, 0, s, x-1, y-2)
  
    If SpritePixelCollision(2, 0,0 , s, x-1 , y-3)
   
    Else
    x = x - 1
    y = y - 3
    EndIf
  
   Else
   x = x - 1
   y = y - 2
   EndIf 
   
  Else
  x = x - 1
  y = y - 1
  EndIf 

 Else
 x = x - 1
 EndIf 


EndIf
;------------------------------



;Jetpack-----------------------

If KeyboardPushed(#PB_Key_Up)

 If SpritePixelCollision(2, 0, 0, s, x, y-3)
 
 Else
 y = y - 2
 EndIf

EndIf 




DisplayTransparentSprite(2, 0, 0)
DisplaySprite(1, 0, 0)
DisplayTransparentSprite(s, x, y)
DisplayTransparentSprite(0, 0, 0)

FlipBuffers()

Until KeyboardPushed(#PB_Key_Escape)

Verfasst: 23.10.2004 17:38
von Ynnus
Ohne die Grafiken wird es schwer sein, es genauso nachzubauen wie du es hast, und dadurch kann man den Fehler nur schwerer nachvollziehen. Ich würde die Kollision allgemein wie folgt aussehen lassen:

Du bewegst die Figur in eine bestimmte Richtung, dann erfolgt eine Abfrage, ob eine Kollision vorliegt. Wenn diese Kollision jetzt besteht, einfach 1en Pixel in die gegengesetzte Richtung zurückgehen, wie die Figur gerade gegangen ist. Dann wieder prüfen auf Kollision. Besteht die Kollision immer noch, dann wieder einen Pixel zurückgehen. Irgendwann ist dann die Kollision verflogen und die Figur bleibt dann exakt an der Kante vorher stehen.
Am besten packst du das alles in eine While Schleife. ;)
So hab ich meine Kollision gemacht, mit deiner direkt kann ich mich jetzt gerade nicht auseinandersetzen.

Verfasst: 23.10.2004 18:13
von MDM
wie meinst du das ?
ich kann ja morgen mal die bilder + code hochladen

Verfasst: 27.10.2004 20:58
von MDM
Ich habe mal alles hochgeladen

http://mdm.md.funpic.de/game.rar

( Rechtsklick / Ziel speichern unter )

Verfasst: 02.11.2004 13:02
von real
Wo ist die Datei? Error 404!

Verfasst: 03.11.2004 00:27
von MDM
rechtsklick / ziel speichern unter :?
wie gesagt :roll:

Verfasst: 19.12.2004 12:54
von AndyX
@MDM,
Ich weiß ja nicht, ob es zu deinem Spiel passt und ob du es gut findest, aber es wäre eine gute Idee wenn die Figur nicht unendlich hoch fliegen lassen würdest (Treibstoff aus?! <) ) und sie ein bisschen Pause zum warten hätte, bis sie wieder fliegen kann.
Da könnte man mit Variablen hochzählen arbeiten. 8)

Z.B. so:

Code: Alles auswählen

up = 0             ;sprunghöhenlimit-variable
pause = 0          ;pausen-variable

If pause = 0        ;wenn grad keine pause ist...
  If up = 75         ;überprüfen ob das sprung-limit erreicht ist...
  up = 0              ;wenn ja, wieder limit auf null setzen und...
  pause = 1         ;pause beginnen.
 Else                   ;ansonsten...
  y = y - 5           ;springen...
  up + 1              ;und limit-variable eins hochzählen.
 EndIf
EndIf

If pause > 0       ;wenn die pause begonnen wurde...
 If pause = 35    ;überprüfen ob sie schon zu ende ist...
  pause = 0        ;wenn ja, pausen-variable zurücksetzen und man kann
                         ;wieder springen!
 Else                  ;ansonsten...
  pause +1         ;mit pause fortfahren bis sie dann aus ist.
 EndIf
EndIf 
Ich hoffe, der Code ist übersichtlich und verständlich.

AndyX