Pixelgenaue Kollisionsabfrage mit SDL_collide



  • Hallo, ich möchte mit SDL_collide gerne für mein Spiel eine pixelgenaue Kollisionsabfrage realisieren, bekomme es jedoch nicht hin. Dazu erstmal ein paar Erläuterungen.
    Mein Spiel ist ein Weltraumspiel in dem man ein Raumschiff steuert welches sich am unteren Bildschirmrand befindet. Von oben kommen Asteroiden geflogen denen der Spieler möglicht ausweichen sollte bzw. versuchen sollte sie abzuschießen.
    Ich möchte nun gerne die Kollisionabfrage zwischen Raumschiff und Asteroiden pixelgenau haben. Dazu stellt SDL_collide eine Funktion namens SDL_CollidePixel zur Verfügung. Diese erwartet 6 Parameter: Die beiden Sprites der zu untersuchenden Objekte, sowie deren x und y Koordinate auf dem Bildschirm.
    Da die Asteroiden und der Player animiert sind und alle Animationsphasen des Players und der Asteroiden sich jeweils in einer Bitmap befinden, habe ich mir gedacht, ich schreibe eine Funktion die alle Animationsphasen in einem SDL_Surface Array speichert:

    void CGame::GetSurfaces()
    {
    	SDL_Rect Rect;
    	int i, j;
    
    	Rect.w = 64; //Bilder haben alle das Format 64x64
    	Rect.h = 64;
    
    	for(i = 0;i<10;i++)
    	{
    		Rect.x = i * 64; // Player.bmp besteht aus 10 nebeneinanderliegenden Bildern
    		Rect.y = 0;
    		SDL_BlitSurface(m_pSpritePlayerCol, &Rect, &m_SpritePlayer[i], NULL); //m_pSpritePlayerCol behinaltet die Komplette Player Bitmap
    	}
    
    	for(j = 0;j<20;j++)
    	{ //Asteroid.bmp besteht aus 10 Bildern in Reihe 1 und 10 Bildern in Reihe 2
    		if(j<10)
    		{
    			Rect.x = j *64;
    			Rect.y = 0;
    		}
    		else
    		{
    			Rect.x = (j-10)*64;
    			Rect.y = 64;
    		}
    
    		SDL_BlitSurface(m_pSpriteAsteroidCol, &Rect, &m_SpriteAsteroid[j], NULL); // m_pSpriteAsteroidCol beinhaltet die komplette Asteroid Bitmap
    	}
    }
    

    Der Aufruf der Funktion SDL_CollidePixel sieht bei mir folgendermaßen aus:

    if(SDL_CollidePixel(&m_SpritePlayer[m_pPlayer->GetAnimPhase()],RectPlayer.x,RectPlayer.y , &m_SpriteAsteroid[ItAsteroid->GetAnimPhase()],RectAsteroid.x,RectAsteroid.y) != 0)
    

    Wenn ich das Programm nun starte dann findet keine Kollisionsabfrage statt und die Asteroiden fliegen einfach durch das Raumschiff durch.

    Hat jemand eine Idee was ich falsch mache???



  • Pixelgenaue Kollisionsabfrage ist wohl so ungefähr die nächste Geisel der Menschheit.

    Bye, TGGC (Fakten)



  • Das heisst?



  • TGGC schrieb:

    Pixelgenaue Kollisionsabfrage ist wohl so ungefähr die nächste Geisel der Menschheit.

    Bye, TGGC (Fakten)

    Eher Geißel. 😉



  • Dark Gangster schrieb:

    Das heisst?

    Das ich 'nen Druckfehler gemacht hab.

    Die Argumente darüber wurden ja bereits oft genug ausgetauscht.

    Bye, TGGC (Fakten)



  • TGGC schrieb:

    Dark Gangster schrieb:

    Das heisst?

    Das ich 'nen Druckfehler gemacht hab.

    Die Argumente darüber wurden ja bereits oft genug ausgetauscht.

    Bye, TGGC (Fakten)

    Aber wenn es eine Libary gibt die diese Funktion anbietet und die noch dazu auf der offiziellen Seite der SDL vertreten ist, so muss diese doch funktionieren.



  • Pixelgenaue Kollisionsabfrage funktioniert nur unter heute nicht mehr akzeptablen Voraussetzungen hinreichend genau. Egal wer es in welcher Lib implementiert.

    Bye, TGGC (Fakten)



  • Dark Gangster schrieb:

    Aber wenn es eine Libary gibt die diese Funktion anbietet und die noch dazu auf der offiziellen Seite der SDL vertreten ist, so muss diese doch funktionieren.

    Da kann jeder seine LIB eintragen. Mann muss nur ein Account anlegen.


Anmelden zum Antworten