Iniciación a Lua creando un videojuego: Capítulo 3
10 oct 2009 Lua, Tutoriales

Seguimos con el curso y llegamos al tercer capítulo en el que comentaremos los aspectos básicos de Lua y de psp. En próximas entregas ejemplificaremos estos conceptos, de momento sólo los introducimos.
Capitulo 3: nociones básicas de programación en Lua
3.1. Lua HM
Como hemos comentado en la introducción trabajaremos con Lua Player HM7, por su carácter estandarizado. Pero además de él existen otros interpretes como el Lua Player original, PGE lua, o Lua Player Euphoria. En mi opinión personal este último es el más apto para el desarrollo de videojuegos, pero su poca madurez hace que para este curso y proyecto prefiramos la robustez que nos ofrece HM.
La descarga de este interprete, como del resto de archivos necesarios para seguir este tutorial, la podréis encontrar en el apéndice de descarga, o en el enlace que se muestra acontinuación.
3.2. Consideraciones previas
Lua es un lenguaje de scripts y como tal no precisa de un compilador, tan sólo de un interprete. A través de este interprete probaremos nuestro software, bien usando el interprete de luaplayer 0.20 para windows o bien HM7 en nuestras psp.
Nosotros programamos en Lua Player HM7, por lo que la primera parte del tutorial se centrará en desarrollar las partes en Lua “Standart” y que podremos probar en el pc, y la segunda en las funciones especificas de LuaHM7 y que tendremos que testear en psp.
Para crear un archivo de código Lua basta con cambiar la extensión de un archivo “.txt” a “.lua”. Dentro de ese archivo, Lua no distinguirá entre un espacio o más. Es decir que para el interprete es lo mismo: [a = b] que [a = b].
A la hora de programar necesitaremos una herramienta que nos permita intercalar nuestro código con explicaciones o directrices que nos ayuden a su comprensión en futuras revisiones, Lua nos ofrece la herramienta de los comentarios. Los comentarios se inician con dos barras: “–”, y se marcan por lineas. Un comentario sigue desde su inicio, hasta el siguiente salto de linea (pulsación de intro).
3.3. Módulos
Lua player incorpora una serie de módulos que lo convierten en un gran engine para la creación de videojuegos. Nosotros haremos uso de los 4 módulos principales: math, image, sonido y SystemIO. Estos módulos se cargan todos de golpe y por defecto, se podrían descargar para liberar ram, pero en nuestro caso no nos es necesario.
Las funciones de estos módulos están almacenadas dentro de una tabla, por eso todas ellas llevan el mismo prefijo y siguen una forma similar. Los módulos varían entre interpretes, así la forma de mostrar una imagen o reproducir un sonido no será la misma en LuaHM7 que en LuaPlayerEuphoria. Debemos tener en cuenta este hecho, sobretodo para decidir bien al principio que interprete se ajusta más a nuestras necesidades, pues realizar un port puede ser molesto, consume un tiempo valioso y en muchos caso es muy largo.
3.4. Ram
Una de nuestras principales limitaciones a la hora de programar, pues a este nivel precisaremos de más memoria que de potencia de procesador. Cuando la complejidad de vuestros proyectos avance, notaréis que siempre necesitáis más de ambas, y en ese momento se llega al punto en que no sólo es necesario saber programar sino también hacerlo con economía, claridad, efectividad y solvencia.
En principio, LuaHM7 nos deja libres 20mb de memoria aproximadamente. Para nuestro actual proyecto nos basta y nos sobra. Disfrutaremos de no tener que preocuparnos en exceso de cuanta RAM nos queda durante este proyecto, sin embargo en posteriores esto cambiará por lo que intentaremos coger la buena costumbre de optimizar nuestros recursos por muy grandes que sean y por mucho que nos sobren.
3.5. Procesador
El procesador marca el compás de nuestro juego, LuaHM7 consume demasiada potencia y toma demasiado tiempo para la impresión de imágenes, por lo que también optimizaremos las impresiones de pantalla con pequeños trucos que aumentarán la velocidad.
Pero, no sólo debemos tener en cuenta las imágenes, sino también el resto de funciones. Deberemos buscar el equilibrio entre tiempo de ejecución y calidad del software. En caso de que necesitemos más potencia, siempre podemos hacer que el procesador aumente su frecuencia a 333mhz aumentando también el consumo de energía de la máquina.
Si aumenta el consumo, la batería se agotará más pronto y es algo que debemos tener muy presente en la plataforma para la que desarrollamos. Estamos en el contexto de una portátil, por lo tanto nos adaptamos a su hardware, a su software y a un tipo de juegos con unas características muy especificas. Tenemos limitaciones de hardware y por ello debemos buscar el equilibrio optimo entre todos los componentes que la conforman.
En este proyecto no nos encontraremos con situaciones de limitación manifiesta de la máquina, sino más bien de LuaHM7, ya que el interprete es quien nos demarca los límites en primera instancia.
3.6. Variables
Una variable es una entidad que almacena uno o varios datos en memoria cuyo valor puede variar durante la ejecución. Analogamente podemos definir constante, como un dato almacenado cuyo valor no varia durante la ejecución. Lua no distingue entre constantes y variables, nosotros mismos definiremos las constantes al no manipular su valor durante la ejecución.
Para elegir el nombre de nuestras variables seguiremos dos pautas: que su nombre sea significativo con respecto a su contenido y que no sea demasiado largo. Además cuando el nombre sea compuesto seguiremos un patrón de separar las palabras que lo componen con una barra baja:
Nombre_Variable
3.7. Estructura básica
La mayoría de juegos siguen un mismo orden a la hora de ejecutar sus acciones a un nivel esquematizado, conformando así una estructura básica que también aplicaremos al programar en Lua.
En el contexto de Lua, esta estructura estará conformada por: declaración o inclusión de métodos, declaración de variables o carga de archivos y bucle principal. Estos 3 elementos generales, se dividen a su vez en más pequeños, y en este caso generalmente varían en función del objetivo del programa y del programador.
En caso de los videojuegos definiremos una estructura dentro del bucle principal especifica, y se resumirá en: impresión de gráficos (ouput), lectura de controles (input) y finalmente las acciones que se realicen dentro del juego.
Consideraremos un pequeño ejemplo. En él una imagen se mueve hacia arriba cuando se apreta el botón X. En primer lugar declararemos los métodos, en nuestro caso sólo uno que se encargará de mover la imágen si se pulsa el botón x. Después pasamos a la declaración de la variables, cargamos la imagen que se mostrará y creamos dos variables de tipo número que almacenarán su posición en pantalla. Y así llegamos a nuestro bucle principal, en él mostraremos la imagen en pantalla, leeremos los controles, y realizaremos las acciones pertinentes al input del usuario.


15 noviembre 2009 a las 18:09
[...] Capítulo 3 [...]
21 febrero 2010 a las 15:21
[...] Capítulo 3 [...]