2

lua でクラスを作成する方法がわからないので、フォーラムで推奨されているコードを使用しました。ただし、常に 1 つのオブジェクトのみが機能します。最初のオブジェクトは座標 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
4

2 に答える 2

2

ここにあなたのためのデモコードがあります

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

-- the : syntax here causes a "self" arg to be implicitly added before any other args
function MyClass:set_value(newval)
  self.value = newval
end

function MyClass:get_value()
  return self.value
end

local instance = MyClass(5)
-- do stuff with instance...

これらのチュートリアルに従うことをお勧めします

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

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

于 2013-12-13T10:57:19.530 に答える
0

この構文により、オブジェクト インスタンスを参照して、:暗黙的なものをローカルとして使用できるようになります。selfしかし、クラスレベルで b に割り当てています。self.b =代わりに使用asteroid.b =して、割り当てがインスタンスに固有であるようにします。

于 2013-12-13T13:48:59.213 に答える