viernes, 18 de marzo de 2016

Sobre como mantener diferentes escenas en love2d (Un ejemplo sencillo)


Que tal amigos, hoy tengo la intención de mostrar un pequeño ejemplo mostrando el uso del gestor de escenas. El ejemplo no será nada en especial, pero para no hacer demasiado largas las entradas del blog he preferido hacerlo en un post aparte. Tampoco voy a entrar en demasiados detalles con el código, lo dejo aquí esta vez mínimamente comentado pues es muy sencillo.


El ejemplo hará uso de tres escenas independientes que serán controladas por el gestor de escenas.
Para el ejemplo se hará uso de archivo escena.lua y gestorDeEscenas.lua que se vieron es entradas anteriores:



Dejo aquí un enlace al ejemplo comprimido en "*.zip"

Manejando escenas

La primera escena hará a modo de menú y desde ella se podrá pasar a las otras dos. La segunda escena mostrara un cuadrado en pantalla que podrá ser movido mediante las teclas de dirección. La tercera mostrará un círculo que se desplazará con el cursor.


Lo primero será crear una nueva carpeta donde crear nuestro archivo main.lua, en este mismo directorio deberemos tener también nuestros archivos escenas.lua y gestorDeEscenas.lua.
Además de estos archivos, también crearemos otros tres archivos más, uno por escena. Estos archivos se llamarán: menuInicio.lua, mueveCuadrado.lua, mueveCirculo.lua

Decir que excluyo el código del archivo escenas.lua y gestorDeEscenas.lua que pueden ser visitados desde los enlaces propuestos más arriba.

Y así de simple y de sencillo, dejo aquí el código para este ejemplo.

main.lua

function love.load()

     --incluimos el archivo EscenaPrueba

      escena=require("EscenaPrueba")

     --llamamos a la función load de la escena

escena.load()

end


function love.update(dt)

     --actualizamos la escena

      escena.update(dt)

end


function love.draw()

     --dibujamos la escena

      escena.draw()

end





menuInicio.lua


gestor=require("gestorDeEscenas")

menuInicio=gestor:nueva_escena("inicio")


--Usamos update para detectar la tecla de opción pulsada

--Si es una tecla de opción correcta, cambiamos a la escena escogida

function menuInicio.update(dt)

     if (love.timer) then

         if love.keyboard.isDown("1") then

                gestor:cambiar_escena("mueveCuadrado")

         elseif love.keyboard.isDown("2") then

                gestor:cambiar_escena("mueveCirculo")

         end

    end

end


--Dibujamos el menú en pantalla

function menuInicio.draw()

     love.graphics.print("Elige la escena a cargar",300,100)

     love.graphics.print("pulsando la tecla, de opción, deseada",300,120)

     love.graphics.print("1:) Mover un cuadrado con el teclado.",300,150)

     love.graphics.print("2:) Mover un círculo con el cursor.",300,170)

     love.graphics.print("En cualquier escena, pulsa la tecla 'q' para regresar al menú.",300,200)

end


mueveCirculo.lua


gestor=require("gestorDeEscenas")

mueveCirculo=gestor:nueva_escena("mueveCirculo")


--usamos la función load para cargar los datos de la escena

--en este caso la estructura de un círculo

function mueveCirculo.load()


     circulo={120,120,40}

end


--La función show será llamada cada vez que entremos en la escena

--y la usamos para recolocar el círculo

function mueveCirculo.show()

     circulo[1]=50

     circulo[2]=50

end


--En la función update recogemos la posición del cursor

--y colocamos el círculo en esas coordenadas

function mueveCirculo.update(dt)

     mX=love.mouse.getX()

     mY=love.mouse.getY()

     circulo[1]=mX

     circulo[2]=mY

     --Si pulsamos 'q' retornamos al menú

     if love.keyboard.isDown("q") then

          gestor:cambiar_escena("inicio")

     end


end


--Recogemos los datos actuales de círculo

--y lo dibujamos en pantalla

function mueveCirculo.draw()

     x=circulo[1]

     y=circulo[2]

     r=circulo[3]

     love.graphics.circle("fill",x,y,r,100)

end


mueveCuadrado.lua

gestor=require("gestorDeEscenas")

mueveCuadrado=gestor:nueva_escena("mueveCuadrado")


--usamos la función load para cargar los datos de la escena

--en este caso la estructura de un cuadrado

function mueveCuadrado.load()

     cuadrado={50,50,100,100}

     velocidad=8

end


--Usamos la función show para recolocar las posiciones del cuadrado

function mueveCuadrado.show()

     cuadrado[1]=50

     cuadrado[2]=50

end



--Usamos update para detectar las teclas del teclado y así

--desplazar el cuadrado

function mueveCuadrado.update(dt)


     if love.keyboard.isDown("up") then

         cuadrado[2]=cuadrado[2]-velocidad

    elseif love.keyboard.isDown("down") then

         cuadrado[2]=cuadrado[2]+velocidad

    elseif love.keyboard.isDown("left") then

         cuadrado[1]=cuadrado[1]-velocidad

    elseif love.keyboard.isDown("right") then

        cuadrado[1]=cuadrado[1]+velocidad

    --Si pulsamos la tecla 'q' regresaremos al menú

    elseif love.keyboard.isDown("q") then

        gestor:cambiar_escena("inicio")

    end

end


--Recuperamos la estructura del cuadrado y

-- lo dibujamos en la pantalla

function mueveCuadrado.draw()

     x=cuadrado[1]

     y=cuadrado[2]

     w=cuadrado[3]

     h=cuadrado[4]

     love.graphics.rectangle("fill",x,y,w,h)

end

Con esto tendríamos todo el ejemplo listo para funcionar . Se que es muy, muy sencillo, pero es más que suficiente para hacerse una idea de lo versátil que es usar un gestor de escenas para manejar las pantallas de nuestros pequeños juegos.

Sin nada más que decir, me despido, hasta próxima.

No hay comentarios:

Publicar un comentario