Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 11, 2025 04:34

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Codeblocks SDL Beginn
BeitragVerfasst: So Jan 18, 2009 18:42 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
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:
Code:
  1. #ifdef __cplusplus
  2.     #include <cstdlib>
  3. #else
  4.     #include <stdlib.h>
  5. #endif
  6. #ifdef __APPLE__
  7. #include <SDL/SDL.h>
  8. #else
  9. #include <SDL.h>
  10. #endif
  11.  
  12. int main ( int argc, char** argv )
  13. {
  14.     // initialize SDL video
  15.     if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
  16.     {
  17.         printf( "Unable to init SDL: %s\n", SDL_GetError() );
  18.         return 1;
  19.     }
  20.  
  21.     // make sure SDL cleans up before exit
  22.     atexit(SDL_Quit);
  23.  
  24.     // create a new window
  25.     SDL_Surface* screen = SDL_SetVideoMode(640, 480, 16,
  26.                                            SDL_HWSURFACE|SDL_DOUBLEBUF);
  27.     if ( !screen )
  28.     {
  29.         printf("Unable to set 640x480 video: %s\n", SDL_GetError());
  30.         return 1;
  31.     }
  32.  
  33.     // load an image
  34.     SDL_Surface* bmp = SDL_LoadBMP("cb.bmp");
  35.     if (!bmp)
  36.     {
  37.         printf("Unable to load bitmap: %s\n", SDL_GetError());
  38.         return 1;
  39.     }
  40.    
  41.     // centre the bitmap on screen
  42.     SDL_Rect dstrect;
  43.     dstrect.x = (screen->w - bmp->w) / 2;
  44.     dstrect.y = (screen->h - bmp->h) / 2;
  45.  
  46.     // program main loop
  47.     bool done = false;
  48.     while (!done)
  49.     {
  50.         // message processing loop
  51.         SDL_Event event;
  52.         while (SDL_PollEvent(&event))
  53.         {
  54.             // check for messages
  55.             switch (event.type)
  56.             {
  57.                 // exit if the window is closed
  58.             case SDL_QUIT:
  59.                 done = true;
  60.                 break;
  61.  
  62.                 // check for keypresses
  63.             case SDL_KEYDOWN:
  64.                 {
  65.                     // exit if ESCAPE is pressed
  66.                     if (event.key.keysym.sym == SDLK_ESCAPE)
  67.                         done = true;
  68.                     break;
  69.                 }
  70.             } // end switch
  71.         } // end of message processing
  72.  
  73.         // DRAWING STARTS HERE
  74.        
  75.         // clear screen
  76.         SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));
  77.  
  78.         // draw bitmap
  79.         SDL_BlitSurface(bmp, 0, screen, &dstrect);
  80.  
  81.         // DRAWING ENDS HERE
  82.  
  83.         // finally, update the screen <!-- s:) --><img src=\"{SMILIES_PATH}/icon_smile.gif\" alt=\":)\" title=\"Smile\" /><!-- s:) -->
  84.         SDL_Flip(screen);
  85.     } // end main loop
  86.  
  87.     // free loaded bitmap
  88.     SDL_FreeSurface(bmp);
  89.  
  90.     // all is well <!-- s;) --><img src=\"{SMILIES_PATH}/icon_wink.gif\" alt=\";)\" title=\"Wink\" /><!-- s;) -->
  91.     printf("Exited cleanly\n");
  92.     return 0;
  93. }
  94.  


Nun wollte ich diese ganze Sache einfach mal in eine Klasse verpacken und schauen ob das funktioniert. Das sieht dann so aus:
Code:
  1. #include "GLRenderer.h"
  2.  
  3. GLRenderer::GLRenderer()
  4. {
  5.     done = false;
  6.     // initialize SDL video
  7.     if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
  8.     {
  9.         printf( "Unable to init SDL: %s\n", SDL_GetError() );
  10.         //return 1;
  11.     }
  12.  
  13.     // make sure SDL cleans up before exit
  14.     atexit(SDL_Quit);
  15.  
  16.     // create a new window
  17.     SDL_Surface* screen = SDL_SetVideoMode(640, 480, 16,
  18.                                            SDL_HWSURFACE|SDL_DOUBLEBUF);
  19.             printf("Unable to set 640x480 video: %s\n", SDL_GetError());
  20.     if ( !screen )
  21.     {
  22.         printf("Unable to set 640x480 video: %s\n", SDL_GetError());
  23.         //return 1;
  24.     }
  25.  
  26.     // load an image
  27.     SDL_Surface* bmp = SDL_LoadBMP("cb.bmp");
  28.     if (!bmp)
  29.     {
  30.         printf("Unable to load bitmap: %s\n", SDL_GetError());
  31.         //return 1;
  32.     }
  33.  
  34.     // centre the bitmap on screen
  35.     SDL_Rect dstrect;
  36.     dstrect.x = (screen->w - bmp->w) / 2;
  37.     dstrect.y = (screen->h - bmp->h) / 2;
  38.     printf( "test");
  39. }
  40.  
  41. void GLRenderer::Loop()
  42. {
  43.  
  44.     while (!done)
  45.     {
  46.         // message processing loop
  47.         SDL_Event event;
  48.         while (SDL_PollEvent(&event))
  49.         {
  50.             // check for messages
  51.             switch (event.type)
  52.             {
  53.                 // exit if the window is closed
  54.             case SDL_QUIT:
  55.                 done = true;
  56.                 break;
  57.  
  58.                 // check for keypresses
  59.             case SDL_KEYDOWN:
  60.                 {
  61.                     // exit if ESCAPE is pressed
  62.                     if (event.key.keysym.sym == SDLK_ESCAPE)
  63.                         done = true;
  64.                     break;
  65.                 }
  66.             } // end switch
  67.         } // end of message processing
  68.  
  69.         // DRAWING STARTS HERE
  70.  
  71.         // clear screen
  72.         SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));
  73.  
  74.         // draw bitmap
  75.         SDL_BlitSurface(bmp, 0, screen, &dstrect);
  76.  
  77.         // DRAWING ENDS HERE
  78.  
  79.         // finally, update the screen <!-- s:) --><img src=\"{SMILIES_PATH}/icon_smile.gif\" alt=\":)\" title=\"Smile\" /><!-- s:) -->
  80.         SDL_Flip(screen);
  81.     } // end main loop
  82. }
  83.  
  84. GLRenderer::~GLRenderer()
  85. {
  86.     // free loaded bitmap
  87.     SDL_FreeSurface(bmp);
  88. }


