与事件的Lua OOP电网类(Lua OOP grid class with event)

2019-10-20 06:47发布

我正在学习LUA和我想要的OOP方法。 首先,我试图让一个网格类的,但我觉得我还是缺乏一定的认识,使之做我想做的事情。

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

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



--- Constructs a new Grid object.
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

我有2个问题:我的作品的事件,但我想这样做:打印(自:getEmpty()),但每当我试图在我的事件用的方法,它不工作“试图调用方法‘getEmpty’ (一个零值)”

并且还setfillcolor wwon't工作,我希望能够改变与它外壳的颜色。

谢谢你的时间! 如果我要去走错路,让我知道了,对了,我有没有做一个一流的工作代码,这只是训练的目的:)

Thnaks!

Answer 1:

问题是, self[i][j]是不是一个Grid ,只有self是一个Grid 。 所以,当事件处理程序被调用时, self的处理程序是显示对象,而不是Grid对象。 如果处理程序需要知道网格对象,你可以指定网格的每个显示对象:

self[i][j].grid = self

那么try你可以做

grid = self.grid

但在这种情况下,如果你有自来水处理程序不具体到每个显示对象你可能会得到一个更清洁的设计。 在这种情况下,你会使用的upvalue,你可以使用self

function Grid:new(  params )

    local self = {}

    local function try( event ) -- omit the first param, self is an upvalue
        print(self.empty)
    end

    for i = 1, screen.tilesAcross do
        ...
        for j = 1, screen.tilesDown do

            self[i][j] = display.newImageRect( ... )
            ...
            self[i][j]:addEventListener( "tap", try )

        end
    end

由于给定的侦听器是函数,而不是一个表,它只有一个参数,事件,自我是个upvalue所以它会略高于创建的网格实例try功能。



Answer 2:

对于第一个问题,就需要更多的信息。 见我的上述评论 。

至于setFillColor不工作,以下是摘自电晕文档 :

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一般为最大值)



文章来源: Lua OOP grid class with event