Lazy Foo tutorial 5 colorkeying not working?

any help? i am following the code given from lazyfoo’s tutorial #5 on
colorkeying and when i run it it doesnt work! :frowning: help?

here is a video of the problem :stuck_out_tongue: http://www.youtube.com/watch?v=1gjXZmHLc6k

Hi.

See http://www.libsdl.org/cgi/docwiki.cgi/SDL_BlitSurface for SDL’s
blitting algorithm. In certain circumstances, the colour key is
ignored. One of those cases is where the surface has an alpha channel.
You are loading a PNG file.

Consider in future attaching your code rather than posting a video. It
makes it easy for us to try the code on our own machines. I had to
watch very carefully to see the image names in your video.

Regards,
– BrianOn 19 August 2011 21:08, .:. .:. wrote:

any help? i ?am following the code given from lazyfoo’s tutorial #5 on
colorkeying and when i run it it doesnt work! :frowning: help?
here is a video of the problem :stuck_out_tongue: http://www.youtube.com/watch?v=1gjXZmHLc6k

thanks :smiley: but what i dont understand is that the code should work because it
was lazy foo’s and thats how he did it? oh well . . .

[code]/*This source code copyrighted by Lazy Foo’ Productions (2004-2011)

and may not be redestributed without written permission.*/

//The headers

#include “SDL/SDL.h”

#include “SDL/SDL_image.h”

#include

//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 *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" );


//If the stick figure didn't load

if( foo == NULL )

{

    return false;

}


return true;

}

void clean_up()

{

//Free the surfaces

SDL_FreeSurface( background );

SDL_FreeSurface( foo );


//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( 240, 190, foo, 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;

}[/code]
sorry for not posting the code hah my badOn Fri, Aug 19, 2011 at 6:15 PM, Brian Barrett <brian.ripoff at gmail.com>wrote:

Hi.

See http://www.libsdl.org/cgi/docwiki.cgi/SDL_BlitSurface for SDL’s
blitting algorithm. In certain circumstances, the colour key is
ignored. One of those cases is where the surface has an alpha channel.
You are loading a PNG file.

Consider in future attaching your code rather than posting a video. It
makes it easy for us to try the code on our own machines. I had to
watch very carefully to see the image names in your video.

Regards,
– Brian

On 19 August 2011 21:08, .:. .:. <@NOmNOmNOm> wrote:

any help? i am following the code given from lazyfoo’s tutorial #5 on
colorkeying and when i run it it doesnt work! :frowning: help?
here is a video of the problem :stuck_out_tongue:
http://www.youtube.com/watch?v=1gjXZmHLc6k


SDL mailing list
SDL at lists.libsdl.org
http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org

2011/8/19 .:. .:. :

thanks :smiley: but what i dont understand is that the code should work because it
was lazy foo’s and thats how he did it? oh well . . .

[code]/*This source code copyrighted by Lazy Foo’ Productions (2004-2011)

and may not be redestributed without written permission.*/

//The headers

#include “SDL/SDL.h”

#include “SDL/SDL_image.h”

#include

//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 *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” );

? ? //If the stick figure didn’t load

? ? if( foo == NULL )

? ? {

? ? ? ? return false;

? ? }

? ? return true;

}

void clean_up()

{

? ? //Free the surfaces

? ? SDL_FreeSurface( background );

? ? SDL_FreeSurface( foo );

? ? //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( 240, 190, foo, 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;

}[/code]

sorry for not posting the code hah my bad

Hi.

See http://www.libsdl.org/cgi/docwiki.cgi/SDL_BlitSurface for SDL’s
blitting algorithm. In certain circumstances, the colour key is
ignored. One of those cases is where the surface has an alpha channel.
You are loading a PNG file.

Consider in future attaching your code rather than posting a video. It
makes it easy for us to try the code on our own machines. I had to
watch very carefully to see the image names in your video.

Regards,
? ? – Brian

any help? i ?am following the code given from lazyfoo’s tutorial #5 on
colorkeying and when i run it it doesnt work! :frowning: help?
here is a video of the problem :stuck_out_tongue:
http://www.youtube.com/watch?v=1gjXZmHLc6k


SDL mailing list
SDL at lists.libsdl.org
http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org


SDL mailing list
SDL at lists.libsdl.org
http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org

Probably is what Brian said previously - you are loading png files and
the chances they have an alpha channel is fairly big, given that you
are a novice. The code is alright. Try removing the alpha channel of
the image with whatever editor you have there (i’d recomend gimp).> On Fri, Aug 19, 2011 at 6:15 PM, Brian Barrett <brian.ripoff at gmail.com> wrote:

On 19 August 2011 21:08, .:. .:. wrote:

Leonardo

Hi,

I tried the code and files from Lazy Foo’s site, it worked for me on
Windows 7. Can you check the return value of SDL_SetColorKey()? If you
remove the call to SDL_DisplayFormat() (while keeping the call to
SDL_SetColorKey()) does it work?On 20 August 2011 00:24, .:. .:. wrote:

thanks :smiley: but what i dont understand is that the code should work because it
was lazy foo’s and thats how he did it? oh well . . .