如何在Lua的Love2d中使用类(面向对象编程)?

我不知道如何在 Lua 中创建类,所以我使用了论坛上推荐的代码。但是只有一个对象能工作。第一个对象有坐标 x、y,另一个对象共享它的坐标。您能解释一下我这段代码哪里出了问题吗?谢谢您的建议。

我的代码:

require("class")

asteroid = class:new()

function asteroid:init(x,y)
    asteroid.b = love.physics.newBody(world, x ,y , "dynamic")
    asteroid.s = love.physics.newCircleShape(35)
    asteroid.f = love.physics.newFixture(asteroid.b, asteroid.s)
end

function love.load()
    world = love.physics.newWorld(0, 50, true)

    asteroid1= asteroid:new(100,100)
    asteroid2= asteroid:new(700,100)
end

function love.update(dt)
    world:update(dt)
end

function love.draw()
    love.graphics.circle("line", asteroid1.b:getX(),asteroid1.b:getY(), asteroid1.s:getRadius(), 35)
    love.graphics.circle("line", asteroid2.b:getX(),asteroid2.b:getY(), asteroid2.s:getRadius(), 35)
end

推荐的代码:

__HAS_SECS_COMPATIBLE_CLASSES__ = true

local class_mt = {}

function class_mt:__index(key)
    return self.__baseclass[key]
end

class = setmetatable({ __baseclass = {} }, class_mt)

function class:new(...)
    local c = {}
    c.__baseclass = self
    setmetatable(c, getmetatable(self))
    if c.init then
        c:init(...)
    end
    return c
end
点赞
用户2114839
用户2114839

下面有一个给你的演示代码:

local MyClass = {}
MyClass.__index = MyClass

setmetatable(MyClass, {
  __call = function (cls, ...)
    return cls.new(...)
  end,
})

function MyClass.new(init)
  local self = setmetatable({}, MyClass)
  self.value = init
  return self
end

-- 这里的 : 语法会在其他参数前面隐式添加一个 "self" 参数
function MyClass:set_value(newval)
  self.value = newval
end

function MyClass:get_value()
  return self.value
end

local instance = MyClass(5)
-- 对 instance 进行操作...

我建议你按照下面的教程进行学习

http://lua-users.org/wiki/ObjectOrientationTutorial

http://lua-users.org/wiki/TutorialDirectory

2013-12-13 10:57:19
用户869951
用户869951

: 语法会引入隐式的 self 作为本地变量,指向对象实例。但是你正在类级别上对 b 进行赋值。使用 self.b = 而不是 asteroid.b =,这样赋值就特定于实例。

2013-12-13 13:48:59