2017-03-06 4 views
1

私はC++とcocos2d-xにはかなり新しく、答えは非常にシンプルなものになるかもしれませんが、私の人生ではなぜそれが動作しているのかわかりませんこのような。意図したように今、私のコードは完璧に動作ブロック内で参照される場所によって異なるCCLayerのサイズ

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を定義した場合:

以下

HelloWorldScene.cppの関連スニペット、修正/簡易版ですCCLayerは正しく初期化されており、左上隅にsomehwereの代わりに(0, 0)を返します。私の推測では、if (!Layer::init())の行の前には、PlayGameのレイヤーが初期化されていないため、サイズは0です。

しかし私の心配するところでは、その行は問題なしでレイヤーが初期化されているかどうかをチェックする責任があり、CCSceneの定義内で呼び出されるcreate()メソッドによってトリガされます。だから私は、層のサイズはファンクションブロックのどこにでも初期化されているはずだと思った。

私はここで何が欠けていますか?

答えて

0

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()関数を呼び出すための責任がある、あなたの場合には次のようになりますcreateScene()PlayGame::create()機能、。ただし、コンテンツサイズを設定する固定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; 
} 
関連する問題