Ejemplo De Juego En Lua
ikuto_hatsune6 de Julio de 2013
11.147 Palabras (45 Páginas)952 Visitas
Ejemplo de juego programado en LUA
Mediante este tutorial se pretende explicar el funcionamiento de un juego hecho en LUA. Se trata del juego TenisLUA, el cual podéis descargar desde el apartado Juegos.
La intención de este tutorial es, mediante un caso práctico, ver como está estructurado un juego. Veremos como se inicializan las variables utilizadas en el juego, como se cargan la imágenes y sonidos, como desde el menú principal se eligen diferentes opciones de juego y como se controla la pelota y las barras que mueven los jugadores. Es el primer juego que hago, por lo que espero recibir muchas crí¬ticas constructivas de los expertos en programación.
Existen muchos tipos de juegos, como puzzles, plataformas, carreras, con movimientos en 2 o 3 dimensiones, etc. Cada uno de ellos es internamente muy diferente de los demás. El juego elegido para el tutorial es un 2 dimensiones muy sencillo, por lo que le considero ideal para aprender. De hecho el primer juego de ordenador creado fue el famoso Pong: un juego de tenis en 2 dimensiones.
Por ser LUA un lenguaje de programación abierto, sin compilar, podemos editar cualquier juego y ver como funciona internamente. De esta forma es más fácil aprender a programar estudiando como están hechos otros juegos.
Como ya sabréis existen lenguajes como C++ que son muchí¬simo más potentes que LUA, pero también son más complicados y engorrosos de aprender y utilizar. Además, por estar compilados, no se puede ver fácilmente su funcionamiento.
Personalmente creo que si alguien quiere aprender a programar, es mejor empezar con un lenguaje sencillo como LUA, y más adelante, una vez se entiende como funciona un lenguaje de programación, dar el salto a C++. Pero repito, es una opinión personal.
La elección de este juego se debió a que gráficamente es muy sencillo y técnicamente no requiere de muchos conocimientos de programación en LUA. Estudiando los tutoriales de LUA de ELenDeR y mordi se aprenden prácticamente todos las comandos necesarios para hacer un juego de este tipo. Algún otro comando lo he tenido que buscar en la web oficial de LUA. Aparte son necesarios unos conocimientos muy básicos de trigonometrí¬a, como veremos más adelante. Los comandos que no se explican en este tutorial los podéis encontrar en los tutoriales de ElenDeR y mordi, cuya lectura se hace casi imprescindible.
Para poder seguir este tutorial son necesarios estos elementos:
• PSP, para poder ver el juego en funcionamiento.
• El juego TenisPSP, para poder editarlo y ver el programa.
• Notepad++ u otro similar, editor de textos para PC, que facilita la visualización del programa.
El tutorial se divide en los siguientes capí¬tulos:
1.- Inicialización de variables y Bucle principal
2.- Función menuprincipal y Función botonesmenu
3.- Función juego, Función colisiones y Función pantalla juego
4.- Función botones juego y Función pausar
5.- Función control puntos y Función saque aleatorio
6.- Función finjuego, Función pantallafin y Función inicializar
1.- Inicialización de variables y Bucle principal
Lo primero que hace el programa es cargar las imágenes que necesita el juego:
--carga imagenes
lua = Image.load("Imagenes/lua.png") (pantalla de presentación de LUA)
tenis = Image.load("Imagenes/tenis.png" ) (pantalla de presentación del juego)
menu = Image.load("Imagenes/menu.png") (fondo de la pantalla de menú)
fondo = Image.load("Imagenes/fondo.png") (fondo de la pantalla de juego)
pelota = Image.load("Imagenes/pelota.png") (imagen de la pelota)
BarraIzda = Image.load("Imagenes/BarraIzqda.png") (imagen para la barra izquierda)
BarraDrch = Image.load("Imagenes/BarraDrcha.png") (imagen para la barra derecha)
A continuación se cargan los sonidos:
-- carga sonidos
SonidoPunto = Sound.load ("Sonidos/punto.wav",false) (sonido cuando se consigue un punto)
SonidoPared = Sound.load ("Sonidos/pared.wav",false) (sonido cuando la bola da en una pared)
SonidoBarra = Sound.load ("Sonidos/barra.wav",false) (sonido cuando la bola da en una barra)
SonidoEsquina = Sound.load ("Sonidos/esquina.wav",false) (sonido cuando la bola da en una esquina de una barra)
A continuación lo que se hace es inicializar todas las variables que se van a utilizar durante el juego. De esta manera, cuando se vayan a utilizar en el programa, su valor ya estará definido:
-- inicializa variables menu
opcionmenu = 1 (Opción del menú que está seleccionada)
NumJug = 1 (Número de jugadores seleccionado)
puntosmenor = 9 (Número de puntos menor que dura el juego)
puntosmayor = 15 (Número de puntos mayor que dura el juego)
puntos = puntosmenor (Número de puntos que dura el juego, por defecto el menor)
nivel = 1 (Nivel de dificultad del juego)
como = 1 (Indica en que situación se está: 1 = pantalla menú, 2 = pantalla juego)
-- inicializa variables puntos
PuntosIzda = 0 (Puntos conseguidos por el jugador de la izquierda)
PuntosDrch = 0 (Puntos conseguidos por el jugador de la derecha)
-- variables pelota
x = 30 (Coordenada X de la pelota)
y = 136 (Coordenada Y de la pelota)
VelPelotaIni = 6 (Velocidad inicial de la pelota, pixels que avanza en cada movimiento)
VelPelota = VelPelotaIni (Velocidad de la pelota)
pi = math.atan(1) * 4 (Calculo de pi, para utilizar a continuación)
AngPico = 30 (Angulo en grados que varia la dirección de la pelota, cuando da en la esquina de una barra)
AngPico = (AngPico * pi ) / 180 (El ángulo pasado a radianes)
aleat = math.random(1,4)
if aleat == 1 then
angulo = -30
elseif aleat == 2 then
angulo = -20
elseif aleat == 3 then
angulo = 20
elseif aleat == 4 then
angulo = 30
end
Mediante este grupo de comandos se calcula la dirección inicial de la pelota, de forma aleatoria. La función matemáticamath.random(1,4) devuelve un número pseudoaleatorio comprendido entre 1 y 4. En función de este número se selecciona el ángulo que forma la dirección de desplazamiento de la pelota.
AngPelota = (angulo * pi) / 180 (Angulo de desplazamiento de la pelota, pasado a radianes)
NumGolpes = 0 (Contador de número de golpes, para cada punto jugado. En uno de los siguientes capí¬tulos veremos para que utilizamos este contador)
-- Variables Barras
PosBarraIzda = 136 (Posición inicial en pantalla de la barra izquierda)
PosBarraDrch = 136 (Posición inicial en pantalla de la barra derecha)
VelBarra = 8 (Número de pixels que se desplaza una barra por cada pulsación de botón)
A continuación se definen los colores que se van a utilizar:
-- colores
rojo = Color.new(255,0,0)
verde = Color.new(0,255,0)
verdoso = Color.new(204,255,0)
Definimos las fuentes que se utilizaran en el menú principal y en la pantalla de juego:
-- fuentes
proportional25 = Font.createProportional()
proportional25:setPixelSizes(0, 25)
proportional15 = Font.createProportional()
proportional15:setPixelSizes(0, 15)
La fuente llamada proportional25 será una fuente de tipo proporcional, de altura 25 pixels.
La fuente llamada proportional15 será una fuente de tipo proporcional, de altura 15 pixels.
A continuación se muestran consecutivamente las dos pantallas de presentación, durante un tiempo de 80/60 segundos.
-- pantallas presentacion
screen:blit(0, 0, lua)
screen.waitVblankStart()
screen.flip()
screen.waitVblankStart(80)
screen:blit(0, 0, tenis)
screen.waitVblankStart()
screen.flip()
screen.waitVblankStart(80)
Lo siguiente que aparece en el programa son las declaraciones de funciones que utilizaremos durante el juego, y que veremos en los siguientes capí¬tulos.
Por último se entra en el bucle principal del programa.
<
-- Bucle principal
while true do
if como == 1 then
menuprincipal()
end
if como == 2 then
juego()
end
if opcionmenu == 5 then
pad = Controls.read()
...