2015-11-09 75 views
0

我有點了解OOA的基本知識,使用lua使用metatables。但是當我真的打算爲顯示對象創建子類時,事情會變得有點多毛。我不相信我可以將顯示對象本身傳遞給setmetatable函數。我真的很想直接向顯示對象添加額外的功能。Corona SDK,帶顯示對象的OOP

例如..這裏是我的player.lua文件

local player = {} 
local player_mt = { __index = player } -- metatable 

function player.new(world) -- constructor 

    local obj = display.newRect(world, 0, 0, 20, 20) 
    obj:setFillColor(1,0,0) 

    local tbl = { obj = obj } 
    return setmetatable(tbl, player_mt) 
end 

function player:fillColor(r,g,b) 
    self.obj:setFillColor(r,g,b) 
end 

function player:setPos(x,y) 
    self.obj.x, self.obj.y = x,y 
end 

return player 

這工作了好..但我真的很喜歡self提及我obj變量。當我使用這個「課程」時,我總是必須通過說player.obj來引用顯示對象。我寧願它只是player

任何方式來完成這個或更好的方法?

只是嘗試直接使用我的形狀對象,並在我更新的播放器對象上調用fillColor。說它不能叫fillColor上零

local player = {} 
local player_mt = { __index = player } -- metatable 

function player.new(world) -- constructor 

    local obj = display.newRect(world, 0, 0, 20, 20) 
    obj:setFillColor(1,0,0) 

    return setmetatable(obj, player_mt) 
end 

function player:fillColor(r,g,b) 
    self:setFillColor(r,g,b) 
end 

return player 
+0

是'OBJ 「一張桌子?用戶數據?還有別的嗎?如果這就是你想要的,你可以將每個不匹配的查找從'tbl'轉換爲'obj'。 –

+0

obj是一個顯示對象。 https://docs.coronalabs.com/api/type/ShapeObject/index.html – hamobi

+0

那麼是的,你可能無法通過setmetatable。您可以使用__index(或__index鏈)來允許'ply:setFillColor(...)'工作,雖然可以確保將正確的對象傳遞給正確的函數,但這樣的鏈可能很複雜。 –

回答

0

這是最好的途徑香港專業教育學院迄今發現擴展顯示對象的直接

local new 
local sayName 

sayName = function(self) 
    print(self.name) 
end 

new = function(world) 
    local player = display.newRect(world, 0, 0, 20, 20) 
    player:setFillColor(1,0,0) 
    player.name = 'bob' 

    player.sayName = sayName 
    return player 
end 

local public = {} 
public.new = new 
return public 
0

嘗試製作這樣的,

local player= {} 

function player.new(params) 

    local self = {} 
    setmetatable(self, {__index = player}) 

    local obj = display.newRect(world, 0, 0, 20, 20) 
    obj:setFillColor(1,0,0) 

    self._obj = obj 
    return self 
end 


function player:fillColor(r,g,b) 
    self._obj:setFillColor(r,g,b) 
end 

return player 
相關問題