es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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:

1

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!

Tags:  , ,

Answer

  1. Avatar for 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ón Ball:checkEdges(). En lugar de llamarla como Ball:changeColor(), deberías llamarla como self:changeColor(). Esto se debe a que Ball es una clase y self 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í:

    function Ball:checkEdges() 
        if self.x + self.ballRadius > love.graphics.getWidth() or self.x - self.ballRadius < 0 then 
            self.xSpeed = self.xSpeed * -1
            self:changeColor()
        end
        if self.y + self.ballRadius > love.graphics.getHeight() or self.y - self.ballRadius < 0 then 
            self.ySpeed = self.ySpeed * -1
            self:changeColor()
        end
    end
    

    Con este cambio, la pelota debería cambiar de color cada vez que golpea los bordes.

Comments are closed.