Registrarse

[Rutina] [ASM] Mostrar sprites animados.

Invert

why so serious?
Hola a todos gente.
Hace poco he estado haciendo las rutinas que le faltan a mi hack, y esta es aparentemente la última, pero sé que será de mucha utilidad así que la comparto con ustedes.
Cabe decir que no hice el codigo desde 0, solo edite la carga de mugshots del tutorial que posteó @~Ruki! en el foro, este.
Y apartir de ahí la he mejorado.
He aquí el codigo.
Código:
.align 2
.thumb

.equ TABLE, 0x08900000
.equ DEST, 0x06014000
.equ BUFFER, 0x020377F8
.equ CREATEOAM, 0x08006F8D
.equ OAMNUM, 0x0203C000
.equ VAR, 0x4500
.equ VARDEC, 0x0806E455
.equ OAMBUFFER, 0x0202063C

READING:
push {r0-r7, lr}
ldrh r0, =VAR
ldr r4, =VARDEC
bl EXECUTE
ldrb r5, [r0]
mov r2, #0xC
mul r5, r2
ldr r1, =TABLE
add r5, r5, r1
ldr r6, [r5]    
ldrh r0, =VAR    
add r0, r0, #0x2
bl EXECUTE
ldrb r0, [r0]
mov r7, r0    
mov r2, #0x80
lsl r2, r2, #0x4
mul r0, r0, r2
ldr r3, =DEST
add r3, r3, r0
mov r0, r6
mov r1, r3
swi 0x12
add r5, r5, #0x4   
ldr r0, [r5]
add r5, r5, #0x4
ldrb r1, [r5]
ldr r5, =OAMNUM    
add r5, r5, #0x4F
strb r1, [r5]
mov r2, #0x20
mul r1, r2
ldr r3, =BUFFER
add r1, r1, r3
lsr r2, r2, #0x2
swi 0xC

LOADOBJ:
ldr r0, DATA
ldr r1, =0x20370C2
mov r5, r1
ldrh r1, [r1] 
LSL    R1, R1, #0x13   
mov r2, #0xa0
lsl r2, r2, #0x0e
add r1, r1, r2
asr r1, r1, #0x10
ldr r7, =0x20370c4
ldrh r2, [r7, #0x0]
lsl r2, r2, #0x13
mov r3, #0xa0
lsl r3, r3, #0x0e
add r2,r2,r3
asr r2, r2, #0x10
mov r3, #0x0
ldr r4, =CREATEOAM
bl EXECUTE
ldr r1, =OAMNUM
add r1, r1, r7
strb r0, [r1]
ldr r2, =OAMBUFFER
mov r1, #0x44
mul r0, r0, r1
add r0, r0, r2
add r0, r0, #0x5
ldr r3, =OAMNUM
add r3, r3, #0x4F
ldrb r1, [r3]
lsl r1, r1, #0x4
strb r1, [r0]
pop {r0-r7}
pop {pc}

EXECUTE:
bx r4

.align 2
DATA: .word BUFFERDATA + 0x08811f20
BUFFERDATA:
.hword 0x2
.hword 0x1
.word OAMDATA + 0x08811f20
.word ANIMATION + 0x08811f20
.word 0x0
.word 0x08231CFC
.word 0x080EE4DD
.byte 0xFF

.align 2
ANIMATION: .word OAMANIM + 0x08811f20
OAMANIM:
.hword 0x201
.hword 0xf
.hword 0x241
.hword 0xf
.hword 0xFFFE
.hword 0x0

.align 2
OAMDATA:
.byte 0x0
.byte 0x0
.byte 0x0
.byte 0xC0
.hword 0x1
.hword 0x0
Esa rutina puede mostrar hasta 10 frames, pero allí está configurada para 2.
¿Cómo mostrar más frames?
Estás líneas tienen la respuesta, agradezco a @jiangzhengwenjz por enseñarme todo esto del OAM que es tan difícil de entender para mí.

OAMANIM:
.hword 0x201
.hword 0xf
.hword 0x241
.hword 0xf
.hword 0xFFFE
.hword 0x0

------------------------
------------------------
.hword 0x201
.hword 0xf

hword 0x201: Nos dice el numero de la frame
.hword 0xf: Esta parte es muy compleja pero cambia la velocidad en que se muestran las frames.

Cada frame tiene 40 bytes de longitud, así que si la primera frame vale 201, en la segunda tendré que poner 241 como le he puesto, si pondré una tercera frame tendré que poner 281.
y recuerden, despues debe ir el comando de la velocidad.
Ejemplo de 3 frames:
OAMANIM:
.hword 0x201
.hword 0xf
.hword 0x241
.hword 0xf
.hword 0x281
.hword 0xf
.hword 0xFFFE
.hword 0x0

¿Cómo inserto una imagen animada?
Solo basta con poner una imagen según su tamaño.
Ejemplo, si la imagen es de 2 frames hago una imagen de 64x128. En los primeros 64x64 irá la primera frame y en los otros 64x64 irá la segunda.

¿Cómo usar la rutina?
Debemos usar lo siguiente:
setvar 0x4500 0x5 @_carga la imagen 5
setvar 0x8005 0x5 @posición x de la imagen
setvar 0x8006 0x5 @posición y de la imagen
callasm 0x @rutina.

Bien, basicamente aún falta desaparecer la imagen xD.
Lo he estado intentando pero no se me da, pero editaré el post si lo consigo más adelante.
Recuerden cambiar los bytes de la tabla y lo demás como dice el post de @~Ruki!, simplemente la configuración de la tabla es igual.
 

Kaktus

Miembro insignia
Miembro insignia
Yo ya tenía esta rutina, que me la pasaste tú, puto, así que, de todas formas, se agradece que la postees aquí y quieras compartirla con todos para una mejor experiencia en futuros juegos ^^
 

eing

Miembro de honor
Miembro de honor
Muy buen tutorial, aunque estoy algo oxidado haja
Respecto a lo que comentas de borrar la imagen, porque no la borras de la VRAM y ya está? (0x05XXYYZZ)
 

Nachoius

Caminante del cielo
Pq nadie comenta esto, abre infinitas posibilidades con un poco de imaginacion 0w0 puede ser hasta Un articuno volando en bucle si necesidad de gastar un mini, o hasta un sistema de teletransportacion con brillos, sinceramente mis 10, que corra la imaginacion!
 
Arriba