Registrarse

[Dis - Gráficos] Bg0 desabilitada al insertar World Map de 512 tiles

Estado
Cerrado para nuevas respuestas.

Juanjo

Hacker del pasado... Compilador del presente
Miembro insignia
Hola, ¿Qué Tal?

Estaba tratando de insertar un mapa del mundo compuesto por más de 256 tiles.
Para ello, decidí separar el mapa en dos mapas: Uno para el fondo, y el segundo para el layout frontal:


DISEÑO:

FONDO:

Mi idea original era utilizar el bg3 para ser el fondo y el bg2 para ser el layout.

Para ello añadí un nuevo elemento de sFieldRegionMapBgTemplates en field_region_map.c

C:
    {
        .bg = 3
        .charBaseIndex = 1,
        .mapBaseIndex = 26,
        .screenSize = 2,
        .paletteMode = 1,
        .priority = 2,
        .baseTile = 0
    }
Este nuevo mapa utilizará el charBaseIndex1 y el mapBaseIndex26

Luego en la función FieldUpdateRegionMap() solo tuve que añadir esta línea: ShowBg(3);

C:
        case 2:
            SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);
            ShowBg(0);
            ShowBg(2);
+++++++++++ ShowBg(3);
            sFieldRegionMapHandler->state++;
            break;
Adicionalmente en region_map.c cargué el nuevo fondo como sRegionMapBg_GfxLZ2 y el mapa en bruto como sRegionMapBg_TilemapLZ2


Luego he modificado la función LoadRegionMapGfx() para forzar el uso de este nuevo tileset y mapa en el char- y mapBaseIndex (1 y 26):

C:
bool8 LoadRegionMapGfx(void)
{
    switch (gRegionMap->initStep)
    {
    case 0:
        if (gRegionMap->bgManaged){
            DecompressAndCopyTileDataToVram(gRegionMap->bgNum, sRegionMapBg_GfxLZ, 0, 0, 0);
+++++++++++ DecompressAndCopyTileDataToVram(3, sRegionMapBg_GfxLZ2, 0, 0, 0);
            }
        else{
            LZ77UnCompVram(sRegionMapBg_GfxLZ, (u16 *)BG_CHAR_ADDR(2));
+++++++++++ LZ77UnCompVram(sRegionMapBg_GfxLZ2, (u16 *)BG_CHAR_ADDR(1));}
        break;
    case 1:
        if (gRegionMap->bgManaged)
        {
            if (!FreeTempTileDataBuffersIfPossible()){
                DecompressAndCopyTileDataToVram(gRegionMap->bgNum, sRegionMapBg_TilemapLZ, 0, 0, 1);
+++++++++++ DecompressAndCopyTileDataToVram(3, sRegionMapBg_TilemapLZ2, 0, 0, 1);             
                }
        }
        else
        {
            LZ77UnCompVram(sRegionMapBg_TilemapLZ, (u16 *)BG_SCREEN_ADDR(28));
+++++++++++++ LZ77UnCompVram(sRegionMapBg_TilemapLZ2, (u16 *)BG_SCREEN_ADDR(26));
        }
        break;
He compilado el proyecto y me sale este mapa:



MapViewer:

FrameInspector (Ocultando bg0 y bg2)

Tiles:

Aparentemente, Bg3 fue mapeado correctamente pero aparece invisible :( (Aparece en el MapViewer), también el tileset parece estar bien insertado y no está superpuesto (los tilesets con errores entre los dos tilesets son solo porque el tileset de fondo es menor a 128x128)

Entonces me di cuenta de que tal vez el problema podría estar en field_region_map.c cuando se inicializan los Bgs:
C:
InitBgsFromTemplates(1, sFieldRegionMapBgTemplates, ARRAY_COUNT(sFieldRegionMapBgTemplates));
No entiendo cómo funciona estos bg (¿magia negra?). Pero cuando cambié ese 1 por un 2 obtuve esta belleza de mapa compuesto por 512 tiles... El único problema... He destruido el Bg0 incluyendo el nombre de la región y la ruta:



Ahora el visor de mapas muestra esta monstruosidad


El tileset no se destruye:

Incluso cambia en tiempo real cuando muevo el cursor a una ciudad.
Pero ahora es el Bg0 el que no quiere mostrarse....

Sé que estoy jugando con fuego y me salgo de las especificaciones de la GBA... pero, ¿alguna idea?

¡Muchas gracias![/code]
 

kakarotto

Leyenda de WaH
mode 0, Tiles, 4 layers, 256 or 16x16 colors, 1024 sprites, layers are 256x256 or 512x512 (depending on colors used(i think))

mode 1, Tiles, 1 layers, 256 colors, 256 sprites, layers are 128x128 to 1024x1024

mode 2, Tiles, 2 layers, 256 colors, 256 sprites, layers are 128x128 to 1024x1024
Al poner modo 2 en el "InitBgsFromTemplate" te pinta las dos capas del mapa, pero sólo esa dos.

Como haces showbg 0, 2 y 3 creo que te coge lo último que carga que es el 2 y el 3.

Poniendolo en modo 0 en esa función ya te toma las 4 capas incluyendo el 0 aunque quizas por las paletas de colores que usaste te de algúb problema.
 
Estado
Cerrado para nuevas respuestas.
Arriba