Lua能否共用表格中的表格?

我用 Love2d 引擎和 Lua 开发了一个游戏,并使用以下代码结构。

创建 BaseEntity 对象,包含以下属性:x、y、w、h 和 img。

实现 BaseEntity:new 函数,使用 setmetatable 函数生成基于 BaseEntity 的新对象。

实现 BaseEntity:setPos 函数,设置对象的 x 和 y 属性。

实现 BaseEntity:setImage 函数,设置对象 img 中的特定索引值上的图片。

创建 PlayerType 和 PlayerState 表示玩家类型和状态。

创建 Player 表示一名玩家对象,并继承 BaseEntity 对象属性和方法。

修改 Player:new 函数,使用 BaseEntity:new 函数生成基于 BaseEntity 的新对象,并设置对象的类型和状态。

重载 Player:setImage 函数,设置对象 img 表的 "sprite" 索引值上的图片。

在创建多个 Player 对象并使用 setImage 函数为每个对象分配不同的图片时,所有对象都共享我分配给最后一个对象的相同图片。但是,当我使用 setPos 方法为每个对象设置不同的位置时,它们以正确的不同位置绘制。为什么会这样?Lua 是否与从 BaseEntity 创建的所有实例共享其内部的 img 表?

点赞
用户869951
用户869951

表格是共享的。如果您不想共享,请创建表格的单独实例。请注意,您将x,y ... img定义为类变量而不是实例变量。要查看此,请尝试以下代码:

BaseEntity = {
        x = 0,
        img = {},
     }

function BaseEntity:new(obj)
    obj = obj or {}
    assert(self == BaseEntity)
    setmetatable(obj, self)
    -- obj.img = {}
    self.__index = self
    -- self.__newindex = self
    return obj
end

p1 = BaseEntity:new {y = 1}
p2 = BaseEntity:new {y = 2}

print('p1:', p1.x, p1.y, p1.img)
print('p2:', p2.x, p2.y, p2.img)
print('base:', BaseEntity.x)
p1.x = 3
print('p1:', p1.x, p1.y, p1.img)
print('p2:', p2.x, p2.y, p2.img)
print('base:', BaseEntity.x)

这会产生以下输出:

p1: 0   1   table: 0x1736430
p2: 0   2   table: 0x1736430
base:   0
p1: 3   1   table: 0x1736430
p2: 0   2   table: 0x1736430
base:   0

显示表格是共享的,当您写入x时,您正在写入p1实例而不是类。现在,如果您取消“new()”中的“obj.img”注释,则p1和p2的表格将不再相同:每个实例都将拥有自己的表格。如果您取消“__newindex”行的注释,您将看到您正在分配给BaseEntity“类”。

2014-06-06 03:08:24