【问题标题】:How to implement this pattern in Lua with Cocos2d-x如何使用 Cocos2d-x 在 Lua 中实现这种模式
【发布时间】:2014-08-27 08:26:28
【问题描述】:

我想在Square 中调用GameScene setSpecificSquare 函数,会出现'attempt to index field 'squares' 错误。

据我了解,onTouchEnded(touch event)中的require("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)
              --occur error here
              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] = {}    -- create a new row
        for j=0, 5 do
            self.squares[i][j] = nil
        end
    end
    --add layer
    self.bombLayer = cc.Layer:create()
    self:addChild(self.bombLayer)

    --add squares
    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()
--can not access self.square here, occur attempt to index field 'squares' error
self.square[0][0].isHighLight
end

return GameScene

【问题讨论】:

    标签: lua cocos2d-x


    【解决方案1】:

    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 = {}
    
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-21
      • 2013-04-18
      • 2018-06-19
      • 1970-01-01
      相关资源
      最近更新 更多