SDL Klase erstellen (Anfänger)



  • Hallo ich bin Anfänger in sachen SDL, und wollte eine klasse erstellen mit der ich ein Bild auf der Oberfläche bewegen kann, allerdings ist bei mir noch irgendwo der wurm drin, un es gibt probleme beim ausführen des Programms.

    #ifndef _TUX_H_
    #define _TUX_H_
    
    #include <SDL.h>
    
    enum Richtung{
    	UP,
    	DOWN,
    	LEFT,
    	RIGHT
    };
    
    class Tux{
    	private:
    		SDL_Surface *screen, *image;
    		int posx;
    		int posy;
    		SDL_Rect dst;
    	public:
    		Tux(int x, int y, SDL_Surface *screen);
    		~Tux();
    		void draw();
    		void move(Richtung r);
    
    };
    
    #endif
    
    #include "Tux.h"
    
    Tux::Tux(int x, int y, SDL_Surface *screen){
    	posx = x;
    	posy = y;
    	this->screen = screen;
    	image = SDL_LoadBMP("tux.bmp");
    	if (image == NULL) {
    		printf("Can't load image of tux: %s\n", SDL_GetError());
    		//exit(1);
    	}
    	dst.w = image->w;
    	dst.h = image->h;
    }
    
    void Tux::draw()
    {
    	dst.x = posx;
    	dst.y = posy;
    	SDL_BlitSurface(image, NULL, screen, &dst);
    }
    
    void Tux::move(Richtung r){
    	switch(r)
    	{
    		case UP:
    			posy--;
    			break;
    		case DOWN:
    			posy++;
    			break;
    		case LEFT:
    			posx--;
    			break;
    		case RIGHT:
    			posx++;
    			break;
    	}
    }
    
    Tux::~Tux(){
    	SDL_FreeSurface(image);
    }
    

    irgendwas muss ich vergessen haben, und ich weiß nicht was.



  • Was für Probleme gibt es denn genau?

    Nur, dass es sich nicht bewegt?

    Rufst du deine Methode Tux.move() auch irgendwo auf bei Tastendruck oder so? 🙂



  • wenns was nützt, dann pack ich auch noch das Main hin, da is aber glaub ich nicht der Fehler.

    int main(int argc, char *argv[])
    {
    	SDL_Surface *screen;
    	SDL_Rect dstblue;
    	SDL_Event event;
    	Uint8 *keys;
    
    	Tux t(40,40,screen);
    
    	int done = 0;
    	if (SDL_Init(SDL_INIT_VIDEO) == -1) {
    		printf("Can't init SDL:  %s\n", SDL_GetError());
    		exit(1);
    	}
    	atexit(SDL_Quit);
    	screen = SDL_SetVideoMode(640, 480, 16, SDL_HWSURFACE | SDL_DOUBLEBUF);
    	SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 255));
    	if (screen == NULL) {
    		printf("Can't set video mode: %s\n", SDL_GetError());
    		exit(1);
    	}
    
    	while (!done) {
    		while (SDL_PollEvent(&event)) {
    			switch(event.type) {
    				case SDL_QUIT:
    					done = 1;
    					break;
    			}
    		}
    
    		keys = SDL_GetKeyState(NULL);
    		if (keys[SDLK_UP]) {
    			t.move(UP);
    		}
    		if (keys[SDLK_DOWN]) {
    			t.move(DOWN);
    		}
    		if (keys[SDLK_RIGHT]) {
    			t.move(RIGHT);
    		}
    		if (keys[SDLK_LEFT]) {
    			t.move(LEFT);
    		}
    
    		SDL_FillRect(screen, &dstblue, SDL_MapRGB(screen->format, 0, 0,
    			     255));
    		t.draw();
    		SDL_Flip(screen);
    	}
    
    	return 0;
    }
    

    Das eigentliche Problem ist, das ich nicht weiss wo der Fehler liegt. Ich glaub allerdings nicht, dass das Problem in der Main liegt. Wenn ich das Programm ausführe (unter linux, aber das dürfte ja egal sein) kommt folgender Fehler auf der Konsole:

    Fatal signal: Segmentation Fault (SDL Parachute Deployed)

    Bei der Kompilierung ist allerdings alles Fehlerfrei abgelaufen.



  • Was mir nur gerade aufgefallen ist:

    screen = SDL_SetVideoMode(640, 480, 16, SDL_HWSURFACE | SDL_DOUBLEBUF);
        SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 255));
        if (screen == NULL) {
            printf("Can't set video mode: %s\n", SDL_GetError());
            exit(1);
        }
    

    Man checkt erst auf NULL und danach arbeitet man mit der Variable weiter. SDL_FillRect & if(screen == NULL) tauschen. Vielleicht liegts dadran. Sorry, habe im Moment nicht Zeit, alles durchzulesen.

    Ansonsten -> lern debuggen. Stück für Stück Code rausnehmen, bis es nicht mehr crasht. Dann siehst du, wodran es liegt.



  • Danke ich habs ausgebessert, dabei ist mir glatt noch ein Detail aufgefallen, das ich vergessen hatte zu machen, ich habe den Pointer screen erst an den Konstruktor von Tux übergeben, bevor ich überhaupt SDL_SetVideoMode angewand hab, das kann ja überhaupt nicht geklappt haben, weil beine plasse nen ganz anderen Pointer hatte, als mein tatsächlicher Bildschirm.

    Jetzt klappt alles so weit ich es mir gedacht habe. Danke für die hilfe.



  • Hi, ich weiß nicht ob dies für dich interessant sein könnte, aber unter sf.net gibt es einen C++ Wrapper für die SDL C Api.
    http://sourceforge.net/projects/sdlucid



  • Kann man die labrary auch so installieren, dass ich sie bei jedem projekt einfach im header einbinden kann, ohne sourcecode Schubungen durchführungen machen zu müssen?



  • Keine ahnung, hab noch nie was mit SDL gemacht.


Anmelden zum Antworten