不同的CCLayer大小取决于块内引用的位置

时间:2017-03-06 21:49:36

标签: c++ cocos2d-x

我对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;
}

现在我的代码完全符合预期,但如果我在之前定义startXstartY ,那么检查CCLayer是否已正确初始化的行,他们在左上角返回(0, 0)而不是一些。我的猜测是,在if ( !Layer::init() )行之前,PlayGame图层尚未初始化,因此其大小为0

但就我而言,该行仅负责检查图层是否已初始化而没有问题,并且实际初始化由父{定义中调用的create()方法触发{ {1}}。所以我认为图层的大小应该在功能块内的任何地方初始化。

我在这里缺少什么?

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;
}