Kollisionsproblemchen
Übersicht
BlitzBasic
Allgemein|
|
garretBetreff: Kollisionsproblemchen |
Antworten mit Zitat |
|---|---|---|
|
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 |
Antworten mit Zitat |
|
|---|---|---|
|
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) |
||
|
|
garretBetreff: Thx |
Antworten mit Zitat |
|---|---|---|
| Danke sehr, genau so wollte ich das auch haben. An Mod habe ich gar nicht gedacht... | ||
| >>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht) | ||
Übersicht
BlitzBasic
Allgemein
Powered by phpBB © 2001 - 2006, phpBB Group
