Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
cursos:z88dk:sprites3 [10-08-2007 10:28]
sromero
cursos:z88dk:sprites3 [24-02-2020 20:25] (actual)
falvarez
Línea 1: Línea 1:
 +Publicado originalmente en [[https://magazinezx.speccy.org/13/z88dk.html|MagazineZX número 13]] (enero 2006)
  
 ====== Sprites en Z88DK (III): La librería SpritePack ====== ====== Sprites en Z88DK (III): La librería SpritePack ======
Línea 252: Línea 252:
  
 {{ cursos:z88dk:z88dk8_2.png |Un terrible ser intergaláctico espera ansioso la orden de atacar}} {{ cursos:z88dk:z88dk8_2.png |Un terrible ser intergaláctico espera ansioso la orden de atacar}}
 +
 +
  
  
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
 +</code>
  
 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:
          sp_MoveSprAbs(spriteBicho, sp_ClipStruct, 0, 10, 15, 0, 0);          sp_MoveSprAbs(spriteBicho, sp_ClipStruct, 0, 10, 15, 0, 0);
 } }
 +</code>
  
-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, indicando que cada columna del sprite tendrá un tamaño de dos bloques de 8x8. Efectivamente, este segundo parámetro indica el número de bloques que tendrá cada columna de nuestro sprite; por eso en nuestro primer ejemplo le dimos valor 1. Una vez se ha creado el sprite con sp_CreateSpr y se han añadido las columnas correspondientes con sp_AddColSpr, se podrá tratar la estructura sp_SS resultante como un todo, tal como se demuestra en la llamada a sp_MoveSprAbs que sigue a las dos líneas anteriores.+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, indicando que cada columna del sprite tendrá un tamaño de dos bloques de 8x8. Efectivamente, este segundo parámetro indica el número de bloques que tendrá cada columna de nuestro sprite; por eso en nuestro primer ejemplo le dimos valor 1. Una vez se ha creado el sprite con sp_CreateSpr y se han añadido las columnas correspondientes con sp_AddColSpr, se podrá tratar la estructura sp_SS resultante como un todo, tal como se demuestra en la llamada a sp_MoveSprAbs que sigue a las dos líneas anteriores.
  
 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
- +</code>
  
 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:
          sp_MoveSprAbs(spriteBicho, sp_ClipStruct, 0, 10, 15, 0, 0);          sp_MoveSprAbs(spriteBicho, sp_ClipStruct, 0, 10, 15, 0, 0);
 } }
 +</code>
  
 Como queda patente, indicamos que el tamaño en bloques de cada columna es 3 al llamar a la función sp_CreateSPr, y además se llama dos veces a sp_AddColSpr para añadir la segunda y la tercera columna a nuestro bicho. Como queda patente, indicamos que el tamaño en bloques de cada columna es 3 al llamar a la función sp_CreateSPr, y además se llama dos veces a sp_AddColSpr para añadir la segunda y la tercera columna a nuestro bicho.
  
-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 //sp_MoveSprRel//:
  
 +<code c>
 +#include <spritepack.h>
 +#include <stdlib.h>
  
-#include  
-#include  
 #pragma output STACKPTR=61440 #pragma output STACKPTR=61440
  
Línea 601: Línea 607:
  
 #endasm #endasm
 +</code>
  
 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:z88dk:z88dk8_3.png | El terrible ser intergaláctico se ha hecho mayor y es más nervioso que antes...}}
-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/magazinezx/revistas/13/src/z88dk8_codigo.tar.gz|Código fuente]+    * [[https://magazinezx.speccy.org/13/src/z88dk8_codigo.tar.gz|Código fuente]]