domingo, 6 de marzo de 2016

Lo que sé sobre: Como detectar colisiones en Love2d (punto en rectángulo, el caso de un botón)



Lo que se sobre: Como detectar colisiones en Love2d (punto en rectángulo, el caso de un botón)



¿Acaso no sabes como hacer que el héroe de tu juego sea capaz de golpear a ese maldito enemigo?

¿Como demonios hago para que mi ratón pulse es bonito botón?


Pues poco a poco voy a explicar lo que yo voy aprendiendo sobre como detectar varios tipos de colisiones en love2d. 

En este caso la más sencilla, como descubrir si unas coordenadas están dentro de un rectángulo.


En este ejemplo voy a escribir las funciones dentro de un archivo externo al main.lua, por la cosa de darle un poco de orden al código.

Lo primero que vamos a hacer, será crear una carpeta con los archivos main.lua y ControlDeColisiones.lua

dentro del main.lua vamos a escribir la estructura básica de un programa en love.2d:




function love.load()

     --Aquí crearemos las variables y cargaremos los recursos

end



function love.update(dt)

     --Aquí realizaremos la actualización lógica de la aplicación

end



function love.draw()

     --Aqui se realizara todo el proceso de dibujar la pantalla

end

Después vamos a crear el contenido inicial de nuestro archivo ControlDeColisiones.lua
dentro de el pasamos a escribir lo siguiente:


--Creamos la tabla que contendrá las funciones detectoras

ControlDeColisiones={}



     --[Aquí las funciones del archivo]--



--retornamos la tabla generada

return ControlDeColisiones

como dije el primer caso que vamos a ocupar, es como detectar si unas coordenadas x, y están encima de un rectángulo. Para ello vamos a escribir la siguiente función dentro del nuestro archivo controlDeColisiones.lua

--Creamos la tabla que contendrá las funciones detectoras

ControlDeColisiones={}


--creamos la función y se la asignamos a la tabla ControlDeColisiones

function ControlDeColisiones.colision_punto_con_rectangulo(x,y,rX,rY,rAncho,rAlto)

    --[[Recibe unas coordenadas x,y y la estructura de un rectángulo dado por sus coordenadas
    "rx,ry"  y sus dimensiones "rAncho,rAlto"

    La función retornará true si las coordenadas iniciales se encuentran dentro del rectángulo
     recibido]]--



    --[[El if comprueba si la posición x recibida es mayor o igual que la posición x del

    rectángulo y si al mismo tiempo es menor o igual que la posición x del rectángulo más su
     ancho.  
     Si el primer if es correcto manejaremos el segundo if.]]--


    if (x>=rX and x<=rX+rAncho) then

       --[[Este if comprueba si la posición y recibida es mayo que la posición y del rectángulo y si al 
         mismo tiempo es menor que la posición y del rectángulo más su alto. Si el if es así la función 
         retornará true]]--

       if (y>=rY and y<=rY+rAlto) then

          return true

       end

    end

    --[[En caso de que las comprobaciones anteriores no sean correctas la función retornara false]]--

    return false

end



--retornamos la tabla generada

return ControlDeColisiones

Con esto será suficiente para comprobar este caso.

Para ver como funciona, vamos a escribir el siguiente código en el archivo main.lua. Este ejemplo detectará si el cursor del ratón se posiciona sobre un rectangulo dibujado sobre la pantalla.


Primero vamos a la función love.load y mediante la sentencia “requiere” incluimos nuestro archivo ControlDeColisiones.lua de la siguiente manera:

y creamos la estructura de nuestro rectángulo:

function love.load()

     controlColision=require("ControlDeColisiones")

end

Con esto lo que hacemos es asignar la tabla creada en el archivo ControlDeColisiones.lua a la variable controlColision.

Lo siguiente será generar la estructura de nuestro rectángulo mediante las variables

  • rx: Posición horizontal del rectángulo
  • ry: Posición vertical del rectángulo
  • rAncho: Ancho del rectángulo
  • rAlto: Alto del rectángulo

También generaremos una variable de texto que contendrá el mensaje de control.




function love.load()

     controlColision=require("ControlDeColisiones")

     rX=300

     rY=200

     rAncho=200

     rAlto=200

     texto="Fuera del rectángulo"

end

Después de crear la estructura de nuestro rectángulo, pasaremos a comprobar si el cursor del ratón se posa o no sobre el rectángulo. Esto lo haremos dentro de la función love.update(dt)

function love.update(dt)
     --[[Con las siguientes funciones obtendremos las posiciones del cursor sobre
     la pantalla y las guardamos dentro de las variables mX,mY]]--

     mX=love.mouse.getX()
     mY=love.mouse.getY()

     --[[Llamamos a la función generada en nuestro archivo 
     ControlDeColisiones.lua pasándole
     tanto las coordenadas del ratón como la estructura del rectángulo y 
     cambiamos el mensaje de control, indicando si se está dentro o fuera del 
     rectángulo]]--
     if ( controlColision.colision_punto_con_rectangulo(mX,mY,rX,rY,rAncho,rAlto)) then
         texto="Detro del rectángulo"
     else
         texto="Fuera del rectángulo"
     end
end

Una vez las comprobaciones están listas, pasamos a dibujar todo en pantalla con la función love.draw()

function love.draw()
     --Pintamos el rectángulo en pantalla
     love.graphics.rectangle("fill",rX,rY,rAncho,rAlto)
     --Pintamos el mensaje de control
     love.graphics.print(texto,10,10)
end

con esto el ejemplo estaría listo.

Si ejecutáis este código podréis ver algo como lo siguiente.



 Y hasta aquí, lo que sé sobre como detectar si unas coordenadas están dentro de un rectángulo.


No hay comentarios:

Publicar un comentario