Crea tus Juegos con 8BP

8BP: Gestión del teclado con menos instrucciones

El control del teclado es un factor importante

4
(6)

Hola Amigos de 8 Bits de Poder. En esta entrega del curso veremos cómo realizar una gestión del teclado de nuestro Amstrad CPC de una forma correcta, ahorrando el máximo número de instrucciones. ¡Vamos a ello!

Gestiona el teclado (y en general esto es aplicable a cualquier cosa que hagas) ejecutando el menor número de instrucciones. Aquí tienes un ejemplo (primero mal hecho y luego bien hecho), donde como mucho se pasa por 4 operaciones INKEYS con sus correspondientes IF. Ejecútalo mentalmente y comprobarás lo que digo. Es mucho más rápida la segunda

gestión del teclado

Ejemplo mal hecho (caso peor = 8 ejecuciones “IF INKEY”):

1000 rem rutina de teclado ineficiente
1010 IF INKEY(27)=0 and INKEY(67)=0 THEN <instrucciones>:RETURN 
1020 IF INKEY(27)=0 and INKEY(69)=0 THEN <instrucciones>:RETURN 
1030 IF INKEY(34)=0 and INKEY(67)=0 THEN <instrucciones>:RETURN   
1040 IF INKEY(34)=0 and INKEY(69)=0 THEN <instrucciones>:RETURN 
1050 IF INKEY(27)=0 THEN <instrucciones>:RETURN 
1060 IF INKEY(34)=0 THEN <instrucciones>:RETURN  
1070 IF INKEY(67)=0 THEN <instrucciones>:RETURN 
1080 IF INKEY(69)=0 THEN <instrucciones>:RETURN

A continuación, el ejemplo de lectura de teclado, pero bien hecho (con caso peor = 4 ejecuciones “IF INKEY”). Además, se ha tenido en cuenta que, en un IF, las expresiones distintas de cero son TRUE.

Fantastico-8BP

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.

Gestión del teclado con 8BP

Las instrucciones a ejecutar en tu juego pueden ser diferentes pero el esquema de lectura de teclado debería ser el mismo en caso de manejar diagonales (arriba y derecha a la vez, por ejemplo). Puede parecer más largo, pero es mucho más rápido que el ejemplo anterior.

REM rutina del teclado eficiente
'saltar a 1550 si no se ha pulsado "P"
1510 if inkey(27) THEN 1550: 'tecla P
1520 if inkey(67) THEN 1530: 'tecla Q

1525 <instrucciones en caso de haber pulsado "P" y "Q" a la vez>:RETURN
1530 if inkey(69) THEN 1540:'tecla A

1535 <instrucciones en caso de haber pulsado "P" y "A" a la vez>:RETURN

1540 <instrucciones en caso de haber pulsado "P" solamente>:RETURN

1550 if inkey(34) THEN 1590:'tecla O
1560 if INKEY(67) THEN 1570:'tecla Q

1565 <instrucciones en caso de haber pulsado "O" y "Q" a la vez>:RETURN

1570 if INKEY(69) THEN 1580: 'tecla A

1575 <instrucciones en caso de haber pulsado "O" y "A" a la vez>: RETURN
1580 <instrucciones en caso de haber pulsado "O" solamente>:RETURN

1590 IF INKEY(67) THEN 1600:'tecla Q
1595 <instrucciones si se ha pulsado "Q">: RETURN

1600 IF INKEY(69) THEN return:'tecla A
1610 <instrucciones si se ha pulsado "A" solamente>: RETURN

Otra cosa que debes hacer para acelerar tu juego es usar una tarea periódica para explorar teclas “secundarias” tales como teclas para activar/desactivar la música, teclas para pasar a un menú o visualizar algo especial, etc. Son teclas que puedes explorar periódicamente y no cada ciclo. Eso si, debes tener en cuenta lo que cuesta explorarlas, que no es mucho (1 ms)

10 if inkey(47) then 30: ' esto cuesta 1.0 ms
20 <instrucciones si pulsas la tecla 47>
30 rem llegas aquí si no la has pulsado

Analizar una variable con AND para que ocurra una tarea cada (por ejemplo) 4 ciclos cuesta 1.18 ms, por lo tanto nos va a costar

1.18 ms x 4 ciclos (la evaluación del ciclo) + 1.0ms ( el inkey) =5.72 ms

si en lugar de hacer eso ejecutamos el inkey en cada ciclo, habriamos gastado solo 4ms

por lo tanto explorar ciertas teclas basándonos en el ciclo de juego solo tiene sentido si al menos vamos a evitar explorar en algunos ciclos dos teclas.

Supongamos el siguiente programa:

10 if ciclo and 3 then 50: ' esto cuesta 1.18 ms
20 if inkey(47) … ' esto cuesta 1 ms
30 if inkey(35) …' esto cuesta 1 ms
50 <mas instrucciones>

Tal y como está hecho, el programa evalua las teclas 47 y 35 uno de cada 4 ciclos. Cuando las evalua gasta 1.18 + 1 + 1 = 3.8 ms mientras que cuando no las evalua gasta 1.18 ms. Por lo tanto, el tiempo gastado en 4 ciclos es

Tiempo 3 * 1.18 + 3.8 = 6.72 ms

Mientras que si hubiésemos evaluado las teclas todos los ciclos habríamos gastado 4*2 ms= 8 ms. Por consiguiente, hay un ahorro de 8 – 6.7 = 1.3 ms por cada 4 ciclos, o lo que es lo mismo, aproximadamente 0.3 ms por ciclo de juego.

Una de las opciones que tienes, dependiendo del tipo de juego, es explorar unas teclas en los ciclos pares y las otras en los ciclos impares. Por ejemplo, en un juego que use las teclas QAOP, puedes explorar QA en los ciclos pares y OP en los impares o viceversa. De esa forma puedes obtener mayor velocidad con una limitación que el jugador seguramente no perciba. Este es el tipo de limitaciones que a veces merece la pena introducir, pero depende de cada juego.

En el siguiente capítulo del curso veremos cómo podemos hacer para evitar pasar por IF innecesarios en nuestra programación.

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

2 comentarios

Deja una respuesta

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

Publicaciones relacionadas

Botón volver arriba