从C++中的CCScene打开Lua中的CCScene在cocos2d-x中

我正在尝试将Lua脚本和Cocos2d-x一起使用,但在使它们正常工作方面遇到了一些麻烦。

第一部分: 我有两个CCScene类,HomeSceneGameSceneHomeSceneC ++编写,GameSceneLua脚本编写。现在我想做的是在这两个场景之间创建一个“链接”。在HomeScene的生命周期的某个时刻,它将创建GameScene,并且GameScene将替换HomeScene(类似于CCDirector ::replaceScene)。然后,在GameScene的生命周期中,它返回到HomeScene

第二部分: 除此之外,HomeScene需要将一些信息,比如time(时间),传递给GameScene。然后,GameScene将使用此time值进行进一步处理。当GameScene返回到HomeScene时,它会将另一些数据(比如score)传递回HomeScene

那么,问题是,使用cocos2d-x中的Lua绑定是否可以实现这两部分?如果可以,我该如何去实现呢?

我尝试过的: 我创建了一个小的Lua脚本文件来测试我是否想的可以工作。

local function main()
    local visibleSize = CCDirector:sharedDirector():getVisibleSize()
    local origin = CCDirector:sharedDirector():getVisibleOrigin()

    local function createLayer()
        local function doGoBack()
            CCDirector:sharedDirector():popScene()
        end

        local layer = CCLayer:create()

        local btn = CCMenuItemImage:create( "btn0.jpg", "btn1.jpg" )
        btn:setPosition( ccp( visibleSize.width * 0.50, visibleSize.height * 0.50 ) )
        btn:registerScriptTapHandler( doGoBack )

        local menu = CCMenu:createWithItem( btn )
        menu:setPosition( ccp( 0, 0 ) )
        layer:addChild( menu, 1 )

        cclog( "createdLayer" )

        return layer
    end

    -- run
    local sceneGame = CCScene:create()
    sceneGame:addChild( createLayer() )
    CCDirector:sharedDirector():pushScene( sceneGame )
end

然后,我创建了一个将调用此脚本的CCScene

void TestScene::runLuaScript() {
    std::string luaPath = CCFileUtils::sharedFileUtils() -> fullPathForFilename( "test.lua" );
    CCString * luaCode = CCString::createWithContentsOfFile( luaPath.c_str() );
    CCLuaEngine::defaultEngine() -> executeString( luaCode -> getCString() );
}

当我尝试运行它时,Lua脚本被正确执行(cclog输出被正确打印),但Lua场景中的对象不可见,只显示黑屏(因为测试场景为空场景)。

我觉得我的想法是可能实现的,只是我实现它的方式有误。非常感谢您的任何帮助。谢谢。

点赞
用户932643
用户932643

以上代码出现的问题是逻辑错误。

在执行 C++ 的 CCScene 之前,Lua 脚本编写的 CCScene 被添加了。在 CCLayerinit() 方法中移除 TestScene::runLuaScript() 并在 init() 方法外调用该方法,问题得到解决。之后,Lua 脚本编写的 CCScene 被正确执行。

2013-06-05 01:38:42