martes, 26 de abril de 2016

Cómo escribir juegos para el ZX Spectrum. Capítulo 10

Índice de entradas

Esta serie de artículos han sido traducidos a partir del documento "How to Write ZX Spectrum Games" con permiso de su autor, Jonathan Cauldwell, un gran desarrollador de juegos para el Spectrum, os recomiendo visitar su Web donde está el texto original. El documento original, y por tanto esta traducción, tiene © Jonathan Cauldwell y solo puede duplicarse con permiso expreso por escrito de su autor.

Marcadores y puntuación más alta

Más rutinas de marcadores

Hasta ahora hemos usado una rutina de puntuación poco sofisticada. Nuestro marcador se guarda como un número de 16 bits almacenado en un par de registros, y para que aparezca hemos hecho uso de la rutina de impresión por pantalla del número de línea de la ROM Sinclair. Ahí están los dos principales inconvenientes de este método, en primer lugar que se limita a números de 0 al 9999, y en segundo lugar que se ve horrible.

Podríamos convertir un número de 16 bits a ASCII por nosotros mismos de esta manera:

; Mostrar número pasado en hl, justificado a la derecha.

shwnum ld a,48             ; ceros a la izquierda (usa 32 si prefieres espacios).
       ld de,10000         ; columna de diez miles.
       call shwdg          ; presentar el dígito.
       ld de,1000          ; columna de miles.
       call shwdg          ; presentar el dígito.
       ld de,100           ; columna de cientos.
       call shwdg          ; presentar el dígito.
       ld de,10            ; columna de decenas.
       call shwdg          ; presentar el dígito.
       or 16               ; el último dígito siempre se presenta.
       ld de,1             ; columna de unidades.
shwdg  and 48              ; borrar acarreo, borrar dígito.
shwdg1 sbc hl,de           ; restar de la columna.
       jr c,shwdg0         ; nada que mostrar.
       or 16               ; algo que mostrar, lo convierto en un dígito.
       inc a               ; incrementar digito.
       jr shwdg1           ; repetir hasta que la columna sea cero.
shwdg0 add hl,de           ; restaurar total.
       push af
       rst 16              ; presentar caracter.
       pop af
       ret

Este método funciona bien, aunque todavía estamos limitados a una puntuación de cinco dígitos que no supere 65535. Por un tema de apariencia más profesional completo con ceros a la izquierda, lo que necesitamos para mantener la puntuación como una cadena de dígitos ASCII.

He utilizado la misma técnica de puntuación por algo así como 15 años, no es terriblemente sofisticada pero es lo suficientemente buena para hacer lo que necesitamos. Este método utiliza un carácter ASCII por dígito, lo que hace que sea fácil de visualizar. De paso, esta rutina la tomo de mi  juego estilo Shoot 'em up More Tea, Vicar? (NdT: Para llamarse ¿Mas te, párroco? es un arcade de disparos a naves espaciales con scrool horizontal).

score  defb '000000'
uscor  ld a,(hl)           ; valor actual de los dígitos.
       add a,b             ; añadir puntero a este dígito.
       ld (hl),a           ; lugar del nuevo dígito en la cadena.
       cp 58               ; ¿mayor que el valor ASCII para nueve?
       ret c               ; no, tranquilidad.
       sub 10              ; restar 10.
       ld (hl),a           ; meter el nuevo carácter en la cadena.
uscor0 dec hl              ; anterior carácter en la cadena.
       inc (hl)            ; incrementar en uno.
       ld a,(hl)           ; ¿cuál es el nuevo valor?
       cp 58               ; ¿se pasa del ASCII para nueve?
       ret c               ; no, puntuación efectuada.
       sub 10              ; restarle diez.
       ld (hl),a           ; ponerlo de nuevo.
       jp uscor0           ; volver al bucle.


Para utilizar esto apunto en hl al dígito que nos gustaría aumentar, coloco la cantidad que queremos añadir en el registro b, luego llamo a uscor. Por ejemplo, para agregar 250 a la puntuación se requieren 6 líneas:

; Añadir 250 a la puntuación.

       ld hl,score+3       ; apunto a la columna de las centenas.
       ld b,2              ; 2 cienes = 200.
       call uscor          ; incrementar la puntuación.
       ld hl,score+4       ; apunto a la columna de las decenas.
       ld b,5              ; 5 dieces = 50.
       call uscor          ; incrementar la puntuación.

Simple, pero hace el trabajo. Los pedantes no dudarían en señalar que podría hacer utilizando BCD, y que los códigos de operación para esto se encuentran en el conjunto de instrucciones del Z80.

Tablas de puntuación máxima

Las rutinas de puntuación máxima no son especialmente fáciles de escribir para un principiante, pero una vez que has escrito una puede ser reutilizada una y otra vez. El principio básico es que empezamos en la parte inferior de la tabla y seguimos nuestro camino hacia arriba hasta que encontramos una puntuación que es mayor o igual a la puntuación del jugador. Entonces desplazamos todos los datos de la tabla hacia abajo a partir de ese punto una posición, y copiamos el nombre del jugador y la puntuación en ese punto de la tabla.

Podemos apuntar con los registros hl o ix al primer dígito de la puntuación inferior en la tabla y seguir nuestro camino con la comparación de cada dígito con el correspondiente en la puntuación del jugador. Si el dígito en la puntuación del jugador es mayor nos movemos hacia arriba una posición, si es inferior nos detenemos allí y copiamos la puntuación del jugador en la tabla un lugar hacia arriba. Si los dígitos son los mismos nos movemos al siguiente dígito y repetimos la comprobación hasta que los dígitos son diferentes o hemos comprobado todos los dígitos en la puntuación. Si los resultados son idénticos colocamos la entrada del jugador en el lugar de la tabla que aparece a continuación. Esto se repite hasta que una puntuación en la tabla es mayor que la puntuación del jugador, o se llega a la parte superior de la tabla.

En la creación inicial de la tabla de puntuación puede ser tentador colocar tu propio nombre en la parte superior con una puntuación que sea muy difícil de superar. Trata de resistir esta tentación. Las tablas de puntuación más alta son para que el jugador pueda juzgar su propio desempeño, y no hay necesidad de frustrar al jugador haciendo muy difícil llegar a la primera posición.

No hay comentarios:

Publicar un comentario