2014-06-05 20 views
1

我開始用Love2d引擎和Lua開發遊戲,並且我有以下代碼結構。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 

當我創建了幾個球員的對象,並指定使用setImage()功能,每個對象不同的圖像,他們都有着我分配到的最後一個對象相同的圖像。但是當我使用setPos()方法爲每個對象設置不同的位置時,它們被繪製在正確的獨特位置上。爲什麼會發生這種情況? Lua是否與BaseEntity共享img表中的所有實例?

+0

不要在'BaseEntity'內包含'img = {}'。在'return obj'之前在構造函數'BaseEntity:new(obj)'中創建'img':'obj.img = {}' –

+0

這條線應該被提升出函數:'self .__ index = self' – Deduplicator

+0

Better重新考慮你的繼承框架。它被竊聽。 – Deduplicator

回答

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實例不班上。如果現在取消obj.imgnew()的註釋,p1和p2的表將不再相同:每個實例都有自己的表。如果您取消對__newindex行的註釋,您將看到您正在分配給BaseEntity「class」

+0

謝謝你的好答案。我是Lua的新手,所以在邊緣還是有點粗糙:) – kasper360