Problem: Snake Spiel Kolisionsberehnung und Steuerung Hilfe



  • 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



  • sry die richtung lässt sich verändern, aber nicht so wie ich das will, sondern viel zu ruckelich.



  • *schlag vor den kopf*

    ich idiot!!!!!!!!!!!

    ich muss doch einfach den faktor mit dem ich die grad multipliziere niedriger machen........

    ein prob bleibt aber noch: alle schlangenteile sind auf mehr oder weniger der selben stelle warum?



  • LOL

    tbVector3

    Du arbeitest mit der Tribase? 😃

    BackToTopic:

    m_fRotation += g_pfButtons[TB_KEY_RIGHT] * 30 * fTime;
        m_fRotation -= g_pfButtons[TB_KEY_LEFT] * 30 * fTime;
    

    Das ist schon sehr komisch.

    ich würde das eher so machen:

    if (g_pfButtons[TB_KEY_RIGHT])
        m_fRotation += 90.0f;
    if (g_pfButtons[TB_KEY_LEFT])
        m_fRotation -= 90.0f;
    

    Hier brauchst du fTime eigentlich nicht, da du ja keine gleichmässige Rotation haben willst, sondern eine "entweder rauf, runter, links, oder rechts" - Schaltung. (OK. Wäre wahrscheinlich mit vector(1,0), (-1,0) (0,1), (0,-1) auch gegangen, aber jetzt kannst du relativ einfach eine Erweitreung für das Spiel schreiben, nämlich die Möglichkeit dich schräg zu bewegen..)

    ein prob bleibt aber noch: alle schlangenteile sind auf mehr oder weniger der selben stelle warum?

    Du hast ev. einen zu gerngen Abstand zwishcen den Teilen?!


Anmelden zum Antworten