В проекте 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.) Удален слой HUD из функции init():
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()
является статической, я не могу добавить слой в эту функцию (поскольку я не могу установить элемент данных для слоя)» было неверным.