Animationen in Sdl



  • Hallo, hat sich schon mal jemand mit dem erstellen von Animierten Bildern in SDL befasst bzw. gibt es da eine Funktionssammlung o. ähnliches ?

    Ich habs zwar schon selbst probiert, aber ich schaff es irgendwie nicht.

    EDIT: Um zu zeigen, dass ich es wenigstens versucht habe, hier der Code, in der Hoffnung, dass jemand die Fehler entdeckt 😉

    header :

    struct image
    {
    	SDL_Surface *img;
    	SDL_Rect rct;
    };
    
    class animimage
    {
    private :
    	image *frame;
    public:
    	void load(const char *path,int size,int number);
    	void draw(int x,int y,int number);
    };
    

    .cpp

    void animimage::load(const char *path,int size,int number)
    {
    	//Das Bild wird geladen und konvertiert
    	SDL_Surface *temp = SDL_LoadBMP(path);
    	SDL_Surface *temp2 = SDL_DisplayFormat(temp);
    	//Das Array, in dem die einzelnen Bilder gespeichert werden
        frame = new image[number];
    
    	//Das Rechteck, aus dem kopiert wird
    	SDL_Rect rect;
    	rect.x = 0;
    	rect.y = 0;
    	rect.w = 0;
    	rect.h = 0;
        //Eine Schleife kopiert in jedes Frame einen Ausschnitt des Ursprünglichen Bildes 
    	for (int i=0;i<number;i++)
    	{
    		frame[i].rct.x=0;
    		frame[i].rct.y=0;
    		frame[i].rct.w=size;
    		frame[i].rct.h=size;
    		//der einzelne ausschnitt des Bildes wird in die einzelnen Frames kopiert
    		SDL_BlitSurface(temp2,&rect,frame[i].img,&frame[i].rct);
    		rect.x += size;		
    	}	
    }
    
    void animimage::draw(int x,int y,int number)
    {
    	frame[number].rct.x = x;
    	frame[number].rct.y = y;
            //Das  Bild wird auf den Bildschirm geblittet
    	SDL_BlitSurface(frame[number].img,NULL,screen,&frame[number].rct);
    }
    


  • Was mir aufgefallen ist, dass der SDL_Surface Pointer deines image-structs nicht initialisiert wurde. Schreib noch einen Konstruktor für dein struct oder eine init-Funktion, du kannst dir auch mal dieses kleine SDL-Testprogrämmchen hier anschauen:http://www.finaltactics.de/public/sdltest.zip



  • lesson3 bitte beachten 🙂

    sag obs geklappt hat :xmas1:

    http://cone3d.gamedev.net/cgi-bin/index.pl?page=tutorials/gfxsdl/index



  • regnad schrieb:

    Was mir aufgefallen ist, dass der SDL_Surface Pointer deines image-structs nicht initialisiert wurde. [/url]

    Wie soll ich ihn intitialisieren ? image = NULL ?

    Danke für die beiden Links, ich bin gerade dabei, sie durchzusehen 🙂



  • sbrog schrieb:

    Wie soll ich ihn intitialisieren ? image = NULL ?

    Du Depp 😃 , natürlich nicht mit NULL sondern mit etwas sinnvollem! Bislang zeigen deine Pointer ins Nirvana!!! Versuchs mal mit SDL_CreateSurface oder wie die Funktion heißt.



  • EDIT: Ich hab es nun doch hinbekommen, meine fehler waren, dass ich das Bild nicht richtig initialisiert habe, und dass ich bei BlitSurface die falschen Rects verwendet habe. Danke für die Mühe, die ihr euch deswegen gemacht habt. 😃

    header :

    #ifndef _GFX_H_
    #define _GFX_H_
    
    #include <sdl.h>
    
    bool init_SDL(int height,int width,bool fullscreen);
    
    struct image
    {
    	SDL_Surface *img;
    	SDL_Rect rct;
    };
    
    class animimage
    {
    private :
    	image *frame;
    public:
    	void load(const char *path,int width,int height,int number);
    	void draw(int x,int y,int number);
    };
    
    #endif
    

    .cpp

    #include "gfx.h"
    
    void animimage::load(const char *path,int width,int height,int number)
    {
    	//Das Bild wird geladen und konvertiert
    	SDL_Surface *temp = SDL_LoadBMP(path);
    	SDL_Surface *temp2 = SDL_DisplayFormat(temp);
    	//Das Array, in dem die einzelnen Bilder gespeichert werden
        frame = new image[number];
    
    	SDL_Rect rect;
    	for(int i =0;i<number;i++)
    	{
    		frame[i].img = SDL_CreateRGBSurface(SDL_HWSURFACE,width,height,24,0,0,0,0);
    		rect.x = i*width;
    		rect.y = 0;
    		rect.w = width;
    		rect.h = height;
    		SDL_BlitSurface(temp2,&rect,frame[i].img,NULL);
    	}		
    }
    
    void animimage::draw(int x,int y,int number)
    {
        frame[number].rct.x = x;
        frame[number].rct.y = y;
            //Das  Bild wird auf den Bildschirm geblittet
        SDL_BlitSurface(frame[number].img,NULL,screen,&frame[number].rct);
    }
    

    was könnte man an dem Code noch weiter optimieren bzw. beschleunigen ? Ich bin für jede Hilfe dankbar. :xmas1:


Anmelden zum Antworten