Lua / Corona的类结构

时间:2013-09-04 19:38:15

标签: oop lua corona metatable

所以我正在Lua做一个游戏,我正在尝试使用元数据和分类,但我认为我正在导入我的PHP知识并稍微做一些事情。

-- Basic Monster
Monster = {}

function Monster:new(newX, newY)
    local newMonster = {x = newX, y = newY}
    setmetatable(newMonster, {__index = Monster})
    return newMonster
end

function Monster:moveTo(newX, newY)
    self.x = newX
    self.y = newY
end

function Monster:takeDamage()
    self.hitPoints = self.hitPoints - playerWeapon.damage
    if self.hitPoints <= 0 then
        self.die()
    end
end

function Monster:tap()
    self.takeDamage()
end

function Monster:die()
    self.removeSelf()
end

--Groblin
Groblin = {}
setmetatable(Groblin, {__index = Monster})

function Groblin:new(newX, newY)
    local groblin = display.newImage('assets/images/goblin.png');
    groblin.hitPoints = 4
    physics.addBody(groblin, 'static')
    gameGroup.insert(groblin)
    return groblin
end

我基本上希望能够生成几种不同类型的怪物,并为它们保留一些基类功能,但我在上面的例子中不确定如何将基类绑定到{{1}我创造的课程,因为我觉得我完全按照我在Groblin内所做的那样吹灭了这个子类。

3 个答案:

答案 0 :(得分:0)

如果您想要可以继承的类,请尝试使用middleclass。在标准lua中做子类并不是很容易,而middleclass已经处理了样板。

此外,请使用local - 在可以使用的任何地方使用它。

答案 1 :(得分:0)

使用您的示例执行此操作的简单方法是:

function Groblin:new(newX, newY)
  local groblin = Monster:new( newX, newY )
  setmetatable(groblin, {__index = Groblin})
  groblin.image = display.newImage('assets/images/goblin.png');
  -- ...
  return groblin
end

使用基类“:new()”方法构造对象,然后为子类添加唯一字段。这确保了基类的正确构造。在子类构造函数中将metatable重新设置为“Groblin”可确保在可用时调用为Groblin子类定义的任何方法,并且Groblin表不会重新定义将调用超类方法的方法。

最好使用一个为对象创建和子类化提供一致方法的库,但希望这可以让您更好地了解如何手动执行操作。

答案 2 :(得分:0)

查看http://www.lua.org/pil/16.2.html继承。 关注如何在账户中使用自我的解释:关注特别是在特殊账户扩展账户时,新的工作效果最佳。

我通常采用与上述链接中提到的方法略有不同的方法。在上面的方法 -

SpecialAccount = Account:new()
s = SpecialAccount:new{limit=1000.00}

您正在调用Account:new()两次,当Acoount:new()对构造函数参数执行某些验证并抛出异常时会出现更多问题。例如:确保限制以非零传递。

所以我按照这个

SpecialAccount = setmetatable({__index = Account})

是否允许在子类中使用超类构造函数。

PS:我更喜欢将新函数视为构造函数。它基本上做同样的工作。