Crea tus Juegos con 8BPCursos

8BP: Imprimir los sprites ordenados en pantalla

4.9
(12)

Hola amigos de 8 Bits de Poder!!! en la entrega semanal de nuestro articulo sobre 8BP hablaremos de cómo imprimir los sprites ordenados en pantalla.

En la librería 8BP dispones de un comando que imprime a la vez todos los sprites que tengan el flag de impresión activo. El comando |PRINTSPALL

rutas avanzadas

Pero espera… ¿Es posible que no sepas nada de 8 Bits de Poder? Puedes leer el primer artículo del curso de programación en Amstrad CPC de 8BP.

Este comando tiene 4 parámetros, aunque solo necesitas rellenarlos la primera vez que lo invoques, pues las siguientes veces, se acordará de los parámetros, y solo deberás rellenarlos de nuevo si deseas cambiar alguno de ellos. Esto es útil porque el paso de parámetros consume mucho tiempo (te puedes ahorrar más de 1ms evitando el paso de parámetros).

Los parámetros son:

|PRINTSPALL, <ordenini>, <ordenfin>, <animar>, <sincronismo>

  • El parámetro de sincronismo puede tomar los valores 0 o 1 e indica que se esperará a una interrupción de barrido de pantalla para imprimir. Si deseas velocidad no te lo recomiendo. Si deseas más suavidad, quizás si.
  • El parámetro de animación puede tomar los valores 0 o 1. En caso de estar activo, antes de imprimir cada sprite se comprobará su flag de animación en el byte de status y si lo tiene activo, entonces se cambiará de fotograma antes de imprimirlo. Es muy útil con los enemigos, pero con tu personaje normalmente no, pues solo desearás animarle al moverle y no en cada fotograma.
  • Los parámetros de orden (“ordenini”, “ordenfin”) indican los sprites inicial y final que definen el grupo de sprites ordenados por coordenada “Y” que vamos a imprimir. Por ejemplo, si asignamos los valores 0,0 entonces se imprimirán secuencialmente desde el sprite 0 hasta el sprite 31. Si asignamos 0,8 se imprimirán del 0 al 8 ordenados (9 sprites) y del 10 al 31 de modo secuencial. Si ponemos un 0,31 se imprimirán todos los sprites ordenados. Si ponemos un 10,20 se imprimirán secuencialmente los sprites del 0 al 9, luego se imprimirán ordenados del 10 al 20 y finalmente se imprimirán secuencialmente del 21 al 3.

Sprites ordenados en pantalla

8BP: Imprimir los sprites ordenados en pantalla 2
Grupos de sprites secuenciales y ordenados.

El ordenamiento de sprites es muy útil para hacer juegos tipo “Renegade” o “Golden AXE”, donde es necesario dar un efecto de profundidad y un Sprite pasa por delante de otro. El ordenamiento se aprecia cuando hay solapamientos entre sprites.

8BP: Imprimir los sprites ordenados en pantalla 3
efecto de ordenamiento de sprites
|PRINTSPALL, 0,0,1,0 : imprime de forma secuencial todos los sprites
|PRINTSPALL, 0,31,1,0 : imprime de forma ordenada todos los sprites
|PRINTSPALL, 0,7,1,0: imprime 8 ordenados y el resto secuencial
|PRINTSPALL, 16,24,1,0: 16 secuenciales, 9 ordenados y 7 secuenciales

Si el parámetro “ordenini” se omite, se considera el ultimo valor asignado, o bien cero si nunca se ha asignado un valor. Además, si vas a modificar alguno de los dos parámetros de ordenamiento, conviene primero ejecutar PRINTSPALL,0,0,0,0 para que primero se reorden los sprites secuencialmente antes de ordenarlos con una nueva configuración.

Imprimir de forma ordenada es más costoso computacionalmente que imprimir de forma secuencial. Si solo tienes 5 sprites que deben ser ordenados, pasa por ejemplo un 0,4 como parámetros de ordenamiento, no pases un 0,31. Ordenar todos los sprites lleva unos 2.5 ms pero si ordenas solo 5 te puedes ahorrar 2ms. Quizás tengas muchos sprites y no merezca la pena ordenar algunos, como los disparos o sprites que sabes que no se van a solapar.

