【发布时间】:2014-07-26 22:11:52
【问题描述】:
我开始使用 Love2d 引擎和 Lua 开发游戏,我有以下代码结构。
BaseEntity = {
x = 0,
y = 0,
w = 0,
h = 0,
img = {},
}
function BaseEntity:new(obj)
obj = obj or {}
setmetatable(obj, self)
self.__index = self
return obj
end
function BaseEntity:setPos(x, y)
self.x = x
self.y = y
end
function BaseEntity:setImage( index, image )
self.img[index] = image
end
PlayerType = {["NORMAL"] = 0, ["AI"] = 1}
PlayerState = {["SELECTED"] = 0, ["NOT_SELECTED"] = 1}
Player = {
type = PlayerType.NORMAL,
state = PlayerState.NOT_SELECTED
}
Player = BaseEntity:new(Player)
function Player:new( obj )
obj = obj or BaseEntity:new()
setmetatable(obj, self)
self.__index = self
return obj
end
function Player:setImage( image )
self.img["sprite"] = image
end
当我创建几个 Player 对象并使用 setImage() 函数为每个对象分配不同的图像时,它们都共享我分配给最后一个对象的相同图像。但是当我使用setPos() 方法为每个对象设置不同的位置时,它们被绘制在正确的独特位置。为什么会这样? Lua 是否与在 BaseEntity 中创建的所有实例共享表 img?
【问题讨论】:
-
不要在
BaseEntity中包含img = {}。在构造函数BaseEntity:new(obj)中创建img,而不是:obj.img = {}就在return obj之前 -
这条线应该被吊出函数:
self.__index = self -
更好地重新考虑您的继承框架。它被窃听了。