Llegamos a la segunda parte del capítulo 5 del curso de iniciación a Lua desarrollando un videojuego. Recordad que la primera entrega de este capítulo se publicó la semana pasada, la tercera y última se publicará durante la próxima semana.

Ya podemos pasar al desplazamiento del logo por pantalla. Recordemos que para ello definimos los elementos Logo.x, y Logo.y dentro de un array que además almacenaba la imagen. Esos dos valores son los que determinan en que punto se mueve la imagen y los que deberemos aumentar o disminuir a cada iteración para deplazar el logo en pantalla.

El movimiento se efectuará de izquierda a derecha, por lo que incrementaremos el valor de Logo.x (posición en el eje x) y no modificaremos el valor de Logo.y ya que no se mueve verticalemente.

Logo.x = Logo.x + 1

La imagen no se desplazará indefinidamente, sino que al llegar a un punto se mantendrá estática. Una vez en el punto se mantendrá unos segundos estática y finalizará la escena de entrada. Ese punto será por ejemplo el 220 en el eje x. Para comprobar si ha llegado a ese punto introduciremos la instrucción if, que en función de si la condición determinada es cierta lleva a cabo o no unas acciones. El esquema de la intrucción if es el siguiente:

if condicion then

Acciones

end

Al igual que en una instrucción while la condición se evalua como cierta (true) o falsa (false) mediante los operadores booleanos. La diferencia entre if y while es que la instrucción if pertenece al esquema condicional, que realiza o no ciertas acciones en función de unas condiciones sin afectar al resto de las acciones no condicionadas; y el bucle while pertenece al esquema iterativo, en el que tan sólo se realizan unas tareas determinadas mientras se cumpla una condición.

while true do –la condición se cumple siempre

L = 1

end

screen:print(20,20,L)–I1

if true then –la condición se cumple siempre

L = 1

end

screen:print(20,20,L)–I2

I1 no se ejecuta

I2 si se ejecuta

Tras conocer lo básico acerca de la instrucción if, podemos definir la comprobación que realizaremos para conocer si el logo ha llegado al punto definido. Si ha llegado pasaremos a contar el tiempo que ha pasado desde que llegó a ese lugar.

if Logo.x >= 220 then

–Contabilizar tiempo

end

Esto nos plantea una nueva cuestión: ¿cómo contar el tiempo? Podríamos acometer esta tarea contando las iteraciones con una variable contador que se incrementase a cada pasada en lugar del tiempo propiamente dicho, pero aprovecharemos esta tesitura para introducir los llamados timers o temporizadores.

La ventaja de los temporizadores es que contabilizan el tiempo independientemente del número de iteraciones de nuestro programa, es decir no depende directamente del número de instrucciones a ejecutar y por tanto, el tiempo contará al mismo ritmo en un programa u otro. Para crear un Timer debemos almacenarlo en una variable que lo identifique, y a partir de ella podremos acceder a las diferentes propiedades del mismo. La función para crear un timer es: Timer.new([Tiempo Inicial]):

Temporizador = Timer.new(0)

NOTA:Al ser creado el temporizador comienza a contar por lo que lo detendremos como veremos más adelante.

Es importante especificar que la variable Temporizador no contiene el tiempo, sino al contador en sí. El tiempo es una propiedad o un valor del temporizador al que accederemos mediante el método Timer:time(), donde Timer será el temporizador creado previamente. Este valor es el que almacenaremos en otra variable llamada Tiempo, y esta será la que nos dirá el tiempo transcurrido:

Tiempo = Temporizador:time()

Además de acceder al tiempo que lleva acumulado, podemos controlar el temporizador con una serie de métodos. A continuación os los dejo agrupados en una tabla con su cometido:

Timer:stop()

Para el temporizador

Timer:start()

Inicia la cuenta del temporizador

Timer:reset([startTime])

Reinicia la cuenta del temporizador estableciéndola en el tiempo dado

Timer:time()

Devuelve el valor del tiempo acumulado en milisegundos

Otro aspecto a considerar es la unidad en que mide el tiempo: los milisegundos. Sigue la tabla de conversión decimal y del Sistema Internacional de Medidas, por lo que mil milisegundos equivalen a un segundo:

1000ms = 1s

1ms = 1*10-3

Pasemos a aplicar lo visto a nuestra escena de entrada. Declararemos nuestro temporizador junto con las primeras variables declaradas, y completaremos nuestro condicional iniciándolo:

if Logo.x >= 220 then

Temporizador:start()

end

Añadiremos un nuevo condicional que se encargará de comprobar si ha transcurrido el tiempo fijado para finalizar la escena de entrada, que es el motivo por el cual hemos creado el temporizador. Para ello necesitaremos una variable en la que almacenar el tiempo, como hemos comentado. Puesto que el tiempo cambia de valor constantemente deberemos actualizar el valor de la variable asignando el del nuevo tiempo a cada iteración. Fijaremos como valor de tiempo a transcurrir el de 3 segundos, es decir, 3000 milisegundos. Nuestro código debería ser algo como esto:

Negro = Color.new(0,0,0)

Blanco = Color.new(255,255,255)

Juego = {Estado = 0}

Logo = {x = 0, y = 40, Img = Image.load(“IMG/Logo.png”)}

Temporizador = Timer.new()

Temporizador:stop()

while Juego.Estado == 0 do

screen:clear()

Tiempo = Temporizador:time()

screen:blit(Logo.x, Logo.y, Logo.Img)

screen:print(120,220, “FMCDev”,Blanco)

screen:print(120,240, “http://fmcdev.es”,Blanco)

if Logo.x >= 160 then

Temporizador:start()

else

Logo.x = Logo.x + 2

end

if Tiempo >= 3000 then

Juego.Estado = 1

Temporizador:reset(0)

Temporizador:stop()

end

screen.flip()

screen.waitVblankStart()

end