kostenloser Webspace werbefrei: lima-city


C++ Pointer will nicht SDL_Surface

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    q*****4

    Hallo,
    vielleicht kann mir jemand von euch weiter helfen.

    Ich habe ein Problem, soweit ich das vermute liegt es am SDL_Surface Pointer in der Funktion "loadJPG()"
    Wenn ich diesen Teil an die Stelle packe, an der loadJPG aufgerufen wird geht es, aber so wie ich es gebaut habe
    funktioniert es nicht. Da wird dann nur ein schwarzer Bildschim angezeigt ohne das Bild.

    Kann mir jeamnd sagen, wie ich das sf_img korrekt übergebe?

    #include "SDL/SDL.h"
    #include "SDL/SDL_image.h"
    
    bool loadJPG(const SDL_Surface* sf_img, const char* imgpath){
    	//Load image 
    	SDL_Surface*  loaded_image = NULL;
    	SDL_RWops*    rwop        = NULL;
    	printf("Loading Image: %s\n", imgpath);
    	rwop=SDL_RWFromFile(imgpath, "rb");
    	loaded_image=IMG_LoadJPG_RW(rwop);
    	if(!loaded_image) {
    		printf("Faild to load Image: '%s'. IMG_LoadJPG_RW returned Error: %s\n", imgpath, IMG_GetError() );
    		return false;
    	}
    	//Create an optimized image 
    	sf_img = SDL_DisplayFormat( loaded_image );
    	return true;
    }
    	
    int main(int argc, char* args[]) { 
    	//Start SDL 
    	SDL_Init( SDL_INIT_EVERYTHING ); 
    	
    	//The images 
    	
    	SDL_Surface* screen = NULL;
    	
    	//Set up screen 
    	screen = SDL_SetVideoMode( 640, 480, 32, SDL_SWSURFACE );
    	
    	SDL_Surface* splash = NULL; 
    	bool rc=loadJPG(splash, "../gfx/sdl.jpg" );
    
    	
        if (rc){
    		//Apply image to screen 
    		printf("rc=true\n");
    		SDL_BlitSurface( splash, NULL, screen, NULL );
    	}
    	
    	//Update Screen 
    	SDL_Flip( screen );
    	
    	//Pause 
    	SDL_Delay( 2000 );
    	
    	//Free the loaded image 
    	SDL_FreeSurface( splash );
    	
    	//Quit SDL 
    	SDL_Quit(); 
    	
    	return 0; 
    }
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. g****e

    Auf die schnelle würde ich mal behaupten, dass dashier:
    bool loadJPG(const SDL_Surface* sf_img, const char* imgpath){

    lieber geändert werden sollte in:
    bool loadJPG(SDL_Surface* sf_img, const char* imgpath){

    Auch wenn ich nich sicher bin, ob das hilft, denn ich kenne SDL nicht, aber hier
    sf_img = SDL_DisplayFormat( loaded_image );

    Versuchst du dem Pointer ein neues Objekt zuzuweisen, wenn ich nicht irre. Das sollte eigentlich der Compiler schon bemeckern, G++ würd es tun, aber wer weiß.
    Würde ich mal versuchen, das const weg zu nehmen.

    Liebe Grüße
  4. Hallo qwertz4,

    wenn Du den Zeiger als Ausgabeparameter haben willst, dann musst Du die Adresse in welcher der Zeiger gespeichert werden soll übergeben:
    bool loadJPG(SDL_Surface ** sf_img, const char* imgpath){
      //Load image 
      SDL_Surface*  loaded_image = NULL;
      SDL_RWops*    rwop        = NULL;
      printf("Loading Image: %s\n", imgpath);
      rwop=SDL_RWFromFile(imgpath, "rb");
      loaded_image=IMG_LoadJPG_RW(rwop);
      if(!loaded_image) {
        printf("Faild to load Image: '%s'. IMG_LoadJPG_RW returned Error: %s\n", imgpath, IMG_GetError() );
        return false;
      }
      //Create an optimized image 
      *sf_img = SDL_DisplayFormat( loaded_image );
      SDL_FreeSurface(loaded_image);
      SDL_FreeRW(rwop);
      return true;
    }
    Aufrufen musst Du es dann mit
    bool rc=loadJPG(&splash, "../gfx/sdl.jpg" );
    Alternativ kannst Du aber auch einfach den Zeiger als Rückgabewert angeben:
    SDL_Surface * loadJPG(const char* imgpath){
      //Load image 
      SDL_Surface*  loaded_image, result;
      SDL_RWops*    rwop        = NULL;
      printf("Loading Image: %s\n", imgpath);
      rwop=SDL_RWFromFile(imgpath, "rb");
      loaded_image=IMG_LoadJPG_RW(rwop);
      if(!loaded_image) {
        printf("Faild to load Image: '%s'. IMG_LoadJPG_RW returned Error: %s\n", imgpath, IMG_GetError() );
        return NULL;
      }
      //Create an optimized image 
      result = SDL_DisplayFormat( loaded_image );
      SDL_FreeSurface(loaded_image);
      SDL_FreeRW(rwop);
      return result;
    }
    und es so aufrufen:
    splash = loadJPG("../gfx/sdl.jpg" );
    
    if(splash != NULL)
    {
      ...
    }


    Edit: Habe SDL_FreeRW() und SDL_FreeSurface() hinzugefügt wegen Memory-Leak.




    Beitrag zuletzt geändert: 6.9.2012 22:31:12 von darkpandemic
  5. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!