Sign in to follow this  
BlueBan007

lazy foo color coding help?

Recommended Posts

Photobucket for some reason lazy foo's color coding works on his png but no others lol at 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 lol could 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 attributes
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
const int SCREEN_BPP = 32;

//The surfaces
SDL_Surface *background = NULL;
SDL_Surface *foo = NULL;
SDL_Surface *bowser = NULL;
SDL_Surface *screen = NULL;

//The event structure
SDL_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;
}


Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
ok, Im passing colorKey, if I did it right...and its not working lol

heres what I did:

#include "SDL.h"
#include "SDL_image.h"
#include <string>

//Screen attributes
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
const int SCREEN_BPP = 32;

//The surfaces
SDL_Surface *background = NULL;
SDL_Surface *foo = NULL;
SDL_Surface *bowser = NULL;
SDL_Surface *screen = NULL;

//The event structure
SDL_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;
}

Share this post


Link to post
Share on other sites
Quote:
Original post by BlueBan007
I 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 lol



Uint32 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.)

Share this post


Link to post
Share on other sites
Quote:

ok, Im passing colorKey, if I did it right...and its not working lol

The 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);

// ...
}

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this