Ayuda con SP1: función sp1_AddColSpr()

Soporte técnico sobre los lanzamientos de MojonTwins y comentarios sobre los güegos. Ofrecemos soporte técnico con Fourspriter, te ayudamos con ZX Basic o Z88DK, te damos pistas some cómo saltarse un bicho y cosas así.

Moderador: na_th_an

Avatar de Usuario
Javi Perez
Mensajes: 13
Registrado: Lun, 08 Jun 2015, 11:47

Ayuda con SP1: función sp1_AddColSpr()

Mensajepor Javi Perez » Vie, 19 Jun 2015, 21:38

Hola gente,

Me presento en este foro con una duda sobre la función "sp1_AddColSpr()" de SP1. Estaba dudando entre cortarme las venas o dejármelas largas y he decidido tirar por la calle del medio ;-)

La cuestión es que no logro entender cómo carajo se han de pasar los argumentos a esta función en el caso de que queramos imprimir sprites con más de 1 columna. En el caso de tener sólo una columna y n filas, la cosa va de perlas, pero en cuanto añado una segunda columna, no soy capaz de hacerlo.

Por ejemplo, para el sprite:

$this->bbcode_second_pass_code('', '; SevenuP (C) Copyright 2002-2006 by Jaime Tejedor Gomez, aka Metalbrain

;GRAPHIC DATA:
;Pixel Size: ( 16, 16)
;Char Size: ( 2, 2)
;Sort Priorities: Mask, Char line, Y char, X char
;Data Outputted: Gfx
;Interleave: Sprite
;Mask: Yes, before graphic

sprite:
DEFB 0, 0, 0, 31, 0, 39, 0, 3
DEFB 0, 49, 0, 29, 0,117, 0,125
DEFB 0, 4, 0, 0, 0, 1, 0, 2
DEFB 0, 66, 0,114, 0, 61, 0, 0
DEFB 0, 0, 0,248, 0,236, 0,198
DEFB 0,234, 0,242, 0,234, 0, 80
DEFB 0, 0, 0, 40, 0,176, 0,244
DEFB 0,234, 0,214, 0, 44, 0, 0')

Entiendo que debería usar:
$this->bbcode_second_pass_code('', '
p.sprite = sp1_CreateSpr(SP1_DRAW_MASK2LB, SP1_TYPE_2BYTE, 3, 16, 0);
sp1_AddColSpr(p.sprite, SP1_DRAW_MASK2, 0, 32, 0);
sp1_AddColSpr(p.sprite, SP1_DRAW_MASK2RB, 0, 32, 0);')

Pero algo hago mal porque no se renderiza bien, ¿qué hago mal???


Gracias!
Última edición por Javi Perez el Lun, 29 Jun 2015, 20:52, editado 1 vez en total.
Avatar de Usuario
na_th_an
Mensajes: 26413
Registrado: Vie, 09 Ene 2009, 12:18

Re: Ayuda con

Mensajepor na_th_an » Sab, 20 Jun 2015, 15:22

No tengo muy claro como organiza los datos SevenuP, la verdad. Al menos splib2 necesita que estén organizados por columnas, cada columna con byte/máscara intercalados. Viendo sólo los datos no sé si el orden estará correcto.

Así, a simple vista, te digo ya que parece que el sprite exportado por sevenuP es de 16x16 y tú estás definiendo tres columnas de tres bloques, o sea, 24x24. Los datos de los bloques vacíos que rodean al sprite deben estar presentes.

Esta es la definición de un sprite válido para splib2, fíjate en las tres columnas de 3 bloques, gráfico y máscara intercalados:

$this->bbcode_second_pass_code('', ' ._sprite_1_a
defb 7, 240
defb 15, 224
defb 15, 192
defb 21, 128
defb 42, 0
defb 85, 0
defb 42, 0
defb 32, 128
defb 62, 128
defb 63, 128
defb 31, 192
defb 15, 224
defb 2, 240
defb 5, 224
defb 10, 192
defb 21, 192
defb 0, 255
defb 0, 255
defb 0, 255
defb 0, 255
defb 0, 255
defb 0, 255
defb 0, 255
defb 0, 255

._sprite_1_b
defb 0, 127
defb 128, 15
defb 176, 7
defb 88, 3
defb 184, 3
defb 80, 3
defb 12, 1
defb 220, 1
defb 48, 3
defb 240, 7
defb 128, 15
defb 192, 31
defb 0, 15
defb 112, 7
defb 184, 3
defb 80, 7
defb 0, 255
defb 0, 255
defb 0, 255
defb 0, 255
defb 0, 255
defb 0, 255
defb 0, 255
defb 0, 255

._sprite_1_c
defb 0, 255
defb 0, 255
defb 0, 255
defb 0, 255
defb 0, 255
defb 0, 255
defb 0, 255
defb 0, 255
defb 0, 255
defb 0, 255
defb 0, 255
defb 0, 255
defb 0, 255
defb 0, 255
defb 0, 255
defb 0, 255
defb 0, 255
defb 0, 255
defb 0, 255
defb 0, 255
defb 0, 255
defb 0, 255
defb 0, 255
defb 0, 255')

Además, antes del primer sprite hay que dejar 8 filas de sprite/máscara vacías.

$this->bbcode_second_pass_code('', '
defb 0, 255
defb 0, 255
defb 0, 255
defb 0, 255
defb 0, 255
defb 0, 255
defb 0, 255
defb 0, 255')

Ahora 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.
Como diría Rorshach: "Urm..."
Avatar de Usuario
Javi Perez
Mensajes: 13
Registrado: Lun, 08 Jun 2015, 11:47

Re: Ayuda con

Mensajepor Javi Perez » Mar, 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!