und dann rufe ich das ganze in der Main folgendermaßen auf:
Code:
  1. int main ( int argc, char** argv )
  2. {
  3.     GLRenderer *renderer = new GLRenderer();
  4.     renderer->Loop();
  5. }


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:
Zitat:
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://www.c-plusplus.de/forum/viewtopi ... ml#1647880


Zuletzt geändert von Shaddow am So Jan 18, 2009 20:54, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 18, 2009 20:53 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Gib mal die GLRenderer.h

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 18, 2009 20:55 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Code:
  1. #ifndef RENDERER_H_INCLUDED
  2. #define RENDERER_H_INCLUDED
  3.  
  4. #ifdef __cplusplus
  5.     #include <cstdlib>
  6. #else
  7.     #include <stdlib.h>
  8. #endif
  9. #ifdef __APPLE__
  10. #include <SDL/SDL.h>
  11. #else
  12. #include <SDL.h>
  13. #endif
  14.  
  15.  
  16. #include "GLCoreComponent.h"
  17.  
  18. class GLRenderer : GLCoreComponent
  19. {
  20.     private:
  21.  
  22.     public:
  23.         bool done;
  24.         SDL_Surface* screen;
  25.         SDL_Surface* bmp;
  26.         SDL_Rect dstrect;
  27.  
  28.  
  29.         GLRenderer();
  30.         void Loop();
  31.         ~GLRenderer();
  32.  
  33.  
  34. };
  35.  
  36.  
  37.  
  38. #endif // RENDERER_H_INCLUDED


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 18, 2009 21:09 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Zeile 17, 27 & 35.
Du überschreibst deine Variablen indem du neue einführst. Von daher werden die Variablen der Klasse gar nicht gesetzt und im Loop agierst du wild im Speicher was zum Glück zum Abschuss führt.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 18, 2009 21:14 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Hey ionos das mit der Neudeklaration der Variablen war der Fehler! jetzt funktioniert es
Aber was meinst du mit der Speicherstrangualtion im Loop? Also es funktioniert ja und der Code kommt so ja direkt aus dem Wizard. Wo sind da die fehler?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 18, 2009 21:25 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Naja, du hast deinen Funktionen undefinierte Variablen gegeben. In Delphi sind sie nil, in C++ hängt es vom Kompiler ab.
Und wenn er auf schnell ausgelegt ist anstatt auf brav, dann zeigt screen noch auf einen Speicherblock der noch alte Daten enthält bzw. auf einem Bereich der deinem Programm nicht zugewiesen ist. Dann können schöne Effekte entstehen.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 20, 2009 09:06 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Noch ein Hinweis zu:

Code:
  1.  int main ( int argc, char** argv )
  2. {
  3.       GLRenderer *renderer = new GLRenderer();
  4.       renderer->Loop();
  5. }


Ich hoffe im Destruktor steht nichts wichtiges, weil der für renderer NIE aufgerufen wird. In C++ sollte man vorwiegend mit Stack-Objekten arbeiten. Das ist schneller und einfacher.
new benutzt man, wenn ein Objekt über den Funktionsscope hinaus erhalten bleiben soll(bei dir nicht der Fall) oder wenn das Objekt zu groß für den Stack ist.

Besser wäre:
Code:
  1.  int main ( int argc, char** argv )
  2. {
  3.       GLRenderer renderer;
  4.       renderer.Loop();
  5. }

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Zuletzt geändert von Pellaeon am Di Jan 20, 2009 09:13, insgesamt 2-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 20, 2009 09:11 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Und noch ein Hinweis. Wenn du Zeiger hast, ist es sinnvoll sie mit 0 zu initialisieren. Am einfachsten geht das folgender Maßen:

Code:
  1. GLRenderer::GLRenderer() : screen(0),bmp(0)
  2. {
  3. ...


Ich schreibe auch gerne bei Zeigern im Name vorne ein kleines p, also pScreen. Dann sieht man sofort: das ist ein Zeiger.

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 14 Queries | GZIP : On ]