1

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()が間違っていた.

4

1 に答える 1

2

最初のシーンが構築される前であっても getRunningScene() を呼び出すため、シーンは NULL です。

そして、あなたの仮定の1つは間違っています。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 レイヤーに追加するか、シーンに追加するかは、天候によって異なります。

I. シーンに新しいレイヤーを追加します。

コードを削除

    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);
于 2012-08-26T08:04:59.427 に答える