2017-03-06 1 views
1

Ich bin ziemlich neu in C++ und cocos2d-x, also könnte die Antwort etwas sehr einfaches sein, aber für das Leben von mir kann ich nicht herausfinden, warum es wirkt so was.Unterschiedliche CCLayer-Größe, abhängig davon, wo innerhalb des Blocks referenziert wird

Unten finden Sie eine relevante Schnipsel, modifizierte/vereinfachte Version von 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; 
} 

meinen Code Jetzt funktioniert perfekt als gedacht, aber wenn ich startX und startYvor die Linie, die waren definieren prüft, ob die CCLayer hat richtig initialisiert, sie geben (0, 0) anstelle von etwas in der oberen linken Ecke zurück. Meine Vermutung ist, dass vor der Zeile if (!Layer::init()) die PlayGame Schicht nicht initialisiert wurde und daher eine Größe von 0 hat.

Aber für mich ist diese Zeile nur verantwortlich für die Überprüfung, ob der Layer ohne ein Problem initialisiert hat, und die eigentliche Initialisierung wird durch die create()-Methode innerhalb der Definition des übergeordneten CCScene aufgerufen. Also dachte ich, die Größe des Layers hätte irgendwo im Funktionsblock initialisiert werden sollen.

Was fehlt mir hier?

Antwort

0

Die PlayGame::create() Funktion in createScene(), die

so etwas wie dies in Ihrem Fall aussehen würde Ihre PlayGame::init() Funktion
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; 
} 

ist verantwortlich für den Aufruf. Die statische Layer::init(), die die Inhaltsgröße festlegt, muss jedoch explizit aufgerufen werden, bevor Sie Layer-bezogene Elemente in init() festlegen oder abrufen.

Hier ist die Implementierung von Layer::init() direkt aus der Bibliothek extrahiert

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