El algoritmo que se usa para ordenar los sprites es una variante del algoritmo conocido como “burbuja”. Aunque encontrarás en la literatura que el algoritmo llamado “burbuja” es muy poco eficiente, eso lo dicen los que hablan pensando en una lista de números aleatorios a ordenar.

Nos encontramos ante un caso donde normalmente los sprites están casi ordenados y de un fotograma a otro solo se desordena uno o dos sprites, no más, pues sus coordenadas evolucionan “suavemente”. Por ello, el algoritmo recorre la lista de sprites y cuando encuentra un par de sprites desordenados, les da la vuelta y deja de seguir ordenando.

8BP: Imprimir los sprites ordenados en pantalla 4

Es tremendamente rápido, y aunque solo sea capaz de ordenar un par de sprites cada vez, es ideal para este caso de uso. Solo en el caso de que haya 2 sprites desordenados y que además se estén solapando, habrá un fotograma en el que veamos uno de ellos imprimiéndose en desorden, pero quedará corregido en el siguiente fotograma. Es imperceptible.

Puede que alguna vez desees que la ordenación sea completa en cada fotograma. Es decir, que no se ordene un par de sprites en cada invocación a PRINTSPALL, sino tener la seguridad de que todos estan ordenados. La librería 8BP te lo permite mediante sus cuatro modos de ordenamiento, que puedes establecer mediante la invocación del comando PRINTSPALL con un solo parámetro (basta con ejecutarlo una vez para fijar el modo de ordenación):

  • PRINTSPALL,0 : ordenamiento parcial usando Ymin 
  • PRINTSPALL,1 : ordenamiento completo usando Ymin 
  • PRINTSPALL,2 : ordenamiento parcial usando Ymax
  • PRINTSPALL,3 : ordenamiento completo usando Ymax 

Los ordenamientos que usan Ymax se basan en la coordenada Y mayor de los sprites, es decir, donde se encuentran sus pies en lugar de su cabeza. Si los sprites son del mismo tamaño, un ordenamiento basado en Ymin te puede servir, pero si los sprites tienen diferente altura puede que desees ordenar según donde se encuentren los pies de cada personaje y para ello tendrás que usar el modo de ordenar 2 o el 3. Los modos de ordenar con Ymax son mas lentos, aproximadamente 0.128 ms por sprite, de modo que úsalos cuando los necesites realmente.

8BP: Imprimir los sprites ordenados en pantalla 5
Ordenamiento según Ymax

La ordenación completa consume muy poco mas que la parcial (aproximadamente 0.3ms). Esto es debido a que los sprites apenas se desordenan de un fotograma al siguiente, pero incluso esos 0.3ms merece la pena ahorrarlos si es posible.

Recuerda que el comando PRINTSPALL tiene “memoria”, de modo que que basta con invocar la primera vez con parámetros y a partir de ese momento podemos invocar a PRINTSPALL sin parámetros pues el comando “conserva” los valores de los parámetros con los que fue invocado y no hace falta pasárselos a menos que cambien. Esto permite ahorrar mas de 1ms, ya que el analizador sintáctico trabaja menos.

Hasta aquí hemos llegado por hoy con el curso de programación en Amstrad CPC de 8 bits de poder Si tienes alguna duda puedes escribir en comentarios y te contestaré lo antes posible.

Todos los recursos, como manuales, ejemplos y juegos compilados de este curso los puedes encontrar en el repositorio Github de 8BP.

Hasta la semana que viene amigos 😄

¿Te ha Resultado útil este artículo?

Ayúdanos a mejorar y danos tu opinión:

Mostrar más

5 comentarios

    1. hola
      No lo se con certeza pero me imagino que si. Yo incluyo el wyz-tracker 2.0.1.0 con la librería (en el zip que te descargas desde https://github.com/jjaranda13/8BP ) porque se que esa versión funciona. Como WYZ tracker podía evolucionar, quise dejar esa version «congelada» en el zip de 8BP para que nunca surgiese ningún problema. Sin embargo es casi seguro que funciona. Si me preguntases por una versión anterior…quizás no funcione pero con una posterior casi seguro que si. No obstante, si te da algún problema consulta las recomendaciones sobre wyz tracker en el manual (esta en 8BP/Documentacion/manual/) . En el capitulo 17 se comentan cosas como NO USAR la octava 7 aunque te lo permita el wyz tracker

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Publicaciones relacionadas

Mira también
Cerrar
Botón volver arriba