我对C ++和cocos2d-x很陌生,所以答案可能很简单,但对于我的生活,我无法弄清楚为什么它会像这样。
以下是HelloWorldScene.cpp
的相关摘录,修改/简化版本:
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
是否已正确初始化的行,他们在左上角返回(0, 0)
而不是一些。我的猜测是,在if ( !Layer::init() )
行之前,PlayGame
图层尚未初始化,因此其大小为0
。
但就我而言,该行仅负责检查图层是否已初始化而没有问题,并且实际初始化由父{定义中调用的create()
方法触发{ {1}}。所以我认为图层的大小应该在功能块内的任何地方初始化。
我在这里缺少什么?
答案 0 :(得分:0)
PlayGame::create()
中的createScene()
函数,在您的情况下看起来像这样
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()
中设置或获取任何与Layer
相关的成员之前,必须明确调用设置内容大小的静态init()
。
以下是直接从库中提取的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;
}