باستخدام SDL لاستبدال الألوان باستخدام مفاتيح ألوان SDL
سؤال
أنا أعمل لعبة Roguelike بسيطة ، واستخدام 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);