Использование SDL для замены цветов с помощью цветовых ключей SDL

Я работаю над простой игрой Roguelike и использую SDL в качестве дисплея. Графика для игры представляет собой изображение кодовой страницы 437 с черным фоном и белым шрифтом. Вместо того, чтобы использовать множество отдельных файлов изображений, которые уже окрашены, я хочу использовать один файл изображения и заменять цвета при его загрузке в память.

Код для разделения кодовой страницы на лист спрайтов работает правильно, но при попытке печати в цвете все выходит белым. У меня это работало в прошлом, но каким-то образом я сломал код при его изменении с изменения цвета при печати на изменение цвета при загрузке. Вот код для загрузки изображения:

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]);
    }
}

Проблема с последним циклом for выше. Я не могу понять, почему он не работает. Любая помощь приветствуется!


person Shawn Buckley    schedule 29.03.2010    source источник
comment
Является ли белый цвет в вашем font.png полным RGB (255 255 255)?   -  person genpfault    schedule 01.04.2010
comment
Да. Белый — это FFFFFF, а черный — 000000.   -  person Shawn Buckley    schedule 02.04.2010
comment
Ваш последний цикл for просто запускается на Font[1], это было вашим намерением?   -  person Steven    schedule 25.07.2010
comment
В то время да. В то время он работал на красном и черном. Я понял это, я посмотрю, смогу ли я найти решение.   -  person Shawn Buckley    schedule 10.08.2010


Ответы (1)


Я решил это некоторое время назад. Проблема возникла из-за того, что цветовая манипуляция выполнялась в неправильном порядке. Вот решенный код:

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);
person Shawn Buckley    schedule 10.08.2010