cursos:z88dk:sprites4

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:sprites4 [10-08-2007 08:46] sromerocursos:z88dk:sprites4 [24-02-2020 19:25] (actual) falvarez
Línea 1: Línea 1:
 +
 +Publicado originalmente en [[https://magazinezx.speccy.org/14/z88dk.html|MagazineZX número 14]] (diciembre 2006)
  
 ====== Sprites en Z88DK (IV) ====== ====== Sprites en Z88DK (IV) ======
Línea 9: Línea 11:
  
 En esta ocasión vamos a añadir un par de sencillos detalles más antes de comenzar a escribir nuestro propio juego; un código que luego podrá formar parte de un producto más elaborado. En concreto veremos cómo hacer reaccionar nuestro programa ante la pulsación de teclas por parte del usuario, y cómo mover un sprite utilizando este dispositivo de entrada. También aprenderemos como añadir color a los sprites. Para nuestras explicaciones haremos uso como base del código sprite2.c que se creó en la anterior entrega, y en el que se definía un sprite de tamaño 2x1 que se desplazaba al azar. En esta ocasión vamos a añadir un par de sencillos detalles más antes de comenzar a escribir nuestro propio juego; un código que luego podrá formar parte de un producto más elaborado. En concreto veremos cómo hacer reaccionar nuestro programa ante la pulsación de teclas por parte del usuario, y cómo mover un sprite utilizando este dispositivo de entrada. También aprenderemos como añadir color a los sprites. Para nuestras explicaciones haremos uso como base del código sprite2.c que se creó en la anterior entrega, y en el que se definía un sprite de tamaño 2x1 que se desplazaba al azar.
 +
  
 ===== Moviendo los sprites con el teclado ===== ===== Moviendo los sprites con el teclado =====
Línea 21: Línea 24:
  
 <code c> <code c>
-           keys.up = sp_LookupKey('q');  +keys.up = sp_LookupKey('q');  
-           keys.down = sp_LookupKey('a');  +keys.down = sp_LookupKey('a');  
-           keys.right = sp_LookupKey('p');  +keys.right = sp_LookupKey('p');  
-           keys.left = sp_LookupKey('o');  +keys.left = sp_LookupKey('o');  
-           keys.fire = sp_LookupKey(' '); +keys.fire = sp_LookupKey(' '); 
 </code> </code>
  
Línea 415: Línea 418:
  
 Como veremos más adelante, deberemos implementar algún mecanismo para limitar la zona por donde nuestros sprites se van a desplazar. La forma de hacer esto es mediante simples comparaciones, comprobando que el lugar al que vamos a desplazar el sprite no este fuera de la pantalla (o de la zona donde queremos que permanezca). Como veremos más adelante, deberemos implementar algún mecanismo para limitar la zona por donde nuestros sprites se van a desplazar. La forma de hacer esto es mediante simples comparaciones, comprobando que el lugar al que vamos a desplazar el sprite no este fuera de la pantalla (o de la zona donde queremos que permanezca).
 +
 +
 +
  
 ===== Añadiendo color ===== ===== Añadiendo color =====
Línea 421: Línea 427:
 Un paso importante para poder tener como resultado un videojuego vistoso y que entre por los ojos es aprovechar los colores de nuestro Spectrum y disponer de una combinación agradable de cromaticidad en los sprites de nuestro juego. Los colores también permitirán distinguir con mayor facilidad nuestro personaje de los enemigos y el resto de elementos de la pantalla. Ya vimos en entregas anteriores que en el caso de los tiles era bastante sencillo modificar la tonalidad de la tinta y el papel: Un paso importante para poder tener como resultado un videojuego vistoso y que entre por los ojos es aprovechar los colores de nuestro Spectrum y disponer de una combinación agradable de cromaticidad en los sprites de nuestro juego. Los colores también permitirán distinguir con mayor facilidad nuestro personaje de los enemigos y el resto de elementos de la pantalla. Ya vimos en entregas anteriores que en el caso de los tiles era bastante sencillo modificar la tonalidad de la tinta y el papel:
  
 +<code c>
 sp_TileArray(' ', hash); sp_TileArray(' ', hash);
 sp_Initialize(INK_WHITE | PAPER_BLACK, ' '); sp_Initialize(INK_WHITE | PAPER_BLACK, ' ');
 +</code>
  
-pero en el caso de los sprites la cosa se complica un poco más y vamos a tener que dar unas cuantas "vueltas" para llegar a nuestro objetivo. En concreto, deberemos hacer uso de una función llamada sp_IterateSprChar, que recibe como parámetro una variable de tipo struct sp_SS, que representa el sprite que queremos modificar, y el nombre de una función que habremos definido anteriormente. Dicha función, al ser llamada, obtendrá como parámetro una variable de tipo struct sp_CS, una estructura muy interesante que nos va a permitir modificar diversas características del sprite, entre ellas el color.+pero en el caso de los sprites la cosa se complica un poco más y vamos a tener que dar unas cuantas "vueltas" para llegar a nuestro objetivo. En concreto, deberemos hacer uso de una función llamada **sp_IterateSprChar**, que recibe como parámetro una variable de tipo struct sp_SS, que representa el sprite que queremos modificar, y el nombre de una función que habremos definido anteriormente. Dicha función, al ser llamada, obtendrá como parámetro una variable de tipo **struct sp_CS**, una estructura muy interesante que nos va a permitir modificar diversas características del sprite, entre ellas el color.
  
-El siguiente código muestra, en color rojo, las modificaciones realizadas al programa anterior para poder añadirle color al sprite de nuestro bicho, y que pasaremos a explicar a continuación:+El siguiente código muestra las modificaciones realizadas al programa anterior para poder añadirle color al sprite de nuestro bicho, y que pasaremos a explicar a continuación:
  
 +<code c>
 #include <spritepack.h> #include <spritepack.h>
 #include <stdlib.h> #include <stdlib.h>
Línea 438: Línea 447:
 #endasm #endasm
  
 +// nuevo (principio)
 extern uchar *sp_NullSprPtr;  extern uchar *sp_NullSprPtr; 
 #asm  #asm 
Línea 443: Línea 453:
 ._sp_NullSprPtr         defw SPNullSprPtr   ._sp_NullSprPtr         defw SPNullSprPtr  
 #endasm  #endasm 
 +// nuevo (fin)
  
 extern uchar bicho1[]; extern uchar bicho1[];
Línea 460: Línea 471:
  
  
 +// nuevo (principio)
 uchar n;  uchar n; 
 void addColour(struct sp_CS *cs)   void addColour(struct sp_CS *cs)  
Línea 481: Línea 493:
     return;      return; 
 } }
 +// nuevo (fin)
  
  
