Codeblocks SDL Beginn



  • Hey Leute, ich bin derzeit dabei, mich etwas in die Verwendung von SDL in C++ einarbeiten. Als IDE benutz ich Codeblocks.

    Codeblocks bietet einen Wizard, der sofort eine fertige SDL Anwendung generiert. Diese Anwendung kann ich wunderbar kompilieren:

    #ifdef __cplusplus
        #include <cstdlib>
    #else
        #include <stdlib.h>
    #endif
    #ifdef __APPLE__
    #include <SDL/SDL.h>
    #else
    #include <SDL.h>
    #endif
    
    int main ( int argc, char** argv )
    {
        // initialize SDL video
        if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
        {
            printf( "Unable to init SDL: %s\n", SDL_GetError() );
            return 1;
        }
    
        // make sure SDL cleans up before exit
        atexit(SDL_Quit);
    
        // create a new window
        SDL_Surface* screen = SDL_SetVideoMode(640, 480, 16,
                                               SDL_HWSURFACE|SDL_DOUBLEBUF);
        if ( !screen )
        {
            printf("Unable to set 640x480 video: %s\n", SDL_GetError());
            return 1;
        }
    
        // load an image
        SDL_Surface* bmp = SDL_LoadBMP("cb.bmp");
        if (!bmp)
        {
            printf("Unable to load bitmap: %s\n", SDL_GetError());
            return 1;
        }
    
        // centre the bitmap on screen
        SDL_Rect dstrect;
        dstrect.x = (screen->w - bmp->w) / 2;
        dstrect.y = (screen->h - bmp->h) / 2;
    
        // program main loop
        bool done = false;
        while (!done)
        {
            // message processing loop
            SDL_Event event;
            while (SDL_PollEvent(&event))
            {
                // check for messages
                switch (event.type)
                {
                    // exit if the window is closed
                case SDL_QUIT:
                    done = true;
                    break;
    
                    // check for keypresses
                case SDL_KEYDOWN:
                    {
                        // exit if ESCAPE is pressed
                        if (event.key.keysym.sym == SDLK_ESCAPE)
                            done = true;
                        break;
                    }
                } // end switch
            } // end of message processing
    
            // DRAWING STARTS HERE
    
            // clear screen
            SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));
    
            // draw bitmap
            SDL_BlitSurface(bmp, 0, screen, &dstrect);
    
            // DRAWING ENDS HERE
    
            // finally, update the screen :)
            SDL_Flip(screen);
        } // end main loop
    
        // free loaded bitmap
        SDL_FreeSurface(bmp);
    
        // all is well ;)
        printf("Exited cleanly\n");
        return 0;
    }
    

    Nun wollte ich diese ganze Sache einfach mal in eine Klasse verpacken und schauen ob das funktioniert. Das sieht dann so aus:

    #ifndef RENDERER_H_INCLUDED
    #define RENDERER_H_INCLUDED
    
    #ifdef __cplusplus
        #include <cstdlib>
    #else
        #include <stdlib.h>
    #endif
    #ifdef __APPLE__
    #include <SDL/SDL.h>
    #else
    #include <SDL.h>
    #endif
    
    #include "GLCoreComponent.h"
    
    class GLRenderer : GLCoreComponent
    {
        private:
    
        public:
            bool done;
            SDL_Surface* screen;
            SDL_Surface* bmp;
            SDL_Rect dstrect;
    
            GLRenderer();
            void Loop();
            ~GLRenderer();
    
    };
    
    #endif // RENDERER_H_INCLUDED
    
    #include "GLRenderer.h"
    
    GLRenderer::GLRenderer()
    {
        done = false;
        // initialize SDL video
        if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
        {
            printf( "Unable to init SDL: %s\n", SDL_GetError() );
            //return 1;
        }
    
        // make sure SDL cleans up before exit
        atexit(SDL_Quit);
    
        // create a new window
        SDL_Surface* screen = SDL_SetVideoMode(640, 480, 16,
                                               SDL_HWSURFACE|SDL_DOUBLEBUF);
                printf("Unable to set 640x480 video: %s\n", SDL_GetError());
        if ( !screen )
        {
            printf("Unable to set 640x480 video: %s\n", SDL_GetError());
            //return 1;
        }
    
        // load an image
        SDL_Surface* bmp = SDL_LoadBMP("cb.bmp");
        if (!bmp)
        {
            printf("Unable to load bitmap: %s\n", SDL_GetError());
            //return 1;
        }
    
        // centre the bitmap on screen
        SDL_Rect dstrect;
        dstrect.x = (screen->w - bmp->w) / 2;
        dstrect.y = (screen->h - bmp->h) / 2;
        printf( "test");
    }
    
    void GLRenderer::Loop()
    {
    
        while (!done)
        {
            // message processing loop
            SDL_Event event;
            while (SDL_PollEvent(&event))
            {
                // check for messages
                switch (event.type)
                {
                    // exit if the window is closed
                case SDL_QUIT:
                    done = true;
                    break;
    
                    // check for keypresses
                case SDL_KEYDOWN:
                    {
                        // exit if ESCAPE is pressed
                        if (event.key.keysym.sym == SDLK_ESCAPE)
                            done = true;
                        break;
                    }
                } // end switch
            } // end of message processing
    
            // DRAWING STARTS HERE
    
            // clear screen
            SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));
    
            // draw bitmap
            SDL_BlitSurface(bmp, 0, screen, &dstrect);
    
            // DRAWING ENDS HERE
    
            // finally, update the screen :)
            SDL_Flip(screen);
        } // end main loop
    }
    
    GLRenderer::~GLRenderer()
    {
        // free loaded bitmap
        SDL_FreeSurface(bmp);
    }
    

    und dann rufe ich das ganze in der Main folgendermaßen auf:

    int main ( int argc, char** argv )
    {
        GLRenderer *renderer = new GLRenderer();
        renderer->Loop();
    }
    

    Es öffnet sich für den Bruchteil einer Sekunde lang ein fenster, man sieht aber auch nix. Danach ist nur noch die Konsole mit der folgenden Meldung offen:

    Process returned -11 <0xFFFFFFF5>execution time : 0.250s

    Hat da jemand vielleicht eine Idee? Aus irgendeinem Grund geht auch der Debugger bei mir nicht, ich google schon seit tagen, woran das liegt, bekomms aber nicht raus ^^

    PS: Hinweis auf Crosspost: http://delphigl.com/forum/viewtopic.php?t=8154



  • tja, das sieht sehr nach einem segmentation fault (signal 11) aus. Unter welcher Plattform entwickelst du? Falls du GDB (den debugger) installiert hast, sollte das von Code::Blocks bereitgestellte Frontend dazu eigentlich funktionieren. Und mithilfe des Debuggers solltest du dem Fehler dann auch recht schnell auf die Schliche kommen 🙂



  • Ja also der Fehler wurde bereits gefunden. Ich hatte die SDL_Surfaces im Header schon deklariert und dann in den Methoden nochma.. deswegen gings nicht

    Allerdings geht mein Debugger partout nicht. Ich benutz eigentlich schon den GDB
    Ich kann aber zb keine Watches einfügen, die Liste ist immer leer. Und wenn ich den Debugger starten will, kommt eine Fehlermeldung, dass er nicht aktiviert ist. Ich weiss aber auch nicht, wo ich ihn aktivieren soll. Habe dazu schon gegooglet und mir anleitungen zum Debuggen in Codeblocks durchgelesen, aber das hat alles nich geholfen 😕



  • Benutzt du Code::Blocks unter Windows, Linux, Mac, ...?

    Machst du außerdem ein Debug- oder ein Release-Build? Im Release-Modus werden meines Wissens keine Debugging-Symbole mehr erzeugt (wieso auch?), deshalb bringt da auch debuggen nicht viel. Siehe auch hier: http://www.c-plusplus.net/forum/viewtopic-var-t-is-151191.html

    Das hier war vermutlich die Seite, die du mit "Debuggen in Code::Blocks" gemeint hast? http://wiki.codeblocks.org/index.php?title=Debugging_with_Code::Blocks

    Falls sich das Problem wirklich nicht auflösen lassen sollte, kann ich dir nur noch raten, dein Problem im Code::Blocks Forum zu posten, die werden dir noch am ehesten helfen können: http://forums.codeblocks.org



  • Hi, ich wollte nur mal fragen wie du die libs und includes von der SDL in dein Projekt eingebunden hast ?
    Ich habe jetzt bei den Compiler Settings den Include Ordner und bei den Linker Settings den lib Ordnder eingefügt, aber ich kriege wenn ich die Vorlage von CodeBlocks kompilieren immer diese Fehlermeldung:

    ld.exe||cannot find -lSDL.dll|


Anmelden zum Antworten