Es recomendable la lectura de los artĂculos anteriores para comprender mejor el actual:
La paleta de colores de la GameBoy se compone de 4 colores, para alterarlos tan solo debemos cambiar los valores del registro BGP_REG.
Los bits del registro BGP_REG siguen un orden, segĂșn los bits que alteremos estaremos cambiando el color que representa el negro/gris oscuro/gris/transparente:
bits 0-1: Transparente
bits 2-3: Gris
bits 4-5: Gris oscuro
bits 6-7: Negro
En cada uno de los slots anteriores debemos definir un valor, segĂșn el color de representaciĂłn deseado, los colores se indican mediante sus valores binarios:
11: Negro
10: Gris oscuro
01: Gris
00: Transparente
La paleta por defecto es: 11 10 01 00
Lo que indica que para representar el negro se utilizar el color negro, para el gris oscuro el gris oscuro, para el gris el gris y para el transparente el transparente.
Por ejemplo si quisiesemos que el Gris se muestre negro, el valor serĂa: 11 10 11 00, creo que se entiende bastante fĂĄcil.
Por lo tanto para lograr un efecto de fadeout lo que haremos es ir cambiando las representaciones de los colores a negro y para el fadeout el proceso inverso.
#include <gb/gb.h>
#include <stdio.h>
#include "CyberPunkTiles.c"
#include "CyberPunkMap.c"
UINT8 i;
void fadeout(){
for(i=0; i<4; i++){
switch(i){
case 0:
// 11 10 01 00
BGP_REG = 0xE4;
break;
case 1:
// 11 11 10 01
BGP_REG = 0xF9;
break;
case 2:
// 11 11 11 10
BGP_REG = 0xFE;
break;
case 3:
// 11 11 11 11
BGP_REG = 0xFF;
break;
}
delay(110);
}
}
void fadein(){
for(i=0; i<4; i++){
switch(i){
case 0:
// 11 11 11 11
BGP_REG = 0xFF;
break;
case 1:
// 11 11 11 10
BGP_REG = 0xFE;
break;
case 2:
// 11 11 10 01
BGP_REG = 0xF9;
break;
case 3:
// 11 10 01 00
BGP_REG = 0xE4;
break;
}
delay(110);
}
}
void main(){
// grep TILESET_TILE_COUNT CyberPunkTiles.h
set_bkg_data(0, 106, TILESET);
// grep TILEMAP_ CyberPunkMap.h
set_bkg_tiles(0, 0, 20, 18, TILEMAP);
SHOW_BKG;
DISPLAY_ON;
while(1){
waitpad(J_START);
fadeout();
waitpad(J_START);
fadein();
delay(100);
}
}
Compilamos:
Cargamos la ROM en el emulador y cada vez que presionemos Start veremos el efecto: