1

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 はimg内部のテーブルをBaseEntity、そこから作成されたすべてのインスタンスと共有していますか?

4

1 に答える 1

1

テーブルは共有です。共有したくない場合は、テーブルの別のインスタンスを作成する必要があります。インスタンス変数としてではなく、クラス変数として定義している 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 インスタンスに書き込んでいることを示しています。ここで、p1 と p2 のテーブルのコメントを外すobj.imgnew()、同じではなくなります。各インスタンスには独自のものがあります。行のコメント__newindexを外すと、BaseEntity「クラス」に割り当てていることがわかります

于 2014-06-06T03:08:24.087 に答える