views:

266

answers:

1

Hey,

I am working an a simple Roguelike game, and using SDL as the display. The Graphics for the game is an image of Codepage 437, with the background being black, and the font white. Instead of using many seperate image files that are already colored, I want to use one image file, and replace the colors when it is being loaded into memory.

The code to split the codepage into a sprite sheet works properly, but when attempting to print in color, everything comes out in white. I had it working the past, but somehow I broke the code when changing it from change the color at print, to change the color on load. Here is the code to load the image:

SDL_Surface *Screen,*Font[2];
SDL_Rect Character[256];

Uint8 ScreenY,ScreenX;
Uint16 PrintX,PrintY,ScreenSizeY,ScreenSizeX;
Uint32 Color[2];

void InitDisplay()
{
    if(SDL_Init(SDL_INIT_VIDEO) == -1) { printf("SDL Init failed\n"); return; }

    ScreenSizeY = 600;
    ScreenSizeX = 800;
    Screen = SDL_SetVideoMode(ScreenSizeX,ScreenSizeY,32,SDL_HWSURFACE | SDL_RESIZABLE);
    SDL_WM_SetCaption("Alpha",NULL);

    SDL_Surface *Load;
    Load = IMG_Load("resource/font.png");
    Font[0] = SDL_DisplayFormat(Load);
    SDL_FreeSurface(Load);

    Color[0] = SDL_MapRGB(Font[0]->format,255,255,255);
    Color[1] = SDL_MapRGB(Font[0]->format,255,0,0);

    Uint8 i,j,k = 0;

    PrintX = 0;
    PrintY = 0;

    for(i = 0; i < 16; i++) { for(j = 0; j < 16; j++)
    {
        Character[k].x = PrintX;
        Character[k].y = PrintY;
        Character[k].w = 8;
        Character[k].h = 12;
        k++;
        PrintX += 8;
    } PrintX = 0; PrintY += 12; }

    PrintX = 0;
    PrintY = 0;

    for(i = 1; i < 2; i++)
    {
        Font[i] = SDL_DisplayFormat(Font[0]);
        SDL_SetColorKey(Font[i],SDL_SRCCOLORKEY,Color[i]);
        SDL_FillRect(Font[i],&Font[i]->clip_rect,Color[i]);
        SDL_BlitSurface(Font[0],NULL,Font[i],NULL);
        SDL_SetColorKey(Font[0],0,Color[0]);
    }
}

The problem is with the last for loop above. I can't figure out why it isn't working. Any help is greatly appreciated!

A: 

I solved this one a while back. The problem stemmed from doing the color keying in the wrong order. Here is the solved code:

uint8_t i;
uint8_t j;
uint8_t k = 0;

SDL_FillRect(Screen,NULL,0x00000000);

SDL_Rect Offset;
SDL_Surface *Load;
SDL_Surface *LoadFont;

Load = IMG_Load("resource/font.png");
LoadFont = SDL_DisplayFormat(Load);
SDL_FreeSurface(Load);

Offset.x = 0;
Offset.y = 0;

for(i = 0; i < 16; i++) { for(j = 0; j < 16; j++)
{
    Character[k].x = Offset.x;
    Character[k].y = Offset.y;
    Character[k].w = XWIDTH;
    Character[k].h = YHIEGHT;
    k++;
    Offset.x += XWIDTH;
} Offset.x = 0; Offset.y += 12; }

Color[0][0] = SDL_MapRGB(LoadFont->format,255,255,255);
Color[0][1] = SDL_MapRGB(LoadFont->format,96,96,96);
Color[1][0] = SDL_MapRGB(LoadFont->format,255,0,0);
Color[1][1] = SDL_MapRGB(LoadFont->format,96,0,0);
Color[2][0] = SDL_MapRGB(LoadFont->format,0,255,0);
Color[2][1] = SDL_MapRGB(LoadFont->format,0,96,0);
Color[3][0] = SDL_MapRGB(LoadFont->format,0,0,255);
Color[3][1] = SDL_MapRGB(LoadFont->format,0,0,96);
Color[4][0] = SDL_MapRGB(LoadFont->format,255,255,0);
Color[4][1] = SDL_MapRGB(LoadFont->format,96,96,0);

SDL_SetColorKey(LoadFont,SDL_SRCCOLORKEY,Color[0][0]);

for(i=0; i<6; i++) { for(j=0; j<2; j++)
{
    Font[i][j] = SDL_DisplayFormat(LoadFont);
    SDL_FillRect(Font[i][j],&Font[i][j]->clip_rect,Color[i][j]);
    SDL_BlitSurface(LoadFont,NULL,Font[i][j],NULL);
    SDL_SetColorKey(Font[i][j],SDL_SRCCOLORKEY,SDL_MapRGB(Font[i][j]->format,0,0,0));
}}

SDL_FreeSurface(LoadFont);
Shawn B