带有事件的Lua OOP网格类



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

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

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

我有两个问题:我的事件工作,但我想做这样的事情:打印(self:getEmpty())但是每当我尝试在我的事件中使用方法时,它不工作"尝试调用方法'getEmpty' (nil值)"

和setfillcolor也不起作用,我想用它来改变大小写

谢谢你的时间!如果我走错了路,让我知道,顺便说一句,我有一个工作代码没有做类,这只是为了培训的目的:)

Thnaks !

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

self[i][j].grid = self

那么在try中你可以写

grid = self.grid

但是在这种情况下,如果您让tap处理程序不特定于每个显示对象,您可能会得到一个更干净的设计。在这种情况下,您将使用一个上值,您可以使用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

由于给定的监听器是一个函数而不是一个表,因此它只获得一个参数,即事件,并且self是一个上值,因此它将是在try函数上方创建的Grid实例。

对于第一个问题,需要更多的信息。请看我上面的评论。

至于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之间的数字表示对应的这个渠道的价值。Alpha表示对象的不透明度。


现在,当你试图执行:

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

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

最新更新