C++ Pointer will nicht SDL_Surface
lima-city → Forum → Programmiersprachen → C/C++ und D
adresse
angeben
aufrufen
bild
code
compiler
funktion
image
jemand
memory
nehmen
null
objekt
pause
pointer
sagen
teil
tun
update
zeiger
-
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; }
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
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 -
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage