2D Kollision



  • Also ich verzeifeln grad an einer 2D Kollision,
    die kollision mit den schüssen und den asteoriden klapt wudnerbar.
    die schüsse kommen von unten und die asteroiden von oben.

    nur will ich aber abfragen ob die asteroiden das raumschiff treffen.
    doch leider funzt es nicht so wie ich es will:

    if(RectShot.y < RectAsteroid.y + RectAsteroid.h &&
    				RectShot.y + RectShot.h > RectAsteroid.y &&
    				RectShot.x < RectAsteroid.x + RectAsteroid.w &&
    				RectShot.x + RectShot.w > RectAsteroid.x)
    			{
    

    das ist der code für die schüsse und die asteroiden aber ich bekommst
    nicht hin für das raumschiff.

    das raumschiff selber kann man steuern und damit rumfliegen in alle richtungen.



  • Dj_KoLoGe schrieb:

    Also ich verzeifeln grad an einer 2D Kollision, [...]
    nur will ich aber abfragen ob die asteroiden das raumschiff treffen.
    doch leider funzt es nicht so wie ich es will:

    if(    RectShot.y              < RectAsteroid.y + RectAsteroid.h     /* Schuss unterer Rand unterhalb Asteriod oberer Rand */
        && RectShot.y + RectShot.h > RectAsteroid.y                      /* Schuss oberer  Rand über Asteriod unterer Rand */
        && RectShot.x              < RectAsteroid.x + RectAsteroid.w     /* Schuss linker  Rand links von Asteriod rechter Rand */
        && RectShot.x + RectShot.w > RectAsteroid.x )                    /* Schuss rechter Rand rechts von Asteriod linker Rand */
    

    Wie kann der Schuss mit dem unteren Rand unterhalb des Asteriods sein && gleichzeitig der obere Rand oberhalb des Asteriods?
    Kann das passieren? Ist das das, was Du abfragen möchtest?



  • also das klapt alles einwandfrei. ich hab diesen code aus dem buch was ich habe übernommen,
    aber habe auch wie beschrieben mir mla 2 papiere genommen und das angeguckt und ist ja eig ganz logisch und nur so funzt es halt.

    dann hab ich das gleiche nochmal probiert mit den papieren mit den asteroiden aber es klapt leider nicht 😞



  • Dj_KoLoGe schrieb:

    also das klapt alles einwandfrei. ich hab diesen code aus dem buch was ich habe übernommen,
    aber habe auch wie beschrieben mir mla 2 papiere genommen und das angeguckt und ist ja eig ganz logisch und nur so funzt es halt.

    dann hab ich das gleiche nochmal probiert mit den papieren mit den asteroiden aber es klapt leider nicht 😞

    Meine Klassen haben in der Regel eine Methode 'ToString()', so dass ich sie einfach auf die Standardkonsole ausgeben kann.
    Gib die Werte der Klassen mal aus und prüfe, ob die Werte so sind, wie Du sie erwartest...



  • ihc glaube es leigt vllt eher an meinem restlichen code,
    da wennn ich RectSHot einfach durch die RectPlayer ersetze,
    dann is das ja im pürinzip genau das gleiche der spieler kommt von unten
    und die asteroiden von oben.

    // CheckCollisions
    //
    void CGame::CheckCollisions()
    {
    	// Schussliste des Spielers holen
    	list<CShot> *ShotList = m_pPlayer->GetShotList();
    
    	// Iteratoren für Asteroiden- und Schussliste
    	list<CAsteroid>::iterator ItAsteroid = m_AsteroidList.begin();
    	list<CShot>::iterator ItShot;
    
    	// Rects für Asteroiden, Schüsse und Spieler
    	SDL_Rect RectAsteroid;
    	SDL_Rect RectShot;
            SDL_Rect RectPlayer;
    
    	// Alle Asteroiden durchlaufen
    	while(ItAsteroid != m_AsteroidList.end())
    	{
    		// Rect des Asteroiden holen
    		RectAsteroid = ItAsteroid->GetRect();
    
                    // Rect des Spielers holen
                    RectPlayer = m_pPlayer->GetRect();
    
                    // Kollision vom Spieler und den Asteroiden
                    if(RectPlayer .y < RectAsteroid.y + RectAsteroid.h &&
    		       RectPlayer .y + RectPlayer .h > RectAsteroid.y &&
    		       RectPlayer .x < RectAsteroid.x + RectAsteroid.w &&
    		       RectPlayer .x + RectPlayer .w > RectAsteroid.x)
    		{
                        m_pPlayer->Reset();
                    }
    
    		// Alle Schüsse durchlaufen
    		for(ItShot = ShotList->begin(); 
    		ItShot != ShotList->end();
    		++ItShot)
    		{
    			// Rect des Schusses holen
    			RectShot = ItShot->GetRect();
    
    			// Überschneiden sich die Rects?
    			if(RectShot.y < RectAsteroid.y + RectAsteroid.h &&
    				RectShot.y + RectShot.h > RectAsteroid.y &&
    				RectShot.x < RectAsteroid.x + RectAsteroid.w &&
    				RectShot.x + RectShot.w > RectAsteroid.x)
    			{
    				// Ja, also gab es eine Kollision. Somit Schuss und
    				// Asteroid deaktivieren
    				ItAsteroid->SetAlive(false);
    				ItShot->SetAlive(false);
    
    				// Punkte erhöhen
    				m_pPlayer->Score();
    			}
    		}
    
    		// Asteroid löschen, falls deaktiviert
    		if(ItAsteroid->IsAlive())
    			ItAsteroid++;
    		else
    			ItAsteroid = m_AsteroidList.erase(ItAsteroid);
    	}
    }
    


  • Hallo

    Hast du das von Kalista? Da hatte ich mal das gleiche Problem und das lag daran, dass der erste "Asteroid" nicht sichtbar ist und man immer mit diesem kolidiert und deswegen an der Kollisionsabfrage rumspielt. Versuch mal mit dem Raumschiff nicht in der Mitte zu bleiben, sondern sofort nach Spielstart nach links oder rechts auszuweichen.

    chrische



  • Oder mach das Schiff nicht gleich tot wenn du kollidierst, sondern gib bloss irgendeine "Meldung" aus, z.B. nen Sound. Oder nen Pixel in einem Eck denn du Rot machst wenn das Schiff in dem Frame mit irgendwas kollidiert ist, und sonst schwarz. Bloss als Beispiel. Irgendsowas.


Anmelden zum Antworten