Problem: Snake Spiel Kolisionsberehnung und Steuerung Hilfe



  • 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.





  • das hilft mir nicht viel ich kenne mich nicht mit java / java script aus
    trotzdem danke



  • endlich ist der code zusammen und ich kann kompilieren...
    ich glaube das mit der rotation und velocity funtzt net.
    kannste mir das ma bidde also code geben?



  • Hmm. Zeig mal was du machst. Das funktioniert sonst so. 😉



  • // Rotation durch Tastendruck verändern
    	m_fRotation += g_pfButtons[TB_KEY_RIGHT] * 30 * fTime;
    	m_fRotation -= g_pfButtons[TB_KEY_LEFT] * 30 * fTime;
    
    	// maximum 360° danach wieder 0° und umgekehrt
    	if(m_fRotation > 360) m_fRotation = 0;
    	if(m_fRotation < 0) m_fRotation = 360;
    
    	m_vVelocity = tbVector3(cosf(DEG_TO_RAD(m_fRotation)), 0.0f, DEG_TO_RAD(sinf(m_fRotation))) * 50 * fTime;
    
    	// Schwanzteile bewegen
    	for(int i = m_iNum; i > 0; i--)
    	{
    		m_vPos[i] = m_vPos[i - 1];
    	}
    
    	// Kopf bewegen
    	m_vPos[0] += m_vVelocity;
    

    am anfang wird m_fRotation auf 90 gesetzt, damit die Schlange zu anfang nach rechts läuft, wenn man von oben draf guckt.

    die schlange bewegt sich nicht und die richtung lässt sich nicht verändern


Anmelden zum Antworten