Corona SDK,使用显示对象的面向对象编程

我对使用 metatable 在 lua 中实现 OOP 的基础知识有些了解。但是,当我真正想要创建一个子类的显示对象时,情况就变得有些棘手了。我不相信我可以将显示对象本身传递给 setmetatable 函数。我真的很想直接向显示对象添加额外的函数。

举个例子,在我的 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 变量。当我使用这个 "class" 时,我总是不得不通过 player.obj 来引用显示对象。我希望它只是 player

有什么方法可以完成这个操作或者更好的解决方案?

我刚刚试着直接使用我的形状对象,并在我的更新后的 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
点赞
用户1015571
用户1015571

下面是所给代码的中文翻译(保留 markdown 格式):

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

这是我迄今为止找到的直接扩展显示对象的最佳方式。

代码中定义了 newsayName 两个变量,sayName 函数可以输出对象的名称。new 函数从 display 对象新建一个矩形对象 player,并将对象的 fill 属性设置为红色,将对象名称设置为 "bob",并绑定函数 sayName。最后整个代码返回一个包含 new 函数的公共对象 public

2015-11-11 19:31:14
用户2653067
用户2653067

尝试创建如下所示的内容:

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
2015-11-18 05:54:52