باستخدام SDL لاستبدال الألوان باستخدام مفاتيح ألوان SDL

StackOverflow https://stackoverflow.com/questions/2540740

سؤال

أنا أعمل لعبة 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);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top