Este sitio web usa cookies de terceros para analizar el tráfico y personalizar los anuncios. Si no está de acuerdo, abandone el sitio y no siga navegando por él. ×


Tema 15 - Temporizacion

El Basic de los CPC permite hacer con mucha facilidad que algo ocurra al cabo de un cierto tiempo, o bien que suceda cada rato (a intervalos regulares de tiempo). Vamos a ver cómo...

 

15.1 Hacer algo tras un rato: AFTER

Imaginemos que creamos una pantalla de presentación de un juego. Si el usuario pulsa una tecla, entra al juego n sí, pero ¿y si no pulsa ninguna tecla? Quizá no sea lo más vistoso dejar siempre la pantalla de presentación estática. Nos puede interesar que al cabo de unos pocos segundos sin que el usuario haga nada, se pase al menú del juego, o a una animación de presentación, o a...

¿Cómo podemos hacerlo? La forma "salvaje" sería hacer una rutina repetitiva, que compruebe continuamente si se ha pulsado una tecla o si ya ha pasado el tiempo, algo como:

10 PRINT "Soy la pantalla de bienvenida"
20 instanteInicial = TIME
30 WHILE (INKEY$="") AND (TIME-instanteInicial < 300*3): WEND
40 PRINT "Soy el menu"
 

Existe una forma un poco más elegante que hacer ese WHILE comparando continuamente con el reloj, y además esta otra forma sobrecarga menos el ordenador, por lo que es más adecuada si estamos ya dentro del junto, haciendo algo más que esperar (por ejemplo, si movemos algún objeto por la pantalla). Esa forma alternativa es la orden AFTER, a la que se le indica el tiempo a esperar (medido en 1/50 de segundo, no en 1/300 como como usa TIME) y la línea a la que queremos saltar cuando ese tiempo pase:

10 PRINT "Soy la pantalla de bienvenida"
20 AFTER 50*3 GOSUB 40
30 GOTO 30: 'Espero...
40 PRINT "Soy el menu"
 

Siendo estrictos, el último fuente no es "muy razonable": saltamos con un GOSUB a una línea desde la que no regresamos... pero haremos la vista gorda y pasaremos a EVERY, que es más útil.

 

15.2 Hacer algo cada rato: EVERY

Es más habitual que no queramos hacer algo al cabo de un rato y olvidarnos, sino que se trate de una tarea repetitiva, como pueda ser mostrar un reloj en pantalla o mover el personaje de un juego. Para eso es más útil la orden EVERY. Por ejemplo, para hacer que un personaje rebote por la pantalla, podemos hacer un WHILE de espera entre un "fotograma" de la animación y otro, o simplemente usar un EVERY, así:

10 xMin = 1: yMin = 1
20 xMax = 40: yMax = 25
30 xActual = 20: yActual = 10
40 incrX = 1: incrY = 1
50 personaje$ = CHR$(248)
60 MODE 1
70 EVERY 5 GOSUB 100
80 GOTO 80
100 LOCATE xActual, yActual
110 PRINT " "
120 xActual = xActual + incrX
130 yActual = yActual + incrY
140 LOCATE xActual, yActual
150 PRINT personaje$
160 IF (xActual = xMin) OR (xActual = xMax) THEN incrX = -incrX
170 IF (yActual = yMin) OR (yActual = yMax) THEN incrY = -incrY
180 RETURN
 

Cada décima de segundo (5/50 s) saltamos a una rutina que borra la posición actual del personaje, calcula su nueva posición, lo dibuja, y comprueba si ha chocado con algún borde, caso en el que deberíamos hacer que se mueva en dirección contraria.

 

15.3 Los cuatro temporizadores

Lo que hemos dicho hasta ahora no estaba completo del todo: falta un parámetro (opcional) en AFTER y EVERY, que es el número de temporizador que queremos usar.

Sí, tenemos a nuestra disposición cuatro temporizadores (del 0 al 3), de modo que podríamos realizar hasta 4 tareas temporizadas a la vez. De estos canales, el 3 es el de máxima prioridad (el que antes se atenderá si dos llamadas coinciden) y el 0 es el de menor prioridad. Si no indicamos temporizador, se usa el 0.

Así, un ejemplo más completo aplicado al fuente anterior sería:

70 EVERY 5, 3 GOSUB 100

 

15.4 Desactivar un temporizador

¿Qué ocurre si queremos que algo deje de repetirse? No es problema. Podemos desactivar un temporizador. Para eso usamos la función REMAIN, que además nos dice el tiempo que quedaba hasta el siguiente "salto":

restante = REMAIN(3)

 

15.5 Ejercicio propuesto

Crear un reloj en pantalla: se pedirá al usuario la hora actual (en formato HH:MM:SS) y cada segundo aumentará la hora según corresponda: se sumará 1 a los segundos, si se alcanza 60 se convertirá en 00 y se sumará 1 a los minutos, y así sucesivamente.