Esta pagina se ve mejor con JavaScript habilitado

GameBoy Dev06: Fadeout/Fadein effect

 ·  🎃 kr0m

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.

vi 06.c
#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:

~/GBDEV/gbdk/bin/lcc 06.c -o 06.gb

Cargamos la ROM en el emulador y cada vez que presionemos Start veremos el efecto:

Si te ha gustado el artĂ­culo puedes invitarme a un RedBull aquĂ­