Problem: Snake Spiel Kolisionsberehnung und Steuerung Hilfe



  • 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?!



  • Du arbeitest mit der Tribase? 😃

    ja hab das buch von David Scherfgen grade durch und Snake ist jetzt mein erstes selbstentwickeltes Spiel.

    Hier brauchst du fTime eigentlich nicht, da du ja keine gleichmässige Rotation haben willst, sondern eine "entweder rauf, runter, links, oder rechts" - Schaltung.

    dann habe ich mich missverständlich ausgedrückt. Ich wollte sehrwohl gleichmäßige Rotation

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

    ja und nein ich hatte nen denkfehler kannste mir villeicht helfen ich krig das net hin.



  • Aso.. Dann zeig mal aktuellen Code her. Und bitte einen genaueren Fehlerbeschreib..



  • #define MAX_TAILS 256
    
    // Die Klasse für die Schlange
    class CSnakePlayer
    {
    public:
    	// Variablen
    	tbVector3		m_vPos[MAX_TAILS];					// Speichert die Position jedes Teils der schlange
    	tbVector3		m_vVelocity;						// Speichert die Geschwindigkeit des Kopfes
    
    	bool			m_bExist[MAX_TAILS];				// Speichert welche Schwanzabschnitte existieren
    	bool			m_bCrashed;							// Ist die Schlange gegen sich oder eine Wand gelaufen?
    
    	int				m_iNum;								// Speichert die Teile der Schlange
    	float			m_fRotation;						// Speichert die Rotation des Kopfes zur berechnung von m_vVelocity
    
    	// Methoden
    	tbResult		Init();								// Initialisiert die Schlange
    	tbResult		Move(float fTime);					// Bewegt die Schlange
    	tbResult		Render(float fTime);				// Rendert die Schlange
    	tbResult		CreateNewTail();					// Erstellt einen neuen Schwanzabschnitt
    
    	CSnakePlayer() {for(int i = 0; i < MAX_TAILS; i++) m_bExist[i] = false; m_bCrashed = false; m_iNum = 0;}	// Konstruktor
    };
    

    Die Deklaration der kritischen methoden:

    tbResult CSnakePlayer::Init()
    {
    	// Kopf an Position setzten
    	m_vPos[0] = tbVector3(2.5f, 0.85f, 0.0f);
    	m_iNum++;
    
    	// Richtung einstellen
    	m_fRotation = 90.0f;
    
    	// 4 Schwanzabschnitte setzten
    	for(int i = 1; i < 5; i++)
    	{
    		m_bExist[i] = true;
    		m_vPos[i] = tbVector3(1.5f - 1.7f * i, 0.75f, 0.0f);
    		m_iNum++;
    	}
    
    	return TB_OK;
    }
    

    zum initialisieren der schlange mit ihren segmenten

    tbResult CSnakePlayer::Move(float fTime)
    {
    	// Wenn nicht schon "gecrashd"
    	if(!m_bCrashed)
    	{
    		// überprüfen ob die Schlange sich selbst berührt hat    
    		for(int i = 3; i < m_iNum; i++)
    		{
    			if(tbVector3LengthSq(m_vPos[0] - m_vPos[i]) <= ( 0.85f + 0.75f ) * ( 0.85f + 0.75f ))
    			{
    				// Sound abspielen
    				g_pSnake->m_pSound[4]->PlayNextBuffer();
    
    				// m_bcrashed auf true setzten
    				m_bCrashed = true;      // zurzeit automatisch weil alle schlangensegmente die gleichen koordinaten haben
    				break;
    			}
    		}
    
    		// überprüfen ob die Schlange eine Wand berührt hat
    		if((m_vPos[0].x + 0.85f > 20.0f) || (m_vPos[0].x - 0.85f < -20.0f) || (m_vPos[0].z + 0.85f > 15.0f) || (m_vPos[0].z - 0.85 < -20.0f))
    		{
    			// Sound abspielen
    			g_pSnake->m_pSound[3]->PlayNextBuffer();
    
    			// m_bcrashed auf true setzten
    			m_bCrashed = true;
    		}
    	}
    
    	// Rotation durch Tastendruck verändern
    	m_fRotation -= g_pfButtons[TB_KEY_RIGHT] * 2.5f * fTime;
    	m_fRotation += g_pfButtons[TB_KEY_LEFT] * 2.5f * fTime;
    
    	// maximum 360° danach wieder 0°
    	if(m_fRotation > 360) m_fRotation = 0;
    	if(m_fRotation < 0) m_fRotation = 360;
    
    	m_vVelocity = tbVector3(cosf(m_fRotation), 0.0f, sinf(m_fRotation)) * 1 * 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;
    
    	return TB_OK;
    }
    

    der fehler: nach dem ersten frame haben alle segmente der Schlange die gleichen koordinaten


Anmelden zum Antworten