簡體   English   中英

Lua OOP網格類與事件

[英]Lua OOP grid class with event

我正在學習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個問題:我的事件有效,但是我想做類似的事情:print(self:getEmpty()),但是每當我嘗試在事件中使用方法時,它都不會起作用“試圖調用方法'getEmpty' (零值)”

並且setfillcolor無法正常工作,我希望能夠使用它來更改案例的顏色。

謝謝你的時間! 如果我走錯了路,請告訴我,順便說一句,我有一個沒有上課的工作代碼,這只是出於培訓目的:)

Thnaks!

對於第一個問題,將需要更多信息。 上面我的評論

至於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通常是最大值)

問題是self[i][j]不是Grid ,只有selfGrid 因此,在調用事件處理程序時,處理程序中的self是顯示對象,而不是Grid對象。 如果處理程序需要了解網格對象,則可以將網格分配給每個顯示對象:

self[i][j].grid = self

然后try

grid = self.grid

但是在這種情況下,如果您沒有特定於每個顯示對象的點擊處理程序,則可以得到更簡潔的設計。 在這種情況下,您將使用升值,您可以僅使用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實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM