int timer[10]; // Contadores de tiempo


Ésta es una tabla global con 10 posiciones, desde timer[0] hasta timer[9], y cada una de estas 10 posiciones es un contador de centésimas de segundo que se va incrementando automáticamente.

Al comienzo del programa estos 10 contadores serán puestos a cero. Se utilizan para cronometrar tiempos dentro de un programa, para lo que pueden ser puestos a cero en cualquier momento.

Se dispone de 10 contadores para que el usuario pueda dedicar cada uno de ellos a realizar una cuenta diferente dentro del juego; es indiferente cuáles de los 10 contadores se utilicen. Normalmente, si el programa necesita un sólo contador (en la mayoría de ocasiones) se suele utilizar el número 0 (timer[0]), ya que el lenguaje permite omitir el cero entre corchetes en este caso, es decir, si únicamente se necesita un contador, se puede utilizar simplemente timer.

Por ejemplo, para implementar un proceso que a los 5 segundos del inicio de su ejecución (de haberlo llamado) realizara una acción determinada, se construiría el mismo de una forma similar a ésta (utilizando, por ejemplo, el contador timer[9]):

 PROCESS( proceso_ejemplo )
BEGIN
     timer[9]=0;
     // ...
     LOOP{
        if (timer[9]==500){
             // Acción a realizar ...
        }
         // ...
         FRAME;
     }
END

Nota 1: Como la cuenta se realiza en centésimas de segundo, en cada imagen del juego estos contadores se pueden incrementar en 1 centésima, 2, 3, 4, etc., es decir, en un ejemplo como el anterior no se puede esperar a que timer[9] sea exactamente igual a 500, ya que una imagen podría indicar 497 centésimas transcurridas (desde su puesta a cero con timer[9]=0;) y la siguiente imagen 502 centésimas, sin haber pasado por el valor 500.

Nota 2: Es también importante resaltar que se deben tomar precauciones para que no haya en el programa varios procesos utilizando el mismo contador para diferentes fines.

Si, por ejemplo, se creara un proceso_ejemplo() (como el anterior), en cada imagen del juego éstos no llegarían nunca a ejecutar la acción de los cinco segundos, ya que cada uno de ellos pondría a 0 el contador timer[9] al comienzo de su ejecución invalidando, de esta forma, la cuenta de los procesos anteriores.

Teniendo en cuenta que el contador timer[9] es una tabla global, es decir, es el mismo para todos los procesos del juego, si un proceso lo pone a 0, lo pondrá a 0 para el resto de los procesos.

Nota 3: Por último se debe tener cuidado con las condiciones similares a la del ejemplo anterior (if (timer[9]==500) ... ) ya que estas condiciones no se activarán únicamente una vez a los 5 segundos, sino que se activarán todas las veces después de los primeros 5 segundos.

Para poder comprender mejor el problema, se muestra a continuación un proceso que realiza una acción, únicamente una vez, a los cinco segundos de haberse iniciado su ejecución.

 PROCESS( proceso_ejemplo )

PRIVATE
   int  accion_realizada;

BEGIN
    
accion_realizada = false;
     timer[9]=0;
     // ...
     LOOP{
         if (timer[9]==500) AND NOT accion_realizada){
             // Acción a realizar ...
             acción_realizada=true;
         }
         // ...
         FRAME;
     }
END

Se utiliza una variable privada denominada accion_realizada que, en un principio, será falsa. Para realizar la acción ahora se requerirá que hayan pasado más de cinco segundos y que no se haya realizado ya la acción. Tras realizar ésta, se pondrá por tanto la variable accion_realizada a cierto.

Para que el ejemplo anterior ejecutara la acción cada cinco segundos (indefinidamente), bastaría con volver a poner la sentencia timer[9]=0; tras la acción a realizar, no siendo necesaria, en esta caso, la variable privada accion_realizada ya que se necesitarían otros 5 segundos para que timer[9] fuera otra vez mayor o igual que 500.


Ver: Datos globales