【问题标题】:Adding another layer to the scene in the HelloWorld project在 HelloWorld 项目的场景中添加另一个图层
【发布时间】:2012-08-27 18:42:51
【问题描述】:

在 cocos2d-x HelloWorld 项目中,我试图在 scene 中添加另一层,并在数据成员中保留对该层的引用。由于函数HelloWorld::scene()是静态的,所以我不能在这个函数中添加层(因为我不能为层设置数据成员)。

所以我尝试如下在init() 函数中获取场景,但这会导致scene = 0x00000000

我做错了什么?

bool HelloWorld::init()
{
    bool bRet = false;
    do 
    {
        CC_BREAK_IF(! CCLayer::init());

        CCScene* scene = NULL;
        scene = CCDirector::sharedDirector()->getRunningScene();

        // add another layer
        HelloWorldHud* layerHud = HelloWorldHud::create();
        CC_BREAK_IF(! layerHud);
        // set data member
        this->layerHud = layerHud;

        // next line crashes (because scene  is 0x00000000)
        scene->addChild(layerHud);

    bRet = true;
    } while (0);
    return bRet;
}

PS:我想将 hud 图层添加到场景而不是当前图层的原因是因为我正在移动当前图层并且不希望 hud 图层随之移动。


编辑:由于接受的答案允许多个选项,这是我为解决问题所做的:

1.) 从 init() 函数中移除 HUD 层:

bool HelloWorld::init()
{
    bool bRet = false;
    do 
    {
        CC_BREAK_IF(! CCLayer::init());

    bRet = true;
    } while (0);
    return bRet;
}

2.) 而是将 HUD 层添加到场景功能中(这也是它在 cocos2d-iphone 中完成的方式):

CCScene* HelloWorld::scene()
{
    CCScene * scene = NULL;
    do 
    {
        // scene
        scene = CCScene::create();
        CC_BREAK_IF(! scene);

        // HelloWorld layer
        HelloWorld *layer = HelloWorld::create();
        CC_BREAK_IF(! layer);
        scene->addChild(layer);

        // HUD layer
        HelloWorldHud* layerHud = HelloWorldHud::create();
        CC_BREAK_IF(! layerHud);
        scene->addChild(layerHud);

        // set data member
        layer->layerHud = layerHud;

    } while (0);

    // return the scene
    return scene;
}

问题本质上是我的假设,“由于函数HelloWorld::scene() 是静态的,我不能在这个函数中添加层(因为我不能为层设置数据成员)。”,是错误的。

【问题讨论】:

    标签: cocos2d-iphone cocos2d-x


    【解决方案1】:

    场景为 NULL,因为您甚至在构造第一个场景之前就调用了 getRunningScene()。

    你的一个假设是错误的。 HelloWorld::scene() 是静态的,但你仍然可以在这个函数中添加图层(并且你可以为图层设置数据成员)

    正确的做法是新建一个公共函数

    setLeyerHud(HelloWorldHud* hud);
    

    在 HelloWorld 类和 CCScene* HelloWorld::scene() 函数中,添加以下行:

    CCScene * scene = NULL;
    do 
    {
        // 'scene' is an autorelease object
        scene = CCScene::create();
        CC_BREAK_IF(! scene);
    
        // 'layer' is an autorelease object
        HelloWorld *layer = HelloWorld::create();
        CC_BREAK_IF(! layer);
    
        HelloWorldHud* layerHud = HelloWorldHud::create();
        CC_BREAK_IF(! layerHud);
    
        scene->addChild(layer);
    
        scene->addChild(layerHud);
    
        layer->setLayerHud(layerHud);
    
    } while (0);
    

    这取决于您想将 Hud 添加到 HelloWorld 层或您想添加到场景中的天气。

    我。向场景添加新图层:

    删除代码

        CCScene* scene = NULL;
        scene = CCDirector::sharedDirector()->getRunningScene();
    
        // add another layer
        HelloWorldHud* layerHud = HelloWorldHud::create();
        CC_BREAK_IF(! layerHud);
        // set data member
        this->layerHud = layerHud;
    
        // next line crashes (because scene  is 0x00000000)
        scene->addChild(layerHud);
    

    来自

    HelloWorld::init()
    

    并更改代码

    CCScene* HelloWorld::scene()
    

    CCScene * scene = NULL;
    do 
    {
        // 'scene' is an autorelease object
        scene = CCScene::create();
        CC_BREAK_IF(! scene);
    
        // 'layer' is an autorelease object
        HelloWorld *layer = HelloWorld::create();
        CC_BREAK_IF(! layer);
    
        HelloWorldHud* layerHud = HelloWorldHud::create();
        CC_BREAK_IF(! layerHud);
    
        scene->addChild(layer);
    
        scene->addChild(layerHud);
    } while (0);
    
    // return the scene
    return scene;
    

    二。向 HelloWorld 层添加新层:

    修改代码

        CCScene* scene = NULL;
        scene = CCDirector::sharedDirector()->getRunningScene();
    
        // add another layer
        HelloWorldHud* layerHud = HelloWorldHud::create();
        CC_BREAK_IF(! layerHud);
        // set data member
        this->layerHud = layerHud;
    
        // next line crashes (because scene  is 0x00000000)
        scene->addChild(layerHud);
    

    HelloWorld::init()
    

        // add another layer
        HelloWorldHud* layerHud = HelloWorldHud::create();
        CC_BREAK_IF(! layerHud);
    
        // next line crashes (because scene  is 0x00000000)
        this->addChild(layerHud);
    

    【讨论】:

    • 场景在 AppDelegate 中构建,然后由导演运行。 HelloWorld::init() 在 HelloWorld::scene() 中被调用。你能解释一下我该如何解决这个问题吗?
    • @Ben:我已经编辑了我的答案,你可以试试。
    • 谢谢,这真的很有帮助。你是对的,我的假设是错误的。我不能在scene() 中使用this->layerHUD,但我仍然可以使用layer->layerHUD。谢谢! :)
    猜你喜欢
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    相关资源
    最近更新 更多