SDL - Bild anzeigen funktioniert nicht



  • Hi erstmal!

    Ich habe mir gedacht ich schau mal n bisschen bei der SDL Programmierung vorbei. Nun will ich ein Fenster erstellen und darin dann ein Bitmap rein laden. Das Bitmap ist genau gleich groß wie das Fenster (640x480) und nicht komprimiert.

    ich bekomme eine Fehlermeldung aber ich weiß nicht ob das überhaupt was mit dem Bitmap zu tun hat. Sie kommt nämlich schon beim Initialisieren von SDL. Ich habe natürlich versucht aus dem Tutorial, das ich mir runter geladen habe ( http://www.robsite.de/daten/tutorials/SDL-Tutorial.zip ) das Programm zu kompilieren. Dort funktioniert es problemlos und auch schneller...

    Hier ist der Source Code:

    #include <iostream>
    #include <SDL/SDL.h>
    #include <SDL/SDL_endian.h>
    using namespace std;
    
    void init()
    {
    	if( SDL_Init(SDL_INIT_VIDEO) < 0 ) // SDL wird Initialisiert und Fehler werden abgefangen
    	{
    		cerr << "Initialisieren von SDL ist fehlgeschlagen!" << endl << SDL_GetError << endl; // Fehler ausgeben, den SDL übergibt
    	}
    	atexit(SDL_Quit); // Beim Beenden des Programms wird der verbrauchte Speicher aufgeräumt
    }
    
    void makewindow(SDL_Surface *screen)
    {
    	screen = SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE); // Fenster erstellen
    	if ( screen == NULL ) {
            	fprintf(stderr, "Ich konnte kein Fenster mit der Auflösung 640*480 öffnen: %s\n", SDL_GetError());
    	}
    }
    
    void events(SDL_Surface *screen)
    {
    	int running = 1; // Variable für die Abbruchbedingung
    	while(running) // Schleife bis das Programm beendet wird
    	{
    		SDL_Event event; // Klasse für die Events deklarieren
    
    		while(SDL_PollEvent(&event)) // mit SDL_PollEvent wird sichergestellt, dass jedes Ereigniss berücksichtigt wird
    		{
    			switch(event.type) // Überprüfen, welches Event eingetreten ist
    			{
    				case SDL_KEYDOWN: // Bei Tastendruck wird der folgende Code ausgeführt
    					running = 0;
    					break;
    
    				case SDL_QUIT: // Beim Schließen des Fensters wird dieser Code ausgegeben
    					running = 0;
    					break;
    			}
    		}
    	}
    }
    
    int main()
    {
    	SDL_Surface *screen; // Ein Zeiger auf das Bildschirmsurface wird erstellt
    
    	cout << "Initialisiere SDL" << endl;
    	init(); // Funktion zum initialisieren von SDL aufrufen
    
    	cout << "Erzeuge Fenster" << endl;
    	makewindow(screen); // Funktion zum erstellen eines Fensters aufrufen
    
    	events(screen); // Auf Eingaben des Users warten
    
    	return 0;
    }
    

    und hier noch die Ausgabe des Programms:

    Jetzt möchte ich narürlich gerne verstehen können wieso es bei mir länger dauert, bis das Fenster angezeigt wird und wieso das teil bei mir nicht funktioniert...

    Ich danke euch schon mal im voraus für eure Mühe.

    grüße buff



  • du hast vergessen die fehlermeldung zu posten



  • DrGreenthumb schrieb:

    du hast vergessen die fehlermeldung zu posten

    Jo genau, mir ist selbst gerade eingefallen dass ich das vergessen haben könnte... Aber das hast du schon vor mir gesehen... 🙂

    Hier dann die gesamte Ausgabe:

    Initialisiere SDL
    ALSA lib pcm_dmix.c:802:(snd_pcm_dmix_open) unable to open slave
    Erzeuge Fenster
    Lade Bitmap
    Kopiere Bitmap von Surface "Bitmap" ins Surface "Screen"
    Aktualisiere Bildschirm
    


  • So, habe jetzt ein paar formfehler raus gemacht. Das Program geht jetzt zwar schneller aber das Bild wird immer noch nicht angezeigt...

    Hier die änderungen:

    if( SDL_Init(SDL_INIT_VIDEO) < 0 ) // In dieser Zeile hatte ich noch die Initialisierung vom den Audio SDL libs drinnen (keine ahnung wieso)
    ...
                fprintf(stderr, "Ich konnte kein Fenster mit der Auflösung 640*480 öffnen: %s\n", SDL_GetError());
    // Naja, ich war natürlich zu faul und habe fälschlicherweise einen C Quellcode rein kopiert obwohl ich ja C++ progge...
    

    Die Sourcen sind ansonsten identisch 😉



  • Ob du jetzt fprintf oder cerr nimmst is egal. Das Ziel ist dasselbe.

    Stell mal deinen Desktop auf 16 oder dein programm auf 32 bit. Aber auf alle fälle müssen die indentisch sein, sonst gibts frameraten wie auf nem 486er. 😉

    edit: Das passiert oft nur im windowed-mode, manchmal auch im fullscreen, wenn der devmode nicht geändert wird.
    rya.
    Scorcher24



  • Mir ist schon klar dass ich fprintf auch benutzen kann... Ich sagte nur, dass ich ein paar Formfehler beseitigt habe... Schaut von mir aus gesehen wirklich nicht sauber aus, wenn man einmal cout und dann fprintf nimmt.

    Aber da verfehlen wir ja eigentlich das Thema...

    Ich habe jetzt auf 32 Bit Farbtiefe umgestellt:

    void makewindow(SDL_Surface *screen)
    {
    	screen = SDL_SetVideoMode(640, 480, 32, 0);
    ...
    

    Ich danke dir erstmal für den Tipp. Das Bild wird aber trotzdem nicht angezeigt...



  • SDL_Surface makewindow(void) 
    { 
        return SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE); // Fenster erstellen 
    }
    

    Schonmal über etwas in der Art nachgedacht?
    Du willst ansonsten ein Objekt als Pointer zurückgeben.. das wird auch nicht wirklich was..

    Außerdem seh ich nirgends in deinem Code auch nur ansatzweise ein SDL_LoadImage/LoadBitmap.
    Wo kommt das Bitmap her?

    void events(SDL_Surface *screen) 
    { 
        SDL_Event event; // Klasse für die Events deklarieren 
        int running = 1; // Variable für die Abbruchbedingung 
        while(running) // Schleife bis das Programm beendet wird 
        { 
    
            SDL_PollEvent(&event); // mit SDL_PollEvent wird sichergestellt, dass jedes Ereigniss berücksichtigt wird 
            switch(event.type) // Überprüfen, welches Event eingetreten ist 
            { 
                case SDL_KEYDOWN: // Bei Tastendruck wird der folgende Code ausgeführt 
                        running = 0; 
                        break; 
    
                case SDL_QUIT: // Beim Schließen des Fensters wird dieser Code ausgegeben 
                        running = 0; 
                        break; 
            } 
        } 
    }
    

    Das sollte übrigens auch funktionieren, nur an deinem Problem wird sich da noch nix ändern, befürchte ich.



  • So, mir ists auf die Nerven gegangen, dann hab ich alles nochmal begonnen zu coden... Jetzt Funktioniert es... 🙄

    Auf jedem Fall bedanke ich mich bei euch und entschuldige mich für die Zeit die ich euch geraubt habe...



  • hatte eh grade etwas ablenkung nötig 😉


Anmelden zum Antworten