Postby Javi Perez » Tue, 30 Jun 2015, 10:04
Gracias Nathan por tu respuesta y disculpa el retraso en responder.
Efectivamente como dices SP1 espera que los datos de los sprites sigan un formato concreto para que las funciones de renderizado se los puedan tragar. He estado haciendo experimentos para representar sprites de tamaños poco estándar (3 caracteres de ancho por 6 de alto) y el formato que he encontrado válido es:
$this->bbcode_second_pass_code('', '
; GRAPHIC DATA :
; Pixel Size : (24, 48)
; Char Size : (3, 6)
; Sort Priorities : Mask, Char line, Y char, X char
; Data Outputted : Gfx
; Interleave: Sprite
; Mask: Yes, before graphic
')
Por otro lado, cada columna ha de terminar con un carácter en blanco, que se puede añadir desde SevenuP a la hora de dibujar un sprite, o simplemente a mano incluyendo un bloque de 16 bytes de la forma:
$this->bbcode_second_pass_code('', '
DEFB 255, 0, 255, 0, 255, 0, 255, 0
DEFB 255, 0, 255, 0, 255, 0, 255, 0
')
De esta forma, la forma en la que se exportaría el sprite de 24x48 píxeles en asm sería:
$this->bbcode_second_pass_code('', '
._sprite_prota
; Primera columna
DEFB 0, 0, 0, 0, 0, 63, 0, 63
DEFB 0, 63, 0, 30, 0, 30, 0, 31
DEFB 0, 255, 0, 158, 0, 159, 0, 159
DEFB 0, 223, 0, 95, 0, 95, 0, 95
DEFB 0, 127, 0, 24, 0, 57, 0, 60
DEFB 0, 62, 0, 62, 0, 63, 0, 63
DEFB 0, 14, 0, 7, 0, 7, 0, 7
DEFB 0, 15, 0, 31, 0, 63, 0, 127
DEFB 0, 95, 0, 95, 0, 127, 0, 127
DEFB 0, 63, 0, 31, 0, 31, 0, 15
DEFB 0, 15, 0, 15, 0, 15, 0, 15
DEFB 0, 31, 0, 31, 0, 31, 0, 31
DEFB 255, 0, 255, 0, 255, 0, 255, 0
DEFB 255, 0, 255, 0, 255, 0, 255, 0
; Segunda columna
DEFB 0, 0, 0, 0, 0, 255, 0, 255
DEFB 0, 255, 0, 16, 0, 124, 0, 255
DEFB 0, 57, 0, 16, 0, 57, 0, 255
DEFB 0, 207, 0, 135, 0, 135, 0, 135
DEFB 0, 255, 0, 254, 0, 254, 0, 255
DEFB 0, 252, 0, 1, 0, 255, 0, 255
DEFB 0, 0, 0, 231, 0, 231, 0, 195
DEFB 0, 195, 0, 195, 0, 129, 0, 129
DEFB 0, 129, 0, 129, 0, 195, 0, 231
DEFB 0, 255, 0, 255, 0, 255, 0, 227
DEFB 0, 227, 0, 227, 0, 227, 0, 227
DEFB 0, 227, 0, 227, 0, 227, 0, 192
DEFB 255, 0, 255, 0, 255, 0, 255, 0
DEFB 255, 0, 255, 0, 255, 0, 255, 0
; Tercera columna
DEFB 0, 0, 0, 0, 0, 248, 0, 240
DEFB 0, 240, 0, 240, 0, 240, 0, 240
DEFB 0, 254, 0, 242, 0, 242, 0, 250
DEFB 0, 250, 0, 250, 0, 250, 0, 250
DEFB 0, 254, 0, 56, 0, 56, 0, 120
DEFB 0, 120, 0, 248, 0, 248, 0, 248
DEFB 0, 56, 0, 224, 0, 224, 0, 224
DEFB 0, 240, 0, 252, 0, 254, 0, 255
DEFB 0, 253, 0, 253, 0, 255, 0, 254
DEFB 0, 252, 0, 252, 0, 248, 0, 248
DEFB 0, 248, 0, 252, 0, 252, 0, 252
DEFB 0, 252, 0, 252, 0, 252, 0, 252
DEFB 255, 0, 255, 0, 255, 0, 255, 0
DEFB 255, 0, 255, 0, 255, 0, 255, 0
')
Sólo quedaría añadir el código para crear el sprite:
$this->bbcode_second_pass_code('', '
sp1_CreateSpr(SP1_DRAW_MASK2LB, SP1_TYPE_2BYTE, 7, 0, 0);
')
El tercer parámetro es 7 porque hay que incluir el último carácter en blanco al final de cada una de las columnas. Y posteriormente las funciones que añaden cada una de las columnas al sprite creado, lo pongo a continuación con los comentarios que complementan lo que se explica en el curso de speccy.org:
$this->bbcode_second_pass_code('', '
// Se ejecutan tantas instrucciones 'sp1_AddColSpr' como columnas tenga el sprite
// El primer parámetro indica a qué sprite se le va a añadir la columna
// El segundo parametro siempre tiene que ser SP1_DRAW_MASK2RB para la última columna; las anteriores deben tener el valor SP1_DRAW_MASK2 (o SP1_DRAW_MASK2LB).
// El cuarto parámetro es el número de bytes que ocupa la definición de la columna del sprite correspondiente. En este caso particular tenemos:
// - Primera instrucción incluye: 7 caracteres (incluyendo el blanco del final) --> 7 x (8 bytes de sprite + 8 bytes de máscara) = 112 bytes de la primera columna
// - Segunda instrucción incluye los 112 bytes de la primera columna, más los 112 de la segunda = 224 bytes
// - Tercera: no indicamos tamaño, al indicar con 'SP1_DRAW_MASK2RB' que se trata de la última columna, no indicamos tamaño
sp1_AddColSpr(p.sprite, SP1_DRAW_MASK2LB, 0, 112, 0);
sp1_AddColSpr(p.sprite, SP1_DRAW_MASK2LB, 0, 224, 0);
sp1_AddColSpr(p.sprite, SP1_DRAW_MASK2RB, 0, 0, 0);
sp1_MoveSprAbs(p.sprite, &cr, sprite_prota, 12, 16, 0, 0);
')
$this->bbcode_second_pass_quote('na_th_an', 'A')hora no lo puedo recordar bien pero creo que nunca conseguí que SevenuP me exportase el formato correcto (aunque probablemente esté terriblemente equivocado y por eso invoco a Metalbrain para que me de un babuchazo en los morros), por eso siempre me he hecho mis propios conversores. A lo mejor, con algo de maña, puedes usar el sprcnv de la churrera.
Lamentablemente, de sp1 no tengo ni la más remota idea. Sé que hay gente en WOS que puede ayudarte al respecto. Según veo, es parecido, aunque como sp1 tiene muchas más opciones, pues ya me pierdo.
Creo que seguiré probando con SevenuP, quiero probar las opciones de añadir atributos, insertar frames, etc.
Saludos!