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