SDL - Fenster schließt sich



  • Hey, ich habe vor einigen Tagen mit SDL angefangen und habe mir das Ziel gesetzt ein kleines Fantasy RPG zu programmieren. Leider scheitere ich schon bei ganz kleinen Sachen:

    #ifdef __cplusplus
        #include <cstdlib>
    #else
        #include <stdlib.h>
    #endif
    #ifdef __APPLE__
    #include <SDL/SDL.h>
    #else
    #include <SDL.h>
    #include <SDL_image.h>
    #endif
    
    int main ( int argc, char** argv )
    {
    
        atexit(SDL_Quit);
    
    	SDL_WM_SetCaption( "Key to Heaven", NULL );
        SDL_Surface* screen = SDL_SetVideoMode(640, 480, 16,
                                               SDL_HWSURFACE|SDL_DOUBLEBUF);
        image = IMG_Load("start.jpg");
        SDL_Surface *image;
    
        if (image == NULL)
    	{
            printf("Unable to load image: %s\n", SDL_GetError());
            return 1;
        }
    
        SDL_Rect dstrect;
        dstrect.x = (screen->w - image->w) / 2;
        dstrect.y = (screen->h - image->h) / 2;
    
        bool done = false;
        while (!done)
        {
            SDL_Event event;
            while (SDL_PollEvent(&event))
            {
                switch (event.type)
                {
                case SDL_QUIT:
                    done = true;
                    break;
                case SDL_KEYDOWN:
                    {
                        if (event.key.keysym.sym == SDLK_ESCAPE)
                            done = true;
                        break;
                    }
                }
            }
    
            SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));
    
            SDL_BlitSurface(image, 0, screen, 0);
    
            SDL_Flip(screen);
        }
    
        SDL_FreeSurface(image);
    
        printf("Exited cleanly\n");
        getch();
        return 0;
    }
    

    Ich will ein Titelbild (.jpg) auf dem Bildschirm darstellen lassen, doch das Fenster schließt sich viel zu schnell. Ich habe in Zeile 64 schon ein getch() eingefügt (welches ja normalerweise die Konsole pausiert), aber das will auch nicht klappen.
    Weiß jemand woran das liegt, bzw. was an dem Code falsch ist?

    Außerdem findet mein Compiler die SDL_image.h-Datei nicht. Ich habe auch schon nachgeschaut, aber irgendwie ist die bei mir nicht vorhanden (wobei dieser Error keine drastischen Auswirkungen auf den Code hat).

    MfG Anima 🙂



  • Die SDL_image.h ist eine extra bibliothek die nicht beim normalen sdl dabei ist - musst du extra herunterladen.

    Und falls er kein SDL_image.h kennt, dürfte

    IMG_Load("start.jpg");
    

    gar nicht funktionieren. Und selbst wenn es funktioniert, was ist denn dein exit code? Eventuell schlägt das laden des bildes ja fehl. Dann gibt's direkt ein return 1, ohne das getch() aufgerufen wird.



  • image = IMG_Load("start.jpg");
        SDL_Surface *image;
    

    Müsste das nicht anders herum stehen?



  • Little Programmer schrieb:

    image = IMG_Load("start.jpg");
        SDL_Surface *image;
    

    Müsste das nicht anders herum stehen?

    Theoretisch ja. Aber aus welchem Grund auch immer erhalte ich einen Error:

    undefined reference to `IMG_Load'



  • Sorry für den Doppelpost, aber ich denke das ich vorerst von SDL die Finger lassen werde und auf SFML umsteigen werde, da diese Library weitaus einfacher aussieht und zudem auch in C++ geschrieben ist, oder was denkt ihr?



  • SFML nutzt einfach nur SDL und stellt das ganze objektorientiert dar, soweit ich weiß. Ich hatte es damit auch mal versucht, aber bin dann doch bei SDL geblieben. Für einige Dinge ist SFML aber wesentlich praktischer als SDL.

    Zu deinem Fehler, du hast die Bibliothek für SDL_image falsch eingebunden oder sie wird nicht gefunden. Müsstest mal genau schreiben, wo du was wie bei welcher IDE oder welchem Compiler eingestellt hast und welche Dateien bei dir wo liegen. Vielleicht sieht man dann den Fehler.



  • Nein, im Gegenteil zu SDL nutzt SFML OpenGL für die Grafikdarstellung, weswegen SFML ggü. SDL deutlich schneller ist. Soweit ich recht informiert bin.

    SFML und SDL sind grundsätzlich zwei verschiedene Bibliotheken, die nichts miteinander zu tun haben.



  • Ich habe jetzt SDL_image heruntergeladen, weiß aber nicht wie ich es jetzt bei CodeBlocks bzw. MinGW installiere. Gibt es da ein Tutorial oder kann mir jemand schreiben wie es geht?


Anmelden zum Antworten