Línea 516: Línea 529:
            sp_AddColSpr(spriteBicho, bicho2, TRANSPARENT);            sp_AddColSpr(spriteBicho, bicho2, TRANSPARENT);
     sp_AddColSpr(spriteBicho, bicho3, TRANSPARENT);     sp_AddColSpr(spriteBicho, bicho3, TRANSPARENT);
-    sp_IterateSprChar(spriteBicho, addColour); +    sp_IterateSprChar(spriteBicho, addColour);         // nuevo
            sp_MoveSprAbs(spriteBicho, sp_ClipStruct, 0, 10, 15, 0, 0);            sp_MoveSprAbs(spriteBicho, sp_ClipStruct, 0, 10, 15, 0, 0);
  
Línea 650: Línea 663:
  
 #endasm #endasm
 +</code>
  
 Como se puede comprobar, tras crear el sprite del bicho, hacemos uso de la siguiente instrucción: Como se puede comprobar, tras crear el sprite del bicho, hacemos uso de la siguiente instrucción:
  
 +<code c>
 sp_IterateSprChar(spriteBicho, addColour); sp_IterateSprChar(spriteBicho, addColour);
 +</code>
  
-Esto significa que vamos a usar una función llamada addColour, y que deberemos haber definido anteriormente dentro del archivo con el código, para modificar las propiedades de spriteBicho. Aunque la instrucción sólo aparece una vez, es como si estuviéramos llamando a la función addColour una vez por cada bloque de 8x8 que forma el sprite del bicho (recordemos que el sprite de nuestro bicho está formado por 3 columnas de 3 bloques de 8x8, por lo que la función addColour será llamada un total de 9 veces). La forma que tiene está función es la siguiente:+Esto significa que vamos a usar una función llamada **addColour**, y que deberemos haber definido anteriormente dentro del archivo con el código, para modificar las propiedades de //spriteBicho//. Aunque la instrucción sólo aparece una vez, es como si estuviéramos llamando a la función addColour una vez por cada bloque de 8x8 que forma el sprite del bicho (recordemos que el sprite de nuestro bicho está formado por 3 columnas de 3 bloques de 8x8, por lo que la función addColour será llamada un total de 9 veces). La forma que tiene está función es la siguiente:
  
 +<code c>
 uchar n; uchar n;
 void addColour(struct sp_CS *cs) void addColour(struct sp_CS *cs)
Línea 678: Línea 695:
            return;            return;
 } }
 +</code>
  
-Justo antes se define una variable global llamada n, y que no será más que un contador que nos permitirá saber en cuál de las nueve llamadas a la función addColour nos encontramos. Ya dentro de dicho método se observa como su valor se incrementa de uno en uno en cada llamada.+Justo antes se define una variable global llamada n, y que no será más que un contador que nos permitirá saber en cuál de las nueve llamadas a la función **addColour** nos encontramos. Ya dentro de dicho método se observa como su valor se incrementa de uno en uno en cada llamada.
  
