Lua面向对象编程(OOP)的网格类,带有事件。

我正在学习 Lua 并尝试使用面向对象编程的方法。首先,我尝试创建一个网格类,但我认为我仍然缺乏一些知识使它做我想要的事情。

到目前为止,这是我的代码:

local screen = require( 'data.screen')
Grid = {}
Grid_mt = { __index = Grid }

--- 创建一个新的网格对象。
function Grid:new(  params )

    local self = {}

    local function try( self, event )
        print(self.empty)
    end

    for i = 1, screen.tilesAcross do
        if not self[i] then
            self[i] = {};
        end

        for j = 1, screen.tilesDown do

            self[i][j] = display.newImageRect( params.group, "images/playable.png", screen.tileWidth, screen.tileHeight )
            self[i][j].x = (j - 1) * (screen.tileWidth + screen.tileSpacing) + screen.leftSpacing
            self[i][j].y = (i - 1) * (screen.tileHeight + screen.tileSpacing) + screen.topSpacing
            self[i][j]._x = i
            self[i][j]._y = j
            self[i][j].enable = false
            self[i][j].empty = true

            self[i][j].tap = try

            self[i][j]:addEventListener( "tap", self[i][j] )

        end
    end

    setmetatable( self, Grid_mt )

    return self

end

function Grid:setEnable(value, x, y)
    if value ~= true and value ~= false then
        error("Boolean expected")
    end
    self[x][y].enable = value
end

function Grid:getEnable(x, y)
    return self[x][y].enable
end

function Grid:setEmpty(value, x, y)
    if value ~= true and value ~= false then
       error("Boolean expected")
    end
    self[x][y].empty = value
end

function Grid:getEmpty(x, y)
    return self[x][y].empty
end

function Grid:SetmColor()
    self[1][4]:setFillColor( 255,255 )
end

我有两个问题: 我的事件有效,但是我想做类似这样的事情:print(self:getEmpty() ) 但是每当我尝试在我的事件中使用方法时,它就无法工作 "attempt to call method 'getEmpty' (a nil value)"

并且 setfillcolor 不起作用,我希望能够使用它来更改一个单元格的颜色。

感谢您的时间! 如果我走错路了,请让我知道,顺便说一句,我有一个可以工作的代码,没有创建类,这只是为了训练目的:)

谢谢!

点赞
用户1190388
用户1190388

关于第一个问题,需要更多信息。请参见我在上面的评论

至于 setFillColor 不起作用,以下内容摘自Corona文档

object:setFillColor(gray)
object:setFillColor(gray, alpha)
object:setFillColor(red, green, blue)
object:setFillColor(red, green, blue, alpha)
object:setFillColor(gradient)

gray,red,green,blue,alpha(可选)

介于0和1之间的数字,表示该通道的相应值。α表示对象的不透明度。


现在,当您尝试执行:

self [1] [4]:setFillColor(255,255)

您正在传递 grayalpha 通道的值。值必须小于或等于 **1**。可能您要传递 1(因为255通常是最大值)。

2014-06-11 01:31:39
用户869951
用户869951

问题在于 self[i][j] 不是一个 Grid,只有 self 是一个 Grid。因此当事件处理程序被调用时,处理程序中的 self 是显示对象,而不是 Grid 对象。如果处理程序需要知道网格对象,可以将网格分配给每个显示对象:

self[i][j].grid = self

然后在 try 中可以这样做:

grid = self.grid

但在这种情况下,如果将 tap 处理程序不特定于每个显示对象,则可能会获得更清晰的设计。在这种情况下,您可以使用 upvalue,只需使用 self

function Grid:new(params)
  local function try(event)
    print(self.empty)
  end

  for i = 1, screen.tilesAcross do
    ...
    for j = 1, screen.tilesDown do
      ...
      self[i][j]:addEventListener("tap", try)
    end
  end
end

由于给定的监听器是一个函数而不是一个表,它只会得到一个参数,即事件,因此 self 是一个 upvalue,因此它将是刚刚在 try 函数上面创建的 Grid 实例。

2014-06-11 05:23:47