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:
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
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);
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):
He compilado el proyecto y me sale este mapa:
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:
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:
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]
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:
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
}
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;
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;
MapViewer:
FrameInspector (Ocultando bg0 y bg2)
Tiles:
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));
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.
El tileset no se destruye:
Incluso cambia en tiempo real cuando muevo el cursor a una ciudad.
Sé que estoy jugando con fuego y me salgo de las especificaciones de la GBA... pero, ¿alguna idea?
¡Muchas gracias![/code]