SDL - initialisierung für "SDL_Event" ; Laden von Bitmaps



  • Hallo liebe Forenmitglieder 😉

    Hab zwei kleine SDL Fragen:
    1.
    Nutze sei neustem die 2010er Version von VS C++ und habe angefangen andere Projekte in jenes zu übertragen. das 2010 mekert nun bei einigen Variabeln rum, dass ihnen eine Initialisierung fehlt.

    Bei den meisten hab ich einfach mal "NULL" ausgewählt. Jedoch mit "SDL_Event" geht das nicht, da dies ein struct ist.

    Ausschnitt aus dem SDL code:

    /** General event structure */
    typedef union SDL_Event {
    	Uint8 type;
    	SDL_ActiveEvent active;
    	SDL_KeyboardEvent key;
    	SDL_MouseMotionEvent motion;
    	SDL_MouseButtonEvent button;
    	SDL_JoyAxisEvent jaxis;
    	SDL_JoyBallEvent jball;
    	SDL_JoyHatEvent jhat;
    	SDL_JoyButtonEvent jbutton;
    	SDL_ResizeEvent resize;
    	SDL_ExposeEvent expose;
    	SDL_QuitEvent quit;
    	SDL_UserEvent user;
    	SDL_SysWMEvent syswm;
    } SDL_Event;
    

    Die Deklarierung und die Initialisierung innerhalb meines codes:

    // Event
    	SDL_Event event;
    	event = NULL;
    

    NULL geht hier halt nicht, weil ich einen kompletten Struct wohl nicht "NULL" setzen kann. Gibt es vllt eine bessere möglichkeit zum initialisieren?

    2. Habe ich mir ein kleines Menü geschrieben:

    // State of the Menue
    	int iMenue_State = 1;
    
    	int iEnd_Menue = 0;
    
    	while (iEnd_Menue == 0)
    	{
    
    		SDL_PollEvent (&event);
    		keys = SDL_GetKeyState (NULL);
    		if (keys [SDLK_DOWN])
    		{
    			switch(iMenue_State)
    			{
    				case (1):
    				{
    					image = NULL;
    					image = SDL_LoadBMP("Graphics/Hauptmenue_Highscore.bmp");
    					if (image == NULL) 
    					{
    						printf("Can't load image Background: %s\n", SDL_GetError());
    						exit(1);
    					}
    
    					SDL_BlitSurface(image, NULL, screen, NULL);
    					SDL_Flip(screen);
    
    					iMenue_State = 2;
    
    				}break;
    
    				case (2):
    				{
    					image = NULL;
    					image = SDL_LoadBMP("Graphics/Hauptmenue_Spiel Beenden.bmp");
    					if (image == NULL) 
    					{
    						printf("Can't load image of the Background: %s\n", SDL_GetError());
    						exit(1);
    					}
    
    					SDL_BlitSurface(image, NULL, screen, NULL);
    					SDL_Flip(screen);
    					iMenue_State = 3;
    				}break;
    			}
    
    		}
    		if (keys [SDLK_UP])
    		{ 
    			switch(iMenue_State)
    			{
    
    				case (2):
    				{
    					image = NULL;
    					image = SDL_LoadBMP("Graphics/Hauptmenue_Neues Spiel.bmp");
    					if (image == NULL) 
    					{
    						printf("Can't load image of the Background: %s\n", SDL_GetError());
    						exit(1);
    					}
    
    					SDL_BlitSurface(image, NULL, screen, NULL);
    					SDL_Flip(screen);
    					iMenue_State = 1;
    				}break;
    
    				case (3):
    				{
    					image = NULL;
    					image = SDL_LoadBMP("Graphics/Hauptmenue_Highscore.bmp");
    					if (image == NULL) 
    					{
    						printf("Can't load image of the Background: %s\n", SDL_GetError());
    						exit(1);
    					}
    
    					SDL_BlitSurface(image, NULL, screen, NULL);
    					SDL_Flip(screen);
    					iMenue_State = 2;
    				}break;
    			}
    
    		}
    

    Hier die Deklarationen der ganzen Variablen.

    // Event
    	SDL_Event event;
    // KeyboardUINT8
    	Uint8 *keys;
    	keys = NULL;
    // Surfaces
    	SDL_Surface *screen, *image;
    	screen = NULL;
    	image = NULL;
    

    Ich habe 3 Menüpunkte "Neues Spiel" ; "Highscore" ; "Spiel Beenden", sowie 3 Grafiken, in denen einen der 3 Menüpunkte Hell hinterlegt ist, so als ob ich es ausgewählt hätte.

    Das Problem ist nun, dass er selbstverstädlich jedesmal, wenn ich den Menüpunkt wechsle läd er das Bild neu, wodurch ich sehr schnell Arbeitsspeicher verbrauche. Wäre es vllt möglich 3 SDL_Surfaces zu erstellen, in denen die 3 Hell hinterlegten Menüpunkte geladen werden (sprich einfach die 3 Bitmaps) und die nacheinander anzuzeigen? Oder könnte ich erstmal bevor ich das Bild lade, den Arbeitspeicherinhalt von "image" frei machen? (Wenn ja, wie?)

    P.S. Ich weis, es ist nicht perfekt programmiert, aber das ist grad nicht das wichtige, es würde mir schon reichen, wenn es so funktioniert wies soll.

    MFG,
    _LiFeMaKeR_.



  • Wäre es vllt möglich 3 SDL_Surfaces zu erstellen, in denen die 3 Hell hinterlegten Menüpunkte geladen werden (sprich einfach die 3 Bitmaps) und die nacheinander anzuzeigen?

    Das kannst du natürlich machen. Würde ich auch für sinnvoller halten.

    Oder könnte ich erstmal bevor ich das Bild lade, den Arbeitspeicherinhalt von "image" frei machen? (Wenn ja, wie?)

    Ich würde das nicht als "kann" bezeichnen, eher als muss.

    SDL_FreeSurface(image);
    

    ist es falls ich es richtig in Erinnerung habe.

    http://sdl.beuc.net/sdl.wiki/SDL_FreeSurface


Anmelden zum Antworten