   lazy foo color coding help?
for some reason lazy foo's color coding works on his png but no others lolat least not for me...I thought I under stood that the:if( optimizedImage != NULL )   {  //Map the color key  Uint32 colorkey = SDL_MapRGB( optimizedImage->format, 0, 0xFF, 0xFF );  //Set all pixels of color R 0, G 0xFF, B 0xFF to be transparent  SDL_SetColorKey( optimizedImage, SDL_SRCCOLORKEY, colorkey );   }    }part of the loadimage method got the color of the background of the image and then set that color to 100% alpha...obviously im doing something wrong lolcould anyone point out my mistake?btw for ref, heres the entire lazy foo code with mine implemented, just the bowser calls.#include "SDL.h"#include "SDL_image.h"#include <string>//Screen attributesconst int SCREEN_WIDTH = 640;const int SCREEN_HEIGHT = 480;const int SCREEN_BPP = 32;//The surfacesSDL_Surface *background = NULL;SDL_Surface *foo = NULL;SDL_Surface *bowser = NULL;SDL_Surface *screen = NULL;//The event structureSDL_Event event;SDL_Surface *load_image( std::string filename ){    //The image that's loaded    SDL_Surface* loadedImage = NULL;    //The optimized image that will be used    SDL_Surface* optimizedImage = NULL;    //Load the image    loadedImage = IMG_Load( filename.c_str() );    //If the image loaded    if( loadedImage != NULL )    {   //Create an optimized image   optimizedImage = SDL_DisplayFormat( loadedImage );   //Free the old image   SDL_FreeSurface( loadedImage );   //If the image was optimized just fine   if( optimizedImage != NULL )   {  //Map the color key  Uint32 colorkey = SDL_MapRGB( optimizedImage->format, 0, 0xFF, 0xFF );  //Set all pixels of color R 0, G 0xFF, B 0xFF to be transparent  SDL_SetColorKey( optimizedImage, SDL_SRCCOLORKEY, colorkey );   }    }    //Return the optimized image    return optimizedImage;}void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination ){    //Temporary rectangle to hold the offsets    SDL_Rect offset;    //Get the offsets    offset.x = x;    offset.y = y;    //Blit the surface    SDL_BlitSurface( source, NULL, destination, &offset );}bool init(){    //Initialize all SDL subsystems    if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )    {   return 1;    }    //Set up the screen    screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE );    //If there was an error in setting up the screen    if( screen == NULL )    {   return 1;    }    //Set the window caption    SDL_WM_SetCaption( "Foo says \"Hello!\"", NULL );    //If everything initialized fine    return true;}bool load_files(){    //Load the background image    background = load_image( "background.png" );    //If the background didn't load    if( background == NULL )    {   return false;    }    //Load the stick figure    foo = load_image( "foo.png" );bowser = load_image( "bowser.png" );    //If the stick figure didn't load    if( foo == NULL||bowser == NULL )    {   return false;    }    return true;}void clean_up(){    //Free the surfaces    SDL_FreeSurface( background );    SDL_FreeSurface( foo );SDL_FreeSurface( bowser );    //Quit SDL    SDL_Quit();}int main( int argc, char* args[] ){    //Quit flag    bool quit = false;    //Initialize    if( init() == false )    {   return 1;    }    //Load the files    if( load_files() == false )    {   return 1;    }    //Apply the surfaces to the screen    apply_surface( 0, 0, background, screen );    apply_surface( 40, 190, foo, screen );apply_surface( 340, 190, bowser, screen );    //Update the screen    if( SDL_Flip( screen ) == -1 )    {   return 1;    }    //While the user hasn't quit    while( quit == false )    {   //While there's events to handle   while( SDL_PollEvent( &event ) )   {  //If the user has Xed out the window  if( event.type == SDL_QUIT )  { //Quit the program quit = true;  }   }    }    //Free the surfaces and quit SDL    clean_up();    return 0;}
Quote:part of the loadimage method got the color of the background of the image and then set that color to 100% alpha...Nope.It assumes the colour RGB (0, 255, 255), a light blue, is the background colour. Images with different background colours will not have a different colourkey.One way to make this work is to standardise the colourkey pixel across all your images. Another is to pass the colourkey to the load_image function, so that different surfaces can have different colourkeys.   ;  Looks like the answer is right there in the first comment.  //Set all pixels of color R 0, G 0xFF, B 0xFF to be transparent   ;  ok, Im passing colorKey, if I did it right...and its not working lolheres what I did:#include "SDL.h"#include "SDL_image.h"#include <string>//Screen attributesconst int SCREEN_WIDTH = 640;const int SCREEN_HEIGHT = 480;const int SCREEN_BPP = 32;//The surfacesSDL_Surface *background = NULL;SDL_Surface *foo = NULL;SDL_Surface *bowser = NULL;SDL_Surface *screen = NULL;//The event structureSDL_Event event;Uint32 colorkey;SDL_Surface *load_image( std::string filename, Uint32 &colorkey ){    //The image that's loaded    SDL_Surface* loadedImage = NULL;    //The optimized image that will be used    SDL_Surface* optimizedImage = NULL;    //Load the image    loadedImage = IMG_Load( filename.c_str() );    //If the image loaded    if( loadedImage != NULL )    {   //Create an optimized image   optimizedImage = SDL_DisplayFormat( loadedImage );   //Free the old image   SDL_FreeSurface( loadedImage );   //If the image was optimized just fine   if( optimizedImage != NULL )   {  //Map the color key  colorkey = SDL_MapRGB( optimizedImage->format, 0, 0xFF, 0xFF );  //Set all pixels of color R 0, G 0xFF, B 0xFF to be transparent  SDL_SetColorKey( optimizedImage, SDL_SRCCOLORKEY, colorkey );   }    }    //Return the optimized image    return optimizedImage;}void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination ){    //Temporary rectangle to hold the offsets    SDL_Rect offset;    //Get the offsets    offset.x = x;    offset.y = y;    //Blit the surface    SDL_BlitSurface( source, NULL, destination, &offset );}bool init(){    //Initialize all SDL subsystems    if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )    {   return 1;    }    //Set up the screen    screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE );    //If there was an error in setting up the screen    if( screen == NULL )    {   return 1;    }    //Set the window caption    SDL_WM_SetCaption( "Foo says \"Hello!\"", NULL );    //If everything initialized fine    return true;}bool load_files(){    //Load the background image    background = load_image( "background.png",colorkey );    //If the background didn't load    if( background == NULL )    {   return false;    }    //Load the stick figure    foo = load_image( "foo.png",colorkey );bowser = load_image( "bowser.png",colorkey );    //If the stick figure didn't load    if( foo == NULL||bowser == NULL )    {   return false;    }    return true;}void clean_up(){    //Free the surfaces    SDL_FreeSurface( background );    SDL_FreeSurface( foo );SDL_FreeSurface( bowser );    //Quit SDL    SDL_Quit();}int main( int argc, char* args[] ){    //Quit flag    bool quit = false;    //Initialize    if( init() == false )    {   return 1;    }    //Load the files    if( load_files() == false )    {   return 1;    }    //Apply the surfaces to the screen    apply_surface( 0, 0, background, screen );    apply_surface( 40, 190, foo, screen );apply_surface( 340, 190, bowser, screen );    //Update the screen    if( SDL_Flip( screen ) == -1 )    {   return 1;    }    //While the user hasn't quit    while( quit == false )    {   //While there's events to handle   while( SDL_PollEvent( &event ) )   {  //If the user has Xed out the window  if( event.type == SDL_QUIT )  { //Quit the program quit = true;  }   }    }    //Free the surfaces and quit SDL    clean_up();    return 0;};  nvm..totally didnt realize the whole 0xFF was hex and 255 and etc..sorry   ;Quote:Original post by BlueBan007I thought I under stood that the:*** Source Snippet Removed ***part of the loadimage method got the color of the background of the image and then set that color to 100% alpha...obviously im doing something wrong lolUint32 colorkey = SDL_MapRGB( optimizedImage->format, 0, 0xFF, 0xFF );//  ^  ^^^^  ^^^^SDL_SetColorKey( optimizedImage, SDL_SRCCOLORKEY, colorkey );//   ^^^^^^^^SDL is not magic. It can't decide for you what the background colour should be. You tell it what the background colour should be, by using the SDL_MapRGB() call to create a 'colorkey' value, and then passing that value to SDL_SetColorKey. The parameters indicate the red, green and blue components of the expected background colour. (The reason you have to call this function is so that it can translate those components into a single value, taking into account the bit depth of the image.) Here, you've specified a red component of 0 and green and blue components of 0xff (equal to 255, i.e. the maximum), i.e. cyan. Your image apparently has a white background, so you would specify 0xff for each colour component. (If that doesn't seem right to you, or if you've never heard of "cyan", you need to read this.);Quote:ok, Im passing colorKey, if I did it right...and its not working lolThe problem is that you pass a reference to a Uint32 into the function, and overwrite it in the function.My suggestion is to implement this function:// SDL_Color is a structure with red, blue and green components.SDL_Surface *load_image( std::string filename, const SDL_Color &colorkey );// An example of calling this function would be:int main(){    // init SDL etc...    SDL_Color cyan = {0x00, 0xff, 0xff};    SDL_Color white = {0,0,0};    SDL_Surface *bowser = load_image("bowser.png", white);    SDL_Surface *stickMan = load_image("stick_man.png", cyan);    // ...}