如何在Cocos2d-x中使用Lua实现这种模式

我想在Square中调用GameScene中的setSpecificSquare函数,但却出现了“尝试索引字段 'squares'”错误。

在我看来,onTouchEnded(touch event)中的require("GameScene")并没有获得GameScene的最后一个变量,也就是说GameScene还没有被构造,所以它没有squares属性。

如何在Square中调用GameScene静态函数 setSpecificSquare?或者换句话说,如何获得最后的GameScene,这样我就能设置self.squares表了呢?

非常感谢提前提供的帮助!

Square.lua

require "Cocos2d"
require "Cocos2dConstants"

local Square = class("Square",function()
    return cc.Node:create()
end)

function Square.create()
    local square = Square.new()
    return square
end

function Square:ctor()
    self.bg = cc.Sprite:create("square_bg.png")
    self:addChild(self.bg)
    self.isHighlight = true
    local function onTouchEnded(touch,event)
        --这里发生了错误
        require("GameScene"):setSpecificSquare()
    end
end

return Square

GameScene.lua

require "Cocos2d"
require "Cocos2dConstants"

local GameScene = class("GameScene",function()
    return cc.Scene:create()
end)

function GameScene.create()
    local scene = GameScene.new()
    return scene
end

function GameScene:ctor()
    self.visibleSize = cc.Director:getInstance():getVisibleSize()
    self.x = cc.Director:getInstance():getVisibleOrigin().x
    self.y = cc.Director:getInstance():getVisibleOrigin().y

    self.squares = {}
    for i=0,5 do
        self.squares[i] = {}    -- 创建新行
        for j=0,5 do
            self.squares[i][j] = nil
        end
    end
    --添加图层
    self.bombLayer = cc.Layer:create()
    self:addChild(self.bombLayer)

    --添加方块
    self:addSquares()
end

function GameScene:addSquares()
    for i=0,5 do
        for j=0,5 do
            local square = require("src/Square"):create()
            square:setPosition(0+j*70,0+i*70)

            self.bombLayer:addChild(square)

            self.squares[i][j] = square

        end
    end
end

function GameScene:setSpecificSquare()
    --无法在此处访问self.squares,会出现尝试索引字段“squares”错误
    self.square[0][0].isHighLight
end

return GameScene
点赞
用户2248354
用户2248354

self.squares = {}移出ctor函数,或在调用addSquares之前调用ctor函数,或者您可以在addSquares函数内部直接调用此函数。

推荐的方式是将其移出函数,并在创建GameScene对象时创建它:

require "Cocos2d"
require "Cocos2dConstants"

local GameScene = class("GameScene",function()
    return cc.Scene:create()
end)

function GameScene.create()
    local scene = GameScene.new()
    return scene
end

GameScene.squares = {}

...
2014-08-27 15:04:06