不同的 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;
}

现在我的代码可以按预期完美运行,但是如果我要定义 startXstartY 之前检查 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;
}