Registrarse

[Decomp-GBA] Cargar Textbox por PARTES con Tilesets de 240 colores o menos.

Hoennwalker

Usuario de platino
¡Muy buenas de nuevo! En este tutorial vais a aprender a cargar un mensaje de texto por partes.

De nuevo vuelvo a decir que si no sabes configurar backgrounds ni organizar la interfaz en tasks, no vas a sacar provecho de este tutorial, pero el código lo voy a dejar explicado, para que cuando regreses con esas bases, lo entiendas. Y decía sacar provecho porque realmente puedes lanzar un mensaje de texto sólo configurando un WindowTemplate pero no tiene ningún sentido. Si quieres saber cómo configurar un WindowTemplate ve a mi tutorial Printear Texto sin Textbox, cambiar fuente, colores de texto y sombra.

Te vas a preguntar qué utilidad puede tener esto. Pues bien, si deseas manejarte con backgrounds y mostrar mensajes de texto, deberías saber que el hardware de GBA tiene un espacio limitado para los backgrounds. Por tanto muchas veces necesitarás cargar los gráficos y la paleta en una zona de la memoria que no esté ocupando el tileset que has configurado. Este tutorial va a resultarte muy útil cuando compruebes la barbaridad que ocupan los tilesets de 240 colores.

Primero vamos echar un vistazo a este ejemplo viendo los tiles con mGBA:
1617739375848.png


Partes intervinientes:

1617740573073.png
Es el texto y el tilemap.
1617740615309.png
Los gráficos del msgbox.
1617740707377.png
El tileset que cargo en el Bg1 junto a su tilemap... Aunque es tan pesado que ocupa parte del 2... y del 3...

Como has podido ver nada se solapa, eso es lo que hay que buscar siempre. ¿Cómo se hace? Lo primero copia el siguiente código en tu fichero.c:
C:
static void ShowDialogueWindow(u8 windowId, u8 copyToVram);
const u8 gText[] = _("Prueba de texto.\p");

static void ShowDialogueWindow(u8 windowId, u8 copyToVram)
{
    CallWindowFunction(windowId, NewGameBirchSpeech_CreateDialogueWindowBorder);
    FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
    PutWindowTilemap(windowId);
    if (copyToVram == TRUE)
        CopyWindowToVram(windowId, 3);
}
static void Task_msgbox(u8 taskId)
{
    InitWindows(gTextWindows);
    LoadMessageBoxGfx(WINDOW, 0xFC, 0xF0);
    ShowDialogueWindow(0, 1);
    StringExpandPlaceholders(gStringVar4, gText);
    AddTextPrinterForMessage(1);
}
Voy a explicarlo todo ahora por medio de los parámetros que se han introducido:

C:
InitWindows(gTextWindows); // Inicializa los windows que se configuran en el WindowsTemplate, nos permiten mostrar el  window.
C:
LoadMessageBoxGfx(WINDOW, 0xFC, 0xF0);
El primer parámetro es el window del array WindowTemplate que usaremos para el msgbox. Para una explicación más exacta ver el tutorial que he mencionado antes.

El segundo parámetro: 0xFC ó 252, es precisamente el Tile Nº 252, el lugar de la memoria donde cargamos los gráficos del msgbox. Este es el principal, deberás cambiar el Tile según el espacio que necesites. En mi caso si aumento el Nº de Tile acabaría solapando con mi Bg1 y no queremos eso. Observa a la izquierda en el offset del tile para que compruebes Tile Nº 252:
1617741542237.png


El tercer parámetro: 0xF0 ó 240 es el índice de la paleta de los backgrounds donde vamos a cargar la paleta del msgbox, es decir la última paleta de 16 colores ya que este Bg tiene 240 colores. Debes indexarlo en 256 colores y borrar el último slot de 16 colores con CMP, y no te preocupes, te adaptará la imagen y con ello dejarás el slot libre para la paleta del msgbox:

1617741834431.png


C:
ShowDialogueWindow(WINDOW, 1);
El primer parámetro es el windowId y el segundo parámetro es el booleano CopyToVram. Para una explicación más exacta ver el tutorial que he mencionado antes.

C:
StringExpandPlaceholders(gStringVar4, gText);
Nos interesa el segundo parámetro que es el texto: const u8 gText[] = _("Prueba de texto.\p");

C:
AddTextPrinterForMessage(1);
La anterior configura colores y fuentes del texto, el parámetro es un booleano con valor 1 (TRUE) permite acelerar el printeo del texto pulsando un botón, en 0 no. Para una explicación más exacta ver el tutorial que he mencionado antes.

El resultado es el siguiente, un fondo con todo detalle de 240 colores y un msgbox:

1617742273121.png

MUY MUY MUY...... MUY IMPORTANTE, si no creas el task para cerrar el msgbox, el texto NO carga en el textbox. OJO. Para saber cómo crearlo ve al tuto que he puesto al principio.
 
Última edición:

kakarotto

Leyenda de WaH
Currazo mi buen caminante hoenniano. Perfecto para aquellos que empiezan y recordad yo a veces las cositas que siempre se olvidan.

A seguir.
 

Kaktus

Miembro insignia
Miembro insignia
Currazo mi buen caminante hoenniano. Perfecto para aquellos que empiezan y recordad yo a veces las cositas que siempre se olvidan.

A seguir.
¿Estás bien bro? creo que estabas un poco perjudicado cuando escribiste este mensaje xD

Y otro grandísimo aporte. Muy buena Hoenn. Como dice (o intenta decir) nuestro amigo y vecino kakarotto. Es útil para los que empiezan, y también para los que ya tenemos experiencia. Tener estos procesos algo más largos documentados es una fucking gozada. 10/10.
 
Arriba