Registrarse

[C] FR | Mostrar Sprites en pantalla en FireRed

CompuMax

Discord: CompuMax#0425
Miembro insignia
Mostrar Sprites en pantalla en FireRed

Muchas veces hemos tratado de mostrar OBJ o Sprites en pantalla, para mostrar PSS Icons, Mugshots, Vs Sprites o simplemente mostrar imágenes de nuestros distintos sistemas.

Lamentablemente hasta ahora creo que no había una manera realmente funcional o fácil de como hacerlo. Por ello les traigo este tutorial de como hacerlo fácilmente.

He creado un sistema bastante fácil e intuitivo de usar...

¿Cómo funciona?

Sencillo, compilas en la rom 2 funciones. Una que carga los OBJ o Sprites y otra que los borra. Insertas el Sprite comprimido en LZ77 y la paleta sin comprimir, creas una tabla con la estructura: XX XX XX XX YY YY YY YY, donde, XX XX XX XX es el puntero al Sprite y YY YY YY YY el puntero a la paleta.

Adicionalmente se han asignado dichas funciones a SPECIALES libres en la FR para mayor comodidad a la hora de usar las funciones. Así que empecemos.

¿Qué necesitamos?

Primero que nada necesitan tener instalado las herramientas de desarrollador como:

- DevkitPro/ARM
- Python
- Armips
- Cygwin

Luego descargar el siguiente archivo: FR-Load_Sprites.rar

Configurando el sistema

- Descomprimir el archivo que acabamos de descargar, una vez dentro de la carpeta FR-Load_Sprite extraer el archivo "deps.zip".
- Luego, coloca tu rom Fire Red V1.0 y nómbralo "BPRE0.gba".
- Modifica la línea ".org 0x08800000" en "main.s", con una dirección libre en la rom.
- El archivo "pointer.s" dentro de de la carpeta "patches" está configurado para asignar las funciones de cargar sprites y borrarlo a los especiales 6 y 7 respectivamente (si ya los estás usando simplemente edita a tu conveniencia).
- Finalmente en la última línea del archivo "BPRE.ld" editen "spriteTable = 0x08900000;" con la dirección donde deseen insertar la tabla.
Ahora podemos construir el proyecto ejecutando "make".
Si la última línea es "Build Complete", entonces todo salió bien.
Una nueva rom llamada "Load Sprite.gba" debería haber aparecido en el directorio "build"
Deberían de obtener algo como esto:


Usándolo

Para usar el sistema vamos a tener en cuenta las siguientes consderaciones:
- Antes de usar el SPECIAL que carga los Sprites debemos configurar las variables 0x8000, 0x8001 y 0x8002 de la siguiente manera:
0x8000 = 0x(SIZE + ID), es decir, el byte más significativo representa el tamaño y el byte menos significante el ID con que identificaremos dicho Sprite. Muy bien, el tamaño viene definido de la siguiente manera:
0 representa un sprite de 8x8
1 representa un sprite de 16x16
2 representa un sprite de 32x32
3 representa un sprite de 64x64
0x8001 = 0x(INDEX),es decir, el índice del Sprite que queremos cargar ubicado en nuestra tabla donde el primer sprite en la tabla está definido con el INDEX = 0x0.
Y 0x8002 = 0x(X + Y). Al igual que la variable 0x8000 aquí vamos a configurar la posición donde vamos a cargar dicho Sprite en píxeles.

Para borrar el Sprite solo vamos a necesitar el ID y asignarlo a la variable 0x8000 antes de llamar el SPECIAL correspondiente.

A continuación unos ejempls de scripts y su uso:
Mostrar Sprites
Código:
//---------------
#org 0xC00000
lockall
setvar 0x8000 0x300
setvar 0x8001 0x0
setvar 0x8002 0x1880
special 0x6
pause 0x20
addvar 0x8000 0x1
addvar 0x8001 0x1
addvar 0x8002 0x2000
special 0x6
pause 0x20
addvar 0x8000 0x1
addvar 0x8001 0x1
addvar 0x8002 0x2000
special 0x6
pause 0x20
addvar 0x8000 0x1
addvar 0x8001 0x1
addvar 0x8002 0x2000
special 0x6
pause 0x20
addvar 0x8000 0x1
addvar 0x8001 0x1
addvar 0x8002 0x2000
special 0x6
pause 0x20
addvar 0x8000 0x1
addvar 0x8001 0x1
addvar 0x8002 0x2000
special 0x6
pause 0x20
addvar 0x8000 0x1
addvar 0x8001 0x1
addvar 0x8002 0x2000
special 0x6
pause 0x20
releaseall
end
Ocultar Sprite
Código:
//---------------
#org 0xB00000
lockall
setvar 0x8000 0x7
special 0x7
pause 0x20
subvar 0x8000 0x1
special 0x7
pause 0x20
subvar 0x8000 0x1
special 0x7
pause 0x20
subvar 0x8000 0x1
special 0x7
pause 0x20
subvar 0x8000 0x1
special 0x7
pause 0x20
subvar 0x8000 0x1
special 0x7
pause 0x20
subvar 0x8000 0x1
special 0x7
pause 0x20
subvar 0x8000 0x1
special 0x7
pause 0x20
releaseall
end

Y aquí el resultado:

Recomendaciones

Usar con el Sistema de Paletas Dinámicas de Navenatox

Finalmente al usar este sistema en conjunto con el tutorial [ASM] FR | Mostrar Imágenes a Pantalla Completa y con un poco de ingenio podemos hacer cosas como esta:


 
Última edición:

Nachoius

Caminante del cielo
Re: [FR] Mostrar Sprites

