Kollisionsproblemchen

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

garret

Betreff: Kollisionsproblemchen

BeitragMi, Jun 08, 2005 14:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich wollte ein kleines Multiplayer-Spielchen für nebenbei machen, wo man mit seiner Figur springen kann und die anderen abschießen muss.
Die Karte ist aus "Tiles" (im Moment noch Rect) aufgebaut, die in einem Feld gespeichert sind (feld()).

Scheinbar bin ich zu dumm für die Kollisionsabfrage...

Ich will anhand der Koordinaten der Spieler und des Feldes prüfen, ob eine Kollision vorliegt und die Spielfigur soll sich dann nicht mehr in diese Richtung bewegen können. Die einzelnen Kcheln sind 4*4, die Spielerfigur ist 12*16 Pixel groß. Die Figur bleibt zwar auf den Blöcken stehen, kann aber an der Seite durch gehen. kx() und ky() sollten die Kollision dabei vereinfachen, vielleicht kann ich die ja dann weglassen?!


Dazu mein begonnener Code:

Code: [AUSKLAPPEN]

Graphics 800,600,24,3:SetBuffer BackBuffer()
Dim feld(174,149)

For schleife=0 To 40;Beispiel-Level
   feld(40+schleife,50)=1
   feld(50+schleife,50+schleife)=1
Next

Const maxplayer=1;Anzahl der Spieler
Const g=1;Gravitation
Dim player(maxplayer),x(maxplayer),y(maxplayer),kx(maxplayer,1),ky(maxplayer)

x(1)=200:y(1)=10:x(0)=300:y(0)=10

Repeat:Cls

;Zeichnen des Feldes
Color 127,127,127
For z=0 To 149
   For s=0 To 174
   If feld(s,z)=1 Rect s*4,z*4,4,4
   Next
Next



;Kollisionen
For sp=0 To 0
kx(sp,0)=Floor(x(sp)/4);Kollisionskoordinaten
kx(sp,1)=Ceil((x(sp)+12)/4)
ky(sp)=Ceil((y(sp)+16)/4)
If feld(kx(sp,0),ky(sp))<>1 And feld(kx(sp,1),ky(sp))<>1 y(sp)=y(sp)+g
If KeyDown(203) x(sp)=x(sp)-1
If KeyDown(205) x(sp)=x(sp)+1




;Begrenzungen
If x(sp)<5 x(sp)=5
If x(sp)>684 x(sp)=684
If y(xp)>580 y(sp)=580

Color 255,255,255
Rect x(sp),y(sp),12,16
Next
Flip:Until KeyHit(1):End

>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht)
 

BIG BUG

BeitragMi, Jun 08, 2005 22:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier mal ein Beispiel wie Sliding-Kollision funktioniert. Sieht am Anfang vielleicht nach mehr Arbeit aus, ist aber leicht zu verstehen, flexibel erweiterbar und funktioniert auch mit Floatwerten.

Code: [AUSKLAPPEN]

Graphics 800,600,24,3:SetBuffer BackBuffer()
 
Const c_map_w    = 174
Const c_map_h    = 149
Const c_tile     = 4
Const c_player_w = 3
Const c_player_h = 4


Dim feld(c_map_w,c_map_h)

For schleife=0 To 40;Beispiel-Level
feld(40+schleife,50)=1
feld(50+schleife,50+schleife)=1
feld(90, 30+schleife) = 1
Next

Const maxplayer=1;Anzahl der Spieler
Const g=1;Gravitation
Dim player(maxplayer),x(maxplayer),y(maxplayer),x_old(maxplayer),y_old(maxplayer)

x(1)=200:y(1)=10:x(0)=300:y(0)=10

Repeat:Cls


;Zeichnen des Feldes
Color 127,127,127
For z=0 To c_map_h
For s=0 To c_map_w
If feld(s,z)=1 Rect s*c_tile,z*c_tile,c_tile,c_tile
Next
Next

;alte Koordinaten sichern
x_old(sp) = x(sp)
y_old(sp) = y(sp)

;Bewegung durchführen
y(sp)=y(sp)+g

If KeyDown(203) x(sp)=x(sp)-1
If KeyDown(205) x(sp)=x(sp)+1

;Kollisionen
If coll(x(sp),y(sp),sp) Then
   If coll(x_old(sp),y(sp),sp) Then y(sp) = y_old(sp)
   If coll(x(sp),y_old(sp),sp) Then x(sp) = x_old(sp)
EndIf



Color 255,255,255
Rect x(sp),y(sp),12,16


Flip:Until KeyHit(1):End


Function coll(x,y,sp)

   Local map_x, map_y, s_x, s_y, e_x, e_y

; Begrenzungen
   If x<5   Then Return 1
   If x>684 Then Return 1
   If y>580 Then Return 1

; Start/Endepunkte fuer Abfrage
   s_x = x / c_tile
   s_y = y / c_tile
   e_x = s_x + c_player_w-1
   e_y = s_y + c_player_h-1

   ;Wenn Spieler nicht genau auf Tile steht,
   ;muss logischerweise ein Tile mehr geprueft werden   
   If x Mod c_tile Then e_x = e_x + 1
   If y Mod c_tile Then e_y = e_y + 1

; Feldgroesse checken
   If s_x < 0 Or e_x > c_map_w Return 1
   If s_y < 0 Or e_y > c_map_h Return 1

; auf Kollision pruefen
   For map_x = s_x To e_x
      For map_y = s_y To e_y
         If feld(map_x,map_y) = 1 Then Return 1
      Next
   Next

End Function
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)

garret

Betreff: Thx

BeitragDo, Jun 09, 2005 8:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke sehr, genau so wollte ich das auch haben. An Mod habe ich gar nicht gedacht...
>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht)

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group