Diferencias
Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previaÚltima revisiónAmbos lados, revisión siguiente | ||
cursos:z88dk:sprites3 [10-08-2007 08:28] – sromero | cursos:z88dk:sprites3 [24-02-2020 19:20] – falvarez | ||
---|---|---|---|
Línea 1: | Línea 1: | ||
+ | Publicado originalmente en [[https:// | ||
====== Sprites en Z88DK (III): La librería SpritePack ====== | ====== Sprites en Z88DK (III): La librería SpritePack ====== | ||
Línea 252: | Línea 252: | ||
{{ cursos: | {{ cursos: | ||
+ | |||
+ | |||
Línea 263: | Línea 265: | ||
Por ejemplo, mostramos como quedaría un sprite con un tamaño de dos bloques de alto por dos bloques de ancho listo para ser usado con Sprite Pack: | Por ejemplo, mostramos como quedaría un sprite con un tamaño de dos bloques de alto por dos bloques de ancho listo para ser usado con Sprite Pack: | ||
+ | <code c> | ||
#asm | #asm | ||
Línea 305: | Línea 307: | ||
#endasm | #endasm | ||
+ | </ | ||
Como se puede observar, definimos dos columnas para el sprite, cada una de ellas formada a su vez por dos sprites de tamaño 8x8, incluyendo su máscara de transparencias. Para utilizar el sprite en el código deberíamos hacer algo similar a esto: | Como se puede observar, definimos dos columnas para el sprite, cada una de ellas formada a su vez por dos sprites de tamaño 8x8, incluyendo su máscara de transparencias. Para utilizar el sprite en el código deberíamos hacer algo similar a esto: | ||
+ | <code c> | ||
extern uchar bicho1[]; | extern uchar bicho1[]; | ||
extern uchar bicho2[]; | extern uchar bicho2[]; | ||
Línea 320: | Línea 323: | ||
| | ||
} | } | ||
+ | </ | ||
- | Se debe hacer uso, en primer lugar, de sp_CreateSpr para asignar la primera columna del sprite a la variable de tipo struct sp_SS, y en segundo lugar, de sp_AddColSpr, | + | Se debe hacer uso, en primer lugar, de **sp_CreateSpr** para asignar la primera columna del sprite a la variable de tipo **struct sp_SS**, y en segundo lugar, de **sp_AddColSpr**, tantas veces como columnas adicionales debamos añadir. En este caso, se ha usado un valor de 2 para el segundo parámetro de sp_CreateSpr, |
Es importante destacar que todas las columnas de un mismo sprite deben de ser definidas de forma contigua en la memoria. Esto se traduce en que tenemos que definirlas de forma contigua también en nuestro código. | Es importante destacar que todas las columnas de un mismo sprite deben de ser definidas de forma contigua en la memoria. Esto se traduce en que tenemos que definirlas de forma contigua también en nuestro código. | ||
Línea 327: | Línea 331: | ||
Sin embargo, hay algo que hasta ahora no hemos tenido en cuenta, y es debido a que no hemos movido nuestros sprites por la pantalla. Cuando trasladamos sprites usando el pixel y no el bloque como unidad de medida (los dos últimos parámetros de sp_MoveSprAbs y sp_MoveSprRel servían para esto) veremos como los sprites no son correctamente dibujados; solo se redibuja la parte del sprite más a la izquierda que cabe dentro de una misma celdilla de la pantalla. Un truco para evitar esto es crear sprites un poco más anchos y más altos de lo que realmente necesitamos. Para ello, añadimos una nueva columna en blanco, y en cada columna, un nuevo bloque en blanco al final. En el caso concreto de nuestro sprite 2x2 anterior, deberíamos definirlo de esta forma: | Sin embargo, hay algo que hasta ahora no hemos tenido en cuenta, y es debido a que no hemos movido nuestros sprites por la pantalla. Cuando trasladamos sprites usando el pixel y no el bloque como unidad de medida (los dos últimos parámetros de sp_MoveSprAbs y sp_MoveSprRel servían para esto) veremos como los sprites no son correctamente dibujados; solo se redibuja la parte del sprite más a la izquierda que cabe dentro de una misma celdilla de la pantalla. Un truco para evitar esto es crear sprites un poco más anchos y más altos de lo que realmente necesitamos. Para ello, añadimos una nueva columna en blanco, y en cada columna, un nuevo bloque en blanco al final. En el caso concreto de nuestro sprite 2x2 anterior, deberíamos definirlo de esta forma: | ||
+ | <code c> | ||
#asm | #asm | ||
Línea 415: | Línea 419: | ||
#endasm | #endasm | ||
- | + | </ | |
Por lo tanto, nuestro sprite 2x2 se convierte en un sprite 3x3 al añadir una nueva columna a la derecha y un nuevo bloque en la parte inferior de cada columna. Nuestro código a la hora de usar el sprite debería ser en este caso algo más parecido a esto: | Por lo tanto, nuestro sprite 2x2 se convierte en un sprite 3x3 al añadir una nueva columna a la derecha y un nuevo bloque en la parte inferior de cada columna. Nuestro código a la hora de usar el sprite debería ser en este caso algo más parecido a esto: | ||
+ | <code c> | ||
extern uchar bicho1[]; | extern uchar bicho1[]; | ||
extern uchar bicho2[]; | extern uchar bicho2[]; | ||
Línea 433: | Línea 437: | ||
| | ||
} | } | ||
+ | </ | ||
Como queda patente, indicamos que el tamaño en bloques de cada columna es 3 al llamar a la función sp_CreateSPr, | Como queda patente, indicamos que el tamaño en bloques de cada columna es 3 al llamar a la función sp_CreateSPr, | ||
- | A continuación se muestra un ejemplo completo, con nuestro sprite moviéndose al azar por la pantalla, por medio de la función sp_MoveSprRel: | + | A continuación se muestra un ejemplo completo, con nuestro sprite moviéndose al azar por la pantalla, por medio de la función |
+ | <code c> | ||
+ | #include < | ||
+ | #include < | ||
- | # | ||
- | # | ||
#pragma output STACKPTR=61440 | #pragma output STACKPTR=61440 | ||
Línea 601: | Línea 607: | ||
#endasm | #endasm | ||
+ | </ | ||
Ya deberíamos entender la práctica totalidad de este código, que mueve un sprite al azar por la pantalla, por lo que tan solo haremos dos apuntes: | Ya deberíamos entender la práctica totalidad de este código, que mueve un sprite al azar por la pantalla, por lo que tan solo haremos dos apuntes: | ||
Línea 607: | Línea 614: | ||
* Se ha añadido un bloque vacío antes de definir nuestro sprite, al final del código anterior; esto es así porque debemos asegurarnos de que haya un bloque en blanco encima de cada columna (manías del ensamblador generado por Sprite Pack). | * Se ha añadido un bloque vacío antes de definir nuestro sprite, al final del código anterior; esto es así porque debemos asegurarnos de que haya un bloque en blanco encima de cada columna (manías del ensamblador generado por Sprite Pack). | ||
- | El terrible ser intergaláctico se ha hecho mayor y es más nervioso que antes... | + | {{ cursos: |
- | El terrible ser intergaláctico se ha hecho mayor y es más nervioso que antes... | + | |
===== ¿Y ahora qué? ===== | ===== ¿Y ahora qué? ===== | ||
Línea 618: | Línea 624: | ||
En el siguiente artículo añadiremos colores a nuestros sprites y aprenderemos a moverlos con el teclado. También veremos como borrar de forma efectiva un sprite. Si el espacio lo permite (y si no es así, que no cunda el pánico, pues se verá en números posteriores de la revista) codificaremos un simple juego funcional con todo lo aprendido. | En el siguiente artículo añadiremos colores a nuestros sprites y aprenderemos a moverlos con el teclado. También veremos como borrar de forma efectiva un sprite. Si el espacio lo permite (y si no es así, que no cunda el pánico, pues se verá en números posteriores de la revista) codificaremos un simple juego funcional con todo lo aprendido. | ||
+ | |||
===== Enlaces ===== | ===== Enlaces ===== | ||
- | * [[http://www.speccy.org/ | + | * [[https://magazinezx.speccy.org/ |