Probleme mit meinem 2D Shooter

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
MDM
Beiträge: 4
Registriert: 22.10.2004 18:04
Kontaktdaten:

Probleme mit meinem 2D Shooter

Beitrag 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)
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag 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.
Benutzeravatar
MDM
Beiträge: 4
Registriert: 22.10.2004 18:04
Kontaktdaten:

Beitrag von MDM »

wie meinst du das ?
ich kann ja morgen mal die bilder + code hochladen
Benutzeravatar
MDM
Beiträge: 4
Registriert: 22.10.2004 18:04
Kontaktdaten:

Beitrag von MDM »

Ich habe mal alles hochgeladen

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

( Rechtsklick / Ziel speichern unter )
real
Beiträge: 468
Registriert: 05.10.2004 14:43

Beitrag von real »

Wo ist die Datei? Error 404!
Benutzeravatar
MDM
Beiträge: 4
Registriert: 22.10.2004 18:04
Kontaktdaten:

Beitrag von MDM »

rechtsklick / ziel speichern unter :?
wie gesagt :roll:
Benutzeravatar
AndyX
Beiträge: 1272
Registriert: 17.12.2004 20:10
Wohnort: Niederösterreich
Kontaktdaten:

Beitrag 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
Antworten