Problem: Snake Spiel Kolisionsberehnung und Steuerung Hilfe



  • Hi,

    kann mir einer helfen?
    folgendes Problem: Ich programmiere ein Snake 3D Spiel, weiß aber nicht wie ich die kollision der Schlange mit dem Futter machen soll.
    Das futter ist rund und ich habe die Koordinaten des Mittelpunkts, der Kopf ist ebenfalls rund und ich habe den Mittelpunkt.
    Außerdem kann die Schlange das Futter von jeder seite, also nicht nur von oben, unten, links und rechts erreichen.

    Wie kann ich nun eine Kolosionsberechnung machen???

    schonmal thx im vor raus.

    Mfg Yazoo



  • Du berechnest den Abstand Mittelpunkt Futter <-> Mittelpunkt Kopf. Wenn der kleiner ist als Radius Futter + Radius Kopf frisst es die schlange.



  • d = sqrt(((p1x - p2x) * (p1x - p2x)) + ((p1y - p2y) * (p1y - p2y)) + ((p1z - p2z) * (p1z - p2z)));
    


  • way schrieb:

    d = sqrt(((p1x - p2x) * (p1x - p2x)) + ((p1y - p2y) * (p1y - p2y)) + ((p1z - p2z) * (p1z - p2z)));
    

    noch hässlicher kann mans nicht schreiben oder? ausserdem packt man das in vektor-klassen



  • way schrieb:

    d = sqrt(((p1x - p2x) * (p1x - p2x)) + ((p1y - p2y) * (p1y - p2y)) + ((p1z - p2z) * (p1z - p2z)));
    

    wofür ist diese berechnung jetzt genau? Den Radius vom Schlangen kopf und vom futter habe ich bereits.



  • Yazoo schrieb:

    way schrieb:

    d = sqrt(((p1x - p2x) * (p1x - p2x)) + ((p1y - p2y) * (p1y - p2y)) + ((p1z - p2z) * (p1z - p2z)));
    

    wofür ist diese berechnung jetzt genau? Den Radius vom Schlangen kopf und vom futter habe ich bereits.

    Das ist der Pythagoras. Abstandsbestimmung 2er Punkte.

    Du rechnest die beiden Mittelpunkte: m1 - m2 Dann hast du den vektor der von m2 auf m1 zeigt, wenn du von dem dann die Länge brechnest hast du den Abstand:

    vector vd = m2 - m1;
    sqrt( vd.x*vd.x + vd.y*vd.y );

    Analog im R3 (3dimensional)



  • also das Ergebnis deiner Wurzel ist der Abstand.... wenn der dann kleiner ist als die beiden radien addiert frisst die schlange ...

    P.S: In welcher Klasse bist du?



  • Wie bereits erwähnt wurde, lohnen sich hier der Einsatz von Vektorklassen und Funktionen für den Betrag enorm. Sonst hat man früher oder später ein Riesengefrickel, spätestens wenn man einige Monate danach mal was ändern will.



  • aha, vielen dank!

    ich habe vektor klassen und habe auch nachgeguckt, die formel wie sie way beschrieben hat war nicht drin, wolh aber ein - operator und die Längenberechnung, was zusammen ja das gleiche ist.

    vielen vielen dank



  • mist gleich tut sich das nächst problem auf ( tut mir leid ist mein erstes spiel und ich bin noch nichso bewandert in vectorberechnung )

    mit was für einer berechnung kann ich folgendes machen: Ich will das sich die schlange mit einer konstanten geschwindigkeit nach vorne bewegt.
    Anfangs kein problem ich sage einfach der geschwindigkeitswariable: vVelocity(1, 0, 0); nach oben, aber wenn der spieler die pfeil nach rechts/links taste drückt soll die schlange natürlich nach rechts/link.
    Ich möchte kleinere schritte als nur ganzzahlen zulassen wie auf den alten nokia handys, ich will das sich die schlange, solange der spieler drückt 30° nach rechts/links bewegt wie kann ich es anstellen, das die schlange beim drücken immer egal in welcher position sie ist 30° nach rechts/links geht ohne die geschwindigkeit zu verändern.

    Vielleicht stell ich mir das auch einfach zu schwer vor, bitte helft mir.

    PS: Geschwindigkeit und drehwinkel muss ich noch ausprobieren was optimal ist sollten also wariabel sein.



  • Ganz einfach. Mach dir Richtung in Grad und dann berechne einfach die Vektorrichtung jedesmal neu. Dann kannst du einfach die Gradzahl erhöhen und der Rest geht von alleine.

    z.B:

    float rotation = 45.0f;
    
    float dirx = cos (rotation);
    float diry = sin (rotation);
    

    Edit:
    Ich empfehle dir einen Richtungsvektor zu haben + die Geschwindigkeit. Und dann beim Updaten einfach noch miteinander multiplizieren. Das ist besser, als die Geschwindigkeit mit der Richtung zu mischen. Sofern der Richtungsvektor normalisiert ist (länge 1 ), dann stimmt das.
    Beachte bei der Methode oben musst du nichts mehr normalisieren, weil cos/sin im Einheitskreis arbeiten.



  • vielen dank ich habs mir viel komplizierter vorgestellt



  • da müsste ja dann ein vektor der länge 1 rauskommen wo ich die geschwindigkeit einfach reinmultipliziere oder?



  • Yazoo schrieb:

    da müsste ja dann ein vektor der länge 1 rauskommen wo ich die geschwindigkeit einfach reinmultipliziere oder?

    Genau.



  • ok danke.

    nächstes prob: wie kann ich es anstellen das sich die schwanzabschnitte in der gleichen Bahn wie der Kopf bewegen?
    Ich dachte ich habe die lösung aber die ist stuss: ich dachte ich kann einfach in jedem frame die position des z.B. 6. schwanzabschnittes auf die des 5. usw. setzen aber das funtzt natürlich net.

    Meine neue idee meine Vektor klasse kann zwischen 2 koordinaten linear interpolieren, nur was müsste ich als interpolationsfaktor ( von 0.0f bis 1.0f ) angeben?



  • Da kommst du nicht drum herum die die Position des Kopfes irgendwie zu merken.
    Mach einen Container mit den Daten, wo der Kopf war und dann zähl da irgendwie immer eins rauf und der n-te Anhängsel sollte dann dort sein, wo der Kopf vor n-Schritten war.



  • könnte mir das jemand bitte etwas genauer beschreiben? ich blick das nich



  • Kopf: Position 2/3
    o1: 1/3
    o2: 0/3

    -|-|-|-|-|-|-|-
    -|-|-|-|-|-|-|-
    -|-|-|-|-|-|-|-
    o|o|S|-|-|-|-|-
    -|-|-|-|-|-|-|-
    

    Kopf: Position 3/3
    o1: 2/3
    o2: 1/3

    -|-|-|-|-|-|-|-
    -|-|-|-|-|-|-|-
    -|-|-|-|-|-|-|-
    -|o|o|S|-|-|-|-
    -|-|-|-|-|-|-|-
    

    Kopf: Position 3/2
    o1: 3/3
    o2: 2/3

    -|-|-|-|-|-|-|-
    -|-|-|-|-|-|-|-
    -|-|-|S|-|-|-|-
    -|-|o|o|-|-|-|-
    -|-|-|-|-|-|-|-
    

    Fällt dir was auf?
    Das ist so typisch für eine Liste. Du musst lediglich einen Zeiger auf das "vordere" Element speichern. Und in jedem Element die aktuelle Position, sowie die letzte Position. Beim einem Schritt füllst die letzte Position mit der aktuellen und in die aktuelle füllst du die letzte des nächsten Element.



  • vielen vielen dank, ich stand wirklich aufm schlauch und habe mal wieder viel zu kompliziert gedacht.




Anmelden zum Antworten