所以我正在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
内所做的那样吹灭了这个子类。
答案 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:我更喜欢将新函数视为构造函数。它基本上做同样的工作。