-Como hemos repetido varias veces, la función addColour será llamada una vez por cada bloque 8x8 que forme nuestro sprite, recibiendo como parámetro un struct de tipo sp_CS que nos va a permitir modificar diversas características de dicho bloque del sprite. Uno de los campos de ese struct es colour, que como su propio nombre indica, es el indicado para añadir color. Gracias al valor de n, podremos conocer en cuál de todos los bloques del sprite nos encontramos (empezando por el 0, los bloques están ordenados de arriba a abajo y de izquierda a derecha, por lo que en el caso de nuestro bicho, aun estando compuesto por 3x3 bloques, sólo nos interesará colorear aquellos para los que n vale 0,1,3 y 4, que son los que no están vacíos) y asignarle un color de tinta y papel modificando el valor del campo colour del struct sp_CS, tal como se puede observar en el código anterior.+Como hemos repetido varias veces, //la función **addColour** será llamada una vez por cada bloque 8x8 que forme nuestro sprite//, recibiendo como parámetro un struct de tipo //sp_CS// que nos va a permitir modificar diversas características de dicho bloque del sprite. Uno de los campos de ese struct es colour, que como su propio nombre indica, es el indicado para añadir color. Gracias al valor de n, podremos conocer en cuál de todos los bloques del sprite nos encontramos (empezando por el 0, los bloques están ordenados de arriba a abajo y de izquierda a derecha, por lo que en el caso de nuestro bicho, aun estando compuesto por 3x3 bloques, sólo nos interesará colorear aquellos para los que n vale 0,1,3 y 4, que son los que no están vacíos) y asignarle un color de tinta y papel modificando el valor del campo colour del //struct sp_CS//, tal como se puede observar en el código anterior.
  
-Sólo deberemos colorear los bloques 0,1,3 y 4 de nuestro bicho, pues el bloque 2 se corresponde con el último de la primera columna (que está vacío), el bloque 5 con el último de la segunda columna (que también está vacío) y los bloques 6,7 y 8 con la última columna de todas, también vacía, y que se añadió para que no hubiera problemas al desplazar el sprite. En el caso de los bloques 2 y 5 lo más correcto hubiera sido utilizar el valor TRANSPARENT para el campo colour (aunque en nuestro ejemplo hemos sido un poco transgresores y el bloque 2 no lo hemos hecho transparente). Para la última columna (bloques para los que n vale más que 5), sin embargo, asignamos el valor sp_NullSprPtr al campo colour. Este valor, que ha sido definido anteriormente en el programa de la siguiente forma:+Sólo deberemos colorear los bloques 0, 1, 3 y 4 de nuestro bicho, pues el bloque 2 se corresponde con el último de la primera columna (que está vacío), el bloque 5 con el último de la segunda columna (que también está vacío) y los bloques 6,7 y 8 con la última columna de todas, también vacía, y que se añadió para que no hubiera problemas al desplazar el sprite. En el caso de los bloques 2 y 5 lo más correcto hubiera sido utilizar el valor //TRANSPARENT// para el campo colour (aunque en nuestro ejemplo hemos sido un poco transgresores y el bloque 2 no lo hemos hecho transparente). Para la última columna (bloques para los que n vale más que 5), sin embargo, asignamos el valor //sp_NullSprPtr// al campo colour. Este valor, que ha sido definido anteriormente en el programa de la siguiente forma:
  
 +<code c>
 extern uchar *sp_NullSprPtr; extern uchar *sp_NullSprPtr;
 #asm #asm
Línea 690: Línea 709:
 ._sp_NullSprPtr         defw SPNullSprPtr ._sp_NullSprPtr         defw SPNullSprPtr
 #endasm #endasm
 +</code>
  
 evitará que esa columna vacía "moleste" al resto de los sprites con los que nuestro bicho entre en contacto. evitará que esa columna vacía "moleste" al resto de los sprites con los que nuestro bicho entre en contacto.
  
 Y ya está, ya le hemos dado color a nuestro bicho (eso sí, una combinación bastante psicodélica). Cada vez que queramos hacer lo mismo con cualquier otro sprite, tan solo deberemos seguir la receta anterior, pues es algo mecánico. Y ya está, ya le hemos dado color a nuestro bicho (eso sí, una combinación bastante psicodélica). Cada vez que queramos hacer lo mismo con cualquier otro sprite, tan solo deberemos seguir la receta anterior, pues es algo mecánico.
-Nuestro sprite a colorEvidentemente, la combinación de colores puede ser mejorada + 
-Nuestro sprite a color. Evidentemente, la combinación de colores puede ser mejorada+{{ cursos:z88dk:z88dk9_2.png |Nuestro sprite a color. Evidentemente, la combinación de colores puede ser mejorada}}
  
  
Línea 1222: Línea 1242:
  
  
-    * [[http://www.speccy.org/magazinezx/revistas/14/src/z88dk9_codigo.tar.gz|Código fuente]]+    * [[https://magazinezx.speccy.org/14/src/z88dk9_codigo.tar.gz|Código fuente]]
  
  
  
  • cursos/z88dk/sprites4.1186735578.txt.gz
  • Última modificación: 10-08-2007 08:46
  • por sromero