2015-11-09 2 views
0

Я как-то понимаю основы ООП с помощью lua, используя метатеги. но все становится немного волосатым, когда я действительно намереваюсь подклассировать экранный объект. Я не верю, что сам объект отображения можно передать в функцию setmetatable. Я бы очень хотел добавить дополнительные функции к экранному объекту напрямую.Corona SDK, ООП с экранными объектами

, например .. вот мой 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

Тогда да, вы, вероятно, не сможете передать это, чтобы установить метрику. Вы можете использовать __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