不同的 CCLayer 大小取决于它在块内的引用位置
Different CCLayer size depending on where it is referenced inside the block
我是 C++ 和 cocos2d-x 的新手,所以答案可能非常简单,但我终究无法弄清楚为什么会这样。
下面是一个相关的片段,HelloWorldScene.cpp
的 modified/simplified 版本:
bool PlayGame::init()
{
if ( !Layer::init() ) return false;
double startX = this->getBoundingBox().getMidX() / 3;
double startY = this->getBoundingBox().size.height * 0.95;
Sprite* sprite = Sprite::create( "sprite.png" );
sprite->setPosition( startX, startY );
this->addChild( sprite );
return true;
}
现在我的代码可以按预期完美运行,但是如果我要定义 startX
和 startY
在 之前检查 CCLayer
已正确初始化,它们 return (0, 0)
而不是左上角的 somehwere。我的猜测是,在 if ( !Layer::init() )
行之前,PlayGame
层尚未初始化,因此大小为 0
.
但据我所知,该行只负责检查图层是否初始化没有问题,而真正的初始化是由定义内部调用的 create()
方法触发的parent CCScene
。所以我认为应该在功能块内的任何地方初始化层的大小。
我在这里错过了什么?
createScene()
中的 PlayGame::create()
函数在您的情况下看起来像这样
Scene* PlayGame::createScene()
{
auto scene = Scene::create();
auto layer = PlayGame::create(); // this one right here constructs the Layer and triggers PlayGame::init()
scene->addChild(layer);
return scene;
}
负责调用你的PlayGame::init()
函数。但是,设置内容大小的静态 Layer::init()
必须在您设置或获取 init()
.
中的任何 Layer
相关成员之前显式调用
这里直接从库中提取Layer::init()
实现
bool Layer::init()
{
Director * director = Director::getInstance();
setContentSize(director->getWinSize()); // this is the line that needs to be executed before you set anything
return true;
}
我是 C++ 和 cocos2d-x 的新手,所以答案可能非常简单,但我终究无法弄清楚为什么会这样。
下面是一个相关的片段,HelloWorldScene.cpp
的 modified/simplified 版本:
bool PlayGame::init()
{
if ( !Layer::init() ) return false;
double startX = this->getBoundingBox().getMidX() / 3;
double startY = this->getBoundingBox().size.height * 0.95;
Sprite* sprite = Sprite::create( "sprite.png" );
sprite->setPosition( startX, startY );
this->addChild( sprite );
return true;
}
现在我的代码可以按预期完美运行,但是如果我要定义 startX
和 startY
在 之前检查 CCLayer
已正确初始化,它们 return (0, 0)
而不是左上角的 somehwere。我的猜测是,在 if ( !Layer::init() )
行之前,PlayGame
层尚未初始化,因此大小为 0
.
但据我所知,该行只负责检查图层是否初始化没有问题,而真正的初始化是由定义内部调用的 create()
方法触发的parent CCScene
。所以我认为应该在功能块内的任何地方初始化层的大小。
我在这里错过了什么?
createScene()
中的 PlayGame::create()
函数在您的情况下看起来像这样
Scene* PlayGame::createScene()
{
auto scene = Scene::create();
auto layer = PlayGame::create(); // this one right here constructs the Layer and triggers PlayGame::init()
scene->addChild(layer);
return scene;
}
负责调用你的PlayGame::init()
函数。但是,设置内容大小的静态 Layer::init()
必须在您设置或获取 init()
.
Layer
相关成员之前显式调用
这里直接从库中提取Layer::init()
实现
bool Layer::init()
{
Director * director = Director::getInstance();
setContentSize(director->getWinSize()); // this is the line that needs to be executed before you set anything
return true;
}