Reputation: 16659
In the cocos2d-x HelloWorld project, I am trying to add another layer to the scene and keep a reference to this layer in a data member. Since the function HelloWorld::scene()
is static, I cannot add the layer within this function (because I cannot set the data member for the layer).
So I tried getting the scene in the init()
function as follows, however this leads to scene = 0x00000000
.
What am I doing wrong?
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: The reason that I want to add the hud layer to the scene, rather than to the current layer, is because I am moving the current layer around and do not want the hud layer to be moved with it.
Edit: Since the accepted answer allowed for multiple options, here's what I did to fix the problem:
1.) Removed the HUD layer from the init() function:
bool HelloWorld::init()
{
bool bRet = false;
do
{
CC_BREAK_IF(! CCLayer::init());
bRet = true;
} while (0);
return bRet;
}
2.) And instead added the HUD layer to the scene function (which also is the way its done in 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;
}
Essentially the problem was that my assumption, "Since the function HelloWorld::scene()
is static, I cannot add the layer within this function (because I cannot set the data member for the layer).", was wrong.
Upvotes: 1
Views: 4862
Reputation: 3182
The scene is NULL because you call getRunningScene() even before the first scene is constructed.
And one of your assumption is wrong. HelloWorld::scene() is static, but you still can add the layer within this function (and you can set the data member for the layer)
the correct way is to create a new public function
setLeyerHud(HelloWorldHud* hud);
in HelloWorld Class and in the CCScene* HelloWorld::scene() function, add the following lines:
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);
it depends on weather you want to add the Hud into the HelloWorld Layer or you want to add to the scene.
I. add new layer to the scene:
remove code
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);
from
HelloWorld::init()
and change code in
CCScene* HelloWorld::scene()
to
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. add new layer to the HelloWorld Layer:
change the code
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()
to
// add another layer
HelloWorldHud* layerHud = HelloWorldHud::create();
CC_BREAK_IF(! layerHud);
// next line crashes (because scene is 0x00000000)
this->addChild(layerHud);
Upvotes: 2