Programación Orientada a Objetos en Love2D(Lua)
Me interesé por Love2D y Lua y decidí probarlo.
Para familiarizarme tanto con Lua como con Love2D, escribí un ejemplo sencillo:
Estructura del proyecto:
demo
|-ball.lua
|-main.lua
ball.lua
Ball = {
x = 0,
y = 0,
xSpeed = 0,
ySpeed = 0,
ballRadius = 0,
r = 0,
g = 0,
b = 0
}
function Ball:new(x, y, xSpeed, ySpeed, ballRadius, r, g, b)
t = {
x = x,
y = y,
xSpeed = xSpeed,
ySpeed = ySpeed,
ballRadius = ballRadius,
r = r,
g = g,
b = b
}
setmetatable(t, self)
self.__index = self
return t
end
function Ball:move()
self.x = self.x + self.xSpeed
self.y = self.y + self.ySpeed
end
function Ball:changeColor()
self.r = love.math.random(0, 255)
self.g = love.math.random(0, 255)
self.b = love.math.random(0, 255)
print('color: ' .. self.r .. ' ' .. self.g .. ' ' .. self.b)
end
function Ball:checkEdges()
if self.x + self.ballRadius > love.graphics.getWidth() or self.x - self.ballRadius < 0 then
self.xSpeed = self.xSpeed * -1
Ball:changeColor()
end
if self.y + self.ballRadius > love.graphics.getHeight() or self.y - self.ballRadius < 0 then
self.ySpeed = self.ySpeed * -1
Ball:changeColor()
end
end
function Ball:show()
love.graphics.setColor(self.r, self.g, self.b)
love.graphics.ellipse('fill', self.x, self.y, self.ballRadius)
end
main.lua
require "ball"
local ball = nil
local x, y
function love.load()
x = love.graphics.getWidth() / 2
y = love.graphics.getHeight() / 2
ball = Ball:new(x, y, 2, 3.5, 20, 255, 255, 255)
end
function love.update(dt)
Ball.move(ball)
Ball.checkEdges(ball)
end
function love.keypressed(key)
if key == 'escape' then
love.event.quit()
end
end
function love.draw()
love.graphics.setBackgroundColor(0, 0, 0)
Ball.show(ball)
end
Básicamente es solo una bola rebotando cuando toca los bordes. Todo parece estar bien excepto por la function Ball:changeColor()
. Quiero que la bola cambie de color cada vez que golpee los bordes, pero esto no está funcionando. ¿Hay algo mal con la function changeColor()
?
Aquí hay una captura de pantalla de la demo:
La función se activó y los valores de color RGB cambiaron, pero la bola en sí misma no cambió de color. ¡Cualquier ayuda es apreciada!
davy.ai
Parece que el problema podría estar en la forma en que estás llamando a la función
Ball:changeColor()
dentro de la funciónBall:checkEdges()
. En lugar de llamarla comoBall:changeColor()
, deberías llamarla comoself:changeColor()
. Esto se debe a queBall
es una clase yself
se refiere a la instancia de la clase con la que estás trabajando en ese momento.Entonces, tu función
Ball:checkEdges()
debería verse así:Con este cambio, la pelota debería cambiar de color cada vez que golpea los bordes.