Hey guys I can't figure out how to get the sdl colorkey to work, I've tried to find a tutorial on it, but nothing seemed to make sense.

if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
                {
                    printf( "Unable to init SDL: %s\n", SDL_GetError() );
                    return 1;
                }

            // make sure SDL cleans up before exit

            atexit(SDL_Quit);
            SDL_Surface* screen = SDL_SetVideoMode(640, 480, 16,
                                           SDL_HWSURFACE|SDL_DOUBLEBUF);

            if ( !screen )
                {
                    printf("Unable to set 640x480 video: %s\n", SDL_GetError());
                    return 1;
                }

            SDL_WM_SetCaption( "Battle Pong!", NULL );

            // load an image

            SDL_Surface* bmp = SDL_LoadBMP("pong.bmp");
            if(SDL_SetColorKey(bmp, SDL_SRCCOLORKEY | SDL_RLEACCEL, SDL_MapRGB(bmp->format, 0, 0 ,0)) == -1)
            fprintf(stderr, "Warning: colorkey will not be used, reason: %s\n", SDL_GetError());
            }

Gives me an error at the maprrgb function, it just says error at this point.

What am I doing wrong?

Thanks,


Joe

Recommended Answers

All 4 Replies

Since no one here is answering the post, could a moderator please move it to the game dev forum?

moved, but I don't know if it will help.

Are you getting a compiler error or a runtime error? I get a compiler error if I try to build that:

if(SDL_SetColorKey(bmp, SDL_SRCCOLORKEY | SDL_RLEACCEL, SDL_MapRGB(bmp->format, 0, 0 ,0)) == -1)
//<----THERE SHOULD BE AN OPENING BRACE
            fprintf(stderr, "Warning: colorkey will not be used, reason: %s\n", SDL_GetError());
            } //<---- OR NO CLOSING BRACE

But, that might just be because you've pasted the body of a function/block and missed the opening brace from the start of the function/block....

I don't get any runtime error once I successfully compile; if you're getting a runtime error, try taking out the SDL_MapRGB(bmp->format, 0, 0 ,0) and replacing it with 0. Based on literature here: http://docs.mandragor.org/files/Common_libs_documentation/SDL/SDL_Documentation_project_en/sdlpixelformat.html, I reckon it's a safe bet that RGB 0, 0, 0 will usually be 'color key' 0, UNLESS you're using a palleted bitmap.. Try it, see if it works and if you get the right effect... Also, check if the bitmap was successfully loaded before trying to access bitmap->format. I got a segfault the first time I ran that, because I didn't have a pong.bmp file.. Do a check like:

SDL_Surface* bmp = SDL_LoadBMP("pong.bmp");
if( bmp == NULL )
{
  cerr << "Bitmap didn't load: " << SDL_GetError(); 
  return 387;
}

heres a function that should work:

SDL_Surface* getImage(string filename, int r=255, int g=0, int b=198) 
{
    SDL_Surface* loadedImage=0;
    SDL_Surface* optimizedImage=0;
    
    loadedImage=IMG_Load(filename.c_str());
    optimizedImage = SDL_DisplayFormat(loadedImage);
    SDL_FreeSurface(loadedImage);
    
    Uint32 colorkey=SDL_MapRGB(optimizedImage->format, r, g, b);
    SDL_SetColorKey(optimizedImage, SDL_RLEACCEL | SDL_SRCCOLORKEY, colorkey);

    return optimizedImage;
}
Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.