使用SDL使用SDL颜色键替换颜色
题
我正在工作一个简单的Roguel -Game,并使用SDL作为显示。游戏的图形是CodePage 437的图像,背景为黑色和字体白色。我不使用许多已经有色的单独图像文件,而是想使用一个图像文件,并在将其加载到内存中时更换颜色。
将CodePage分为精灵表的代码正常工作,但是当尝试以彩色打印时,一切都以白色出现。我在过去工作,但是在更改颜色时,我以某种方式打破了代码,以更改负载时的颜色。这是加载图像的代码:
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]);
}
}
问题在于上面的最后一个循环。我不知道为什么它不起作用。任何帮助是极大的赞赏!
解决方案
我不久前解决了这个问题。问题源于以错误的顺序进行颜色键合。这是解决的代码:
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);
不隶属于 StackOverflow