pero como nadie ha comentado esto, obviamente, solo comentan cuando es criticable y pueden sacar crédito de aquello. El ego... siempre el ego, ¡En fin!

Enhorabuena max, si bien hay varios tutos parecidos a este creo que las posibilidades son mayores por el numero de sprites. Y los resultados que tienes son increibles.

Tengo una duda, se podría usar esta rutina para un sistema de corazones a lo zelda. Que pasa si entras en batalla y luego sales, siguen estando los sprites?

ME gustaria que respondieras estas dudas, felicidades"
 

Samu

Miembro insignia
Miembro insignia
Re: [FR] Mostrar Sprites

pero como nadie ha comentado esto, obviamente, solo comentan cuando es criticable y pueden sacar crédito de aquello. El ego... siempre el ego, ¡En fin!

Enhorabuena max, si bien hay varios tutos parecidos a este creo que las posibilidades son mayores por el numero de sprites. Y los resultados que tienes son increibles.

Tengo una duda, se podría usar esta rutina para un sistema de corazones a lo zelda. Que pasa si entras en batalla y luego sales, siguen estando los sprites?

ME gustaria que respondieras estas dudas, felicidades"
Si entras en combate o haces cualquier cosa que recargue el overworld se refrescarán los objetos y desaparecerán los que hayas colocado con este sistema. A no ser de que hagas algo para asegurarte de que vuelta a cargarlos. (Acabo de espiarle el código huahuahua).

En definitiva, cualquier cosa que resetee la OAM te va a quitar los sprites. Creo que esto está más pensado para mostrar objetos durante eventos y diálogos.


@CompuMax, ya te lo he dicho por privado, pero el sistema está bien para que lo pueda usar todo el mundo. Ahora no seas huevazos y portealo a R y E, que solo hay que cambiar 4 direcciones(?).
 

KrenoZ

Pulling off deep emotions
Respuesta: [FR] Mostrar Sprites

Sin duda una de las cosas que más me ha comido la cabeza desde que empecé en el RH fue como hacer algo parecido a la cinemática de Groudon vs Kyogre en el Emerald. Cuando vi esa rutina tuya de Mostrar imágenes a pantalla completa me volví loco xD, y a pesar de que cosas así se podrían lograr ya con la rutina de vs bars de siempre, una forma alternativa como esta viene muy bien.

Además... *redoble de tambores* !ES LA MEJOR FORMA DE CARGAR MUGSHOTS! Va perfecto con paletas dinámicas e imagino que no debe haber bugs con el DNS.

Un aporte buenísimo, seguro que lo uso.
 

Nachoius

Caminante del cielo
Re: [FR] Mostrar Sprites

Si entras en combate o haces cualquier cosa que recargue el overworld se refrescarán los objetos y desaparecerán los que hayas colocado con este sistema. A no ser de que hagas algo para asegurarte de que vuelta a cargarlos. (Acabo de espiarle el código huahuahua).

En definitiva, cualquier cosa que resetee la OAM te va a quitar los sprites. Creo que esto está más pensado para mostrar objetos durante eventos y diálogos.


@CompuMax, ya te lo he dicho por privado, pero el sistema está bien para que lo pueda usar todo el mundo. Ahora no seas huevazos y portealo a R y E, que solo hay que cambiar 4 direcciones(?).
perfecto, con la rutina de pasos, puedo hacer que se muestre el script que quiero en cada paso según el parametro que me guste (por ejemplo los puntos de salud) el problema es que ya habia logrado hacerlo con otro tutorial de mostrar imagenes, pero tengo el siguiente problema.

Al mostrar una imagen se "paraliza" el juego al menos un instante y queda poco natural, digamos que no fluye, no puedes seguir caminando con normalidad, y deja todo en "lock" por un seg para cargar la imagen.

¿pasará lo mismo con esta rutina? hay forma de hacerlo que todo fluya y no se congele? De ser así sería hermoso.
 

Gold

Porrero a tiempo parcial
Miembro insignia
Respuesta: FR | Mostrar Sprites

Pues era lo que me faltaba para hacerme un sistema bien chula para hacer cinemáticas baratas.



+1000 por el aportazo

PD: ¿Es necesario cygwin? Powershell lo compiló sin problemas.
 

Nachoius

Caminante del cielo
Hola necesito saber si estos "objetos" que se crean tiene la capacidad de moverse como minis dentro del juego.
Me gustaría literalmente CREAR minis, para moverlos a placer. NO puedo usar un OW que ya esté en el mapa, por la limitación del RANGO de OAM.

Con esto podria crear uno que se pueda mover? ya que con createsprite es fijo y no permite moverlo de un lugar a otro.
 

Samu

Miembro insignia
Miembro insignia
Hola necesito saber si estos "objetos" que se crean tiene la capacidad de moverse como minis dentro del juego.
Me gustaría literalmente CREAR minis, para moverlos a placer. NO puedo usar un OW que ya esté en el mapa, por la limitación del RANGO de OAM.

Con esto podria crear uno que se pueda mover? ya que con createsprite es fijo y no permite moverlo de un lugar a otro.
Básicamente tienes que hacer funciones para extender el funcionamiento del sistema que usa CompuMax. Lo que tienes que hacer es almacenar de alguna manera el id de la posición en la que se almacena el sprite/objeto en lo que compu llama spriteIds (gSprites en decompilación). El valor del id lo puedes almacenar donde te de la gana (una variable o EWRAM en crudo). Ese valor usas de la siguiente forma para acceder a la posición x/y y modificarla.

Código:
spriteIds[id].oam.x
spriteIds[id].oam.y
 
Arriba