Lua/Corona中的类结构

我正在Lua中编写一个游戏, 并尝试使用元表和类, 但我认为我正在借鉴我的PHP知识, 并稍微侧重于一些事情。

-- 基本怪物
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

基本上, 我希望能够生成几种不同类型的怪物, 并为它们保留一些基类功能, 但我不确定在上面的示例中如何将基类和我制作的Groblin类绑定, 因为我感觉我正在从Groblin:new中彻底排除该子类。

点赞
用户185316
用户185316

如果你想要可继承的类,请尝试使用middleclass。在标准的 lua 中实现子类不是很简单,而 middleclass 解决了这些繁琐的代码。同时,请充分利用 local,无论何时都应该使用它。

2013-09-04 19:56:49
用户2749027
用户2749027

使用与你的示例相同的简单方法如下:

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()" 方法构造对象,然后添加子类的独特字段。这确保基类正确地构造。在子类构造函数中重新设置元表为 "Groblin" 确保任何定义为 Groblin 子类的方法将被调用(如果可用),在 Groblin 表未重新定义方法的情况下,将调用超类方法。

最好使用提供对象创建和子类化一致方法的库,但希望这能为您提供有关如何手动完成此操作的更好的想法。

2013-09-05 02:54:45
用户1548504
用户1548504

http://www.lua.org/pil/16.2.html中了解继承。 在Account:new中,当SpecialAccount扩展Account时,请留意如何最好地使用self的解释。

我通常比上面链接中提到的方法采用稍微不同的方法。在上述方法中-

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

您调用了Account:new()两次,当Acoount:new()对构造函数参数进行某些验证并引发异常时,会出现更多问题。例如:确保限制传递的非nil。

所以我遵循这个

SpecialAccount = setmetatable({__index = Account})

可以在子类中使用超类构造函数。

PS:我更喜欢将新功能视为构造函数。它本质上完成相同的工作。

2013-09-05 06:12:44