• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

[C++]SDL Problem

Status
Für weitere Antworten geschlossen.

gollum1990

Neues Mitglied
Hallo Forum,

ich habe ein Problem mit einem SDL Skript.

Der Code ist fehlerfrei, der lässt sich kompilieren und eine Exe gibts auch, ich benutze DEv C++. Aber wenn die Datei Starte, öffnet es sich und schließt sofort wieder. Kann mir da jemand helfen. Danke.

Code:
PHP:
#include <iostream>
#include <SDL/SDL.h> 

using namespace std;

int main(int argc, char **argv)
{
    if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
        cout << "SDL konnte nicht initalisiert werden." << endl;
        exit(1);
    }
    
    SDL_Surface *fenster, *bild;
    SDL_Rect ziel;
    
    char *datei = "tile01.bmp";
    int x,y;
    
    x = 400;
    y = 400;
    fenster = SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE);
    
    if(fenster == NULL) {
              cout << "Konnte das Fenster nicht öffnen." << endl;
              exit(1);
    }
     
    bild = SDL_LoadBMP(datei);
    
    if(bild == NULL) {
            cout << "Bild konnte nicht geladen werden." << endl;
            exit(1);
    }
    
    ziel.x = x;
    ziel.y = y;
    ziel.w = bild->w;
    ziel.h = bild->h;
    SDL_BlitSurface(bild, NULL, fenster, &ziel);
    SDL_UpdateRects(fenster, 1, &ziel);
    SDL_FreeSurface(bild);
    exit(0);
}
 
Werbung:
Du hast den Programmcode kopiert, oder?
Füg am Ende der main-Funktion ein:

Code:
System("PAUSE");
return 0;
 
Es ist klar das sich die anwendung gleich wieder beendet. Nachdem du alles eingestellt hast, kommst du ja an das ende der main und beendest damit das programm. Wenn du dir das ergebnis nur kurz anschauen willst solltest du dafür SDL_Delay verwenden. Einfach vor ende des Programms einfügen und kurz warten lassen. ;)

Sobald du ereignisse behandelt kannst du das hauptprogramm ja ohne initialisierung in eine while schleife setzten die erst endet wenn man eine bestimmte taste drückt.

Ich würde dir empfehlen am anfang folgendes einzufügen:
Code:
atexit(SDL_Quit);

Dadurch wird am ende des programms durch exit die funktion SDL_Quit aufgerufen und sorgt dafür das alles vernünftig abgeschaltet und wieder freigegeben wird. Du willst doch nicht deinen RAM zumüllen oder? ;P

@most: Das wird nichts bringen weil das program nicht in der console läuft, sofern er es nicht von dort startet. Wenn er pech hat kann er das programm gar nicht richtig beenden.
 
Werbung:
Danke das Problem hat sich erledigt. ER macht jetzt alles dank SDL_Delay.

Nun habe ich etwas mit Events gemacht, aber der beendet direkt wieder. Wenn ich SDL_Delay verwende, funktioniert das nicht so. Hier der Code:
PHP:
#include <SDL/SDL.h>

int main(int argc, char* args[]) 
{ 
   // Eigenschaften Deklarieren
   SDL_Surface *fenster;
   SDL_Event event;
   int ende;
   
   //SDL Inintalisieren
   if(SDL_Init(SDL_INIT_EVERYTHING) == -1) {
                                    return -1;
   }
   //Fenster Initalisieren
   fenster = SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE);
   if(fenster == NULL) {
              return -1;
   }
   
   ///////////////////////
   //Haupt Programm hier//
   ///////////////////////
   ende = false;
   while(SDL_PollEvent(&event) && ende == false)
   {
                               if(event.type == SDL_KEYDOWN)
                               {
                                             if(event.key.keysym.sym == SDLK_ESCAPE)
                                             {
                                                                     ende = true;
                                             }
                                             else if(event.key.keysym.sym == SDLK_UP)
                                             {
                                                  SDL_WM_SetCaption("Oben", NULL);
                                             }
                                             else if(event.key.keysym.sym == SDLK_DOWN) 
                                             {
                                                  SDL_WM_SetCaption("Unten", NULL);
                                             }
                               }
   }
   
   ////////////////////////
   //Haupt Programm Ende //
   ////////////////////////
   
   //Schließen
   SDL_Quit();
   
   //Returnen
   return 0;   
}

Mein Plan war, wenn ich EsCape drücke solle er das beenden.
 
Zuletzt bearbeitet:
Status
Für weitere Antworten geschlossen.
Zurück
Oben