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|