Kollisionsabfragen in einem Jump'n'Run Spiel

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

BennyMB

Betreff: Kollisionsabfragen in einem Jump'n'Run Spiel

BeitragDo, Jul 04, 2013 18:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Leute,

Ich habe ein Problem in meinem Jump'n'Run Spiel, ich weiß nicht wie ich die Kollisionsabfragen machen soll...
Bisher hab ich es so gemacht, dass jedes level in einer datei abgespeichert werden soll, wo 1 z.B. für einen Festblock steht, 2 für eine Leerstelle usw.

Nun könnte ich es beim Links-Rechts Gehen so machen, dass ich teste ob das zu erreichende Feld eine Leerstelle is und sonst den Tastendruck ignoriere.

Doch wie mach ich das beim Sprung?

Danke im Vorraus!

euer BennyMB

BladeRunner

Moderator

BeitragDo, Jul 04, 2013 18:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Im Prinzip genauso: Jeden Durchlauf deiner Spielschleife überprüfst Du ob die Position nach der Bewegung in einem "Festteil" liegen würde. Wenn ja wird die Bewegung nur noch soweit ausgeführt dass die Figur nicht das neue Teil betritt. Damit landet der Spieler dann so nahe am Hindernis wie es geht.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Hubsi

BeitragDo, Jul 04, 2013 18:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Du wirst Dich im späteren Verlauf leichter tun wenn Du Leerfeldern eine 0 zuweist, das erstmal als Tip am Rande. Die Kollision löst man dann am besten mathematisch:

BlitzBasic: [AUSKLAPPEN]
; Ich nehme im Beispiel an das die Daten im Array map gespeichert sind
; und die Position der Spielfigur in px bzw. py
; sowie die Tiles 32x32 Pixel groß sind, ebenso die Spielfigur(en)

If map((px+32)/32,(py+16)/32)>0 Then
; Dein Code: Nicht weiter nach rechts laufen
EndIf


Das ganze funktioniert dann vom System her mit ein bisschen Zahlendrehen auch für links, oben und unten. Um die Position zu korrigieren weil das Männicken nach einem Sprung z.B. "im" Tile steht werden die Werte auf Mapteilung runtergebrochen und wieder hochgerechnet:

BlitzBasic: [AUSKLAPPEN]
tmp_int=(py+16)/32
py=tmp_int*32

Das hier ist jetzt für die Y-Achse gültig, funktioniert aber nach derselben Logik natürlich auch auf X.
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...
 

Silvio

BeitragMi, Jul 10, 2013 19:00
Antworten mit Zitat
Benutzer-Profile anzeigen
ich sitze am gleichen Problem. Meine Kollisionsabfrage ist auch so, dass ich den schaue, ob der nächste Punkt, den man erreichen würde, betretbar ist. Wenn ich aber nun von weiter oben runter Springe, dann wird die Geschwindigkeit und damit der einzelne Bewegungsschritt so groß, dass ich etwas über dem Boden lande, weil der letzte in dem Block führende Schritt verhindert wird. Dann wird gecheckt ob drunter Boden ist oder nicht und er fällt das kleine Stück noch runter. Ich komme nicht drauf, wie ich sozusagen eine perfekte Landung hinlegen kann. Also mir ist klar, der letzte Schritt darf nur so weit gehen, wie möglich, aber woher soll ich die Koordinate bekommen, wo der Block anfängt. Ich finde ja mit dieser Methode heraus, ob die angestrebte Position legitim ist:

BlitzBasic: [AUSKLAPPEN]

Function checkmap(x#,y#)
new_x = Int(Floor(x# / 24))
new_y = Int(Floor(y# / 24))
If new_x < 0 Or new_x >= map_width Or new_y >= 24 Then
Return 1
ElseIf new_y < 0 Then
Return 0
Else
If map(new_x,new_y,1) = 0 Then
Return 0
Else
Return 1
EndIf
EndIf
End Function


ich bekomme nur die Information, dass die Bewegung nicht möglich ist, aber nicht, bis wohin es möglich ist.

Xeres

Moderator

BeitragMi, Jul 10, 2013 19:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn die Geschwindigkeit größer wird, musst du Zwischenschritte berechnen, abhängig von der Größe des bewegten Objekts. Dann kann man selbst bei riesigen Geschwindigkeiten nicht durch einen sehr dünnen Boden fallen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Silvio

BeitragMi, Jul 10, 2013 19:13
Antworten mit Zitat
Benutzer-Profile anzeigen
ah an sowas hab ich noch nicht gedacht. Falls die Geschwindigkeit größer als 1 Pixel pro Schritt ist, teile ichs in soviele 1pixel Schritte auf, wie möglich + den Rest ggf. Hört sich logisch an. Mal sehen wie einfach sich das realisieren lässt.
 

Silvio

BeitragDo, Jul 11, 2013 3:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay es hat Stunden gedauert, weil etliche Bugs zu fixen waren, aber ich habe es endlich geschafft Very Happy
Perfekte Kollision, bei beliebiger Geschwindigkeit.
Wenn ich jetzt an meine allererste Jump&Run KollisionsMethode denke, dann muss ich lachen.
 

Eyes_Only

BeitragDo, Aug 01, 2013 8:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Silvio,

vielleicht kannst du uns an deiner Lösung teilhaben lassen? Very Happy
Ich arbeite auch gerade an einer Kollisionserkennung (und viele andere glaube ich auch Wink ).
Wäre schön, wenn du dein Ergebnis mit uns teilen würdest.

Dank dir vielmals.

TimBo

BeitragFr, Aug 02, 2013 1:20
Antworten mit Zitat
Benutzer-Profile anzeigen
deshalb werden in anderen Programmiersprachen standardmäßig mit Update() und Draw() Methoden gearbeitet. Die eine berechnet die Physik die andere ist zum Malen zuständig.

So kann man konstante 60FPS haben und dennoch die Physik 120 mal berechnen.
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group