在HelloWorld项目中向场景添加另一个图层

时间:2012-08-24 20:03:14

标签: cocos2d-iphone cocos2d-x

在cocos2d-x HelloWorld项目中,我正在尝试向场景添加另一个图层,并在数据成员中保留对该图层的引用。由于函数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()是静态的,我无法在此函数中添加图层(因为我无法为图层设置数据成员)。”,错了。 / p>

1 个答案:

答案 0 :(得分:2)

场景为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;

II。将新图层添加到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);

in

HelloWorld::init()

    // add another layer
    HelloWorldHud* layerHud = HelloWorldHud::create();
    CC_BREAK_IF(! layerHud);

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