lazy foo color coding help?

Started by
5 comments, last by rip-off 14 years, 11 months ago
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;
}


Advertisement
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 lol

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

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);    // ...}

This topic is closed to new replies.

Advertisement