2010-03-29 3 views
1

Je travaille sur un jeu de type Roguelike et utilise SDL comme affichage. Le graphique du jeu est une image de la page de codes 437, avec le fond noir et la police blanche. Au lieu d'utiliser de nombreux fichiers d'image séparés qui sont déjà colorés, je veux utiliser un fichier image, et remplacer les couleurs quand il est chargé en mémoire.Utilisation de SDL pour remplacer les couleurs à l'aide des touches de couleur SDL

Le code permettant de diviser la page de codes en une feuille de sprite fonctionne correctement, mais lorsque vous tentez d'imprimer en couleur, tout est blanc. Je l'avais fait travailler le passé, mais d'une manière ou d'une autre j'ai cassé le code en le changeant de changer la couleur à l'impression, pour changer la couleur sur la charge. Voici le code pour charger l'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]); 
    } 
} 

Le problème est avec la dernière boucle ci-dessus. Je n'arrive pas à comprendre pourquoi ça ne marche pas. Toute aide est grandement appréciée!

+0

Est-ce que "white" dans votre font.png est réellement RGB (255,255,255)? – genpfault

+0

Oui. Le blanc est FFFFFF, et le noir est 000000. –

+0

Votre dernière boucle for court sur Font [1], était-ce votre intention? – Steven

Répondre

0

J'ai résolu celui-ci tout à l'heure. Le problème provenait de la saisie des couleurs dans le mauvais ordre. Voici le code résolu:

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