上図のテストプログラム画面で、「Node: Scene」を選ぶと、下図のシーンテスト画面になる。
シーンテスト画面では、画面上のシーン切り替えボタンを押すと、シーンが切り替わる。
シーン切り替えは、単純にシーンを変更するものと、上部からスライドしてくるもの、回転により切り変わるイフェクト付きのものがある。
上図は回転により切り替えている途中のスクショだ。
class SceneTestLayer1 : public Layer { public: SceneTestLayer1(); ~SceneTestLayer1(); virtual void onEnter() override; virtual void onEnterTransitionDidFinish() override; void testDealloc(float dt); void onPushScene(Ref* sender); void onPushSceneTran(Ref* sender); void onQuit(Ref* sender); //CREATE_NODE(SceneTestLayer1); } ; class SceneTestLayer2 : public Layer { float _timeCounter; public: SceneTestLayer2(); void testDealloc(float dt); void onGoBack(Ref* sender); void onReplaceScene(Ref* sender); void onReplaceSceneTran(Ref* sender); //CREATE_NODE(SceneTestLayer2); } ; class SceneTestLayer3 : public LayerColor { public: SceneTestLayer3(); bool init(); virtual void testDealloc(float dt); void item0Clicked(Ref* sender); void item1Clicked(Ref* sender); void item2Clicked(Ref* sender); void item3Clicked(Ref* sender); CREATE_FUNC(SceneTestLayer3) } ; class SceneTestScene : public TestScene { public: virtual void runThisTest(); };
"SceneTestLayer1.h" では、SceneTestLayer1, SceneTestLayer2, SceneTestLayer3 の3つのクラスと、SceneTestScene の合計4つのクラスが宣言されている。
SceneTestLayer1~3 クラスは Layer の派生クラスで、シーンテストクラスの本体クラスで、ボタンにより表示が切り替わるレイヤーだ。
SceneTestScene クラスは、シーンテストクラスをセットアップするためのものだ。 メニューで「Node: Scene」が選択されると、TestController::menuCallback() から呼び出される runThisTest() 仮想関数を宣言している。
SceneTestLayer1::SceneTestLayer1() { auto item1 = MenuItemFont::create( "Test pushScene", CC_CALLBACK_1(SceneTestLayer1::onPushScene, this)); auto item2 = MenuItemFont::create( "Test pushScene w/transition", CC_CALLBACK_1(SceneTestLayer1::onPushSceneTran, this)); auto item3 = MenuItemFont::create( "Quit", CC_CALLBACK_1(SceneTestLayer1::onQuit, this)); auto menu = Menu::create( item1, item2, item3, NULL ); menu->alignItemsVertically(); addChild( menu ); auto s = Director::getInstance()->getWinSize(); auto sprite = Sprite::create(s_pathGrossini); addChild(sprite); sprite->setPosition( Vec2(s.width-40, s.height/2) ); auto rotate = RotateBy::create(2, 360); auto repeat = RepeatForever::create(rotate); sprite->runAction(repeat); schedule( schedule_selector(SceneTestLayer1::testDealloc) ); }
まずは SceneTestLayer1 クラスのコンストラクタ。
MenuItemFont::create() で、メニューアイテムを3つ生成し、それらを使って Menu::create() でメニューを生成し、addMenu() でレイヤーに追加している。
menu->alignItemsVertically(); はメニューを縦に並べるとうい指定。
Menu::create() は、可変引数っぽいのに、何故最後に NULL を指定するのか?と思ったが、ソースを読むと以下のようになっており、過去の残骸のようだ。
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) // WP8 in VS2012 does not support nullptr in variable args lists and variadic templates are also not supported typedef MenuItem* M; static Menu* create(M m1, std::nullptr_t listEnd) { return variadicCreate(m1, NULL); } static Menu* create(M m1, M m2, std::nullptr_t listEnd) { return variadicCreate(m1, m2, NULL); } static Menu* create(M m1, M m2, M m3, std::nullptr_t listEnd) { return variadicCreate(m1, m2, m3, NULL); } static Menu* create(M m1, M m2, M m3, M m4, std::nullptr_t listEnd) { return variadicCreate(m1, m2, m3, m4, NULL); } static Menu* create(M m1, M m2, M m3, M m4, M m5, std::nullptr_t listEnd) { return variadicCreate(m1, m2, m3, m4, m5, NULL); } static Menu* create(M m1, M m2, M m3, M m4, M m5, M m6, std::nullptr_t listEnd) { return variadicCreate(m1, m2, m3, m4, m5, m6, NULL); } static Menu* create(M m1, M m2, M m3, M m4, M m5, M m6, M m7, std::nullptr_t listEnd) { return variadicCreate(m1, m2, m3, m4, m5, m6, m7, NULL); } static Menu* create(M m1, M m2, M m3, M m4, M m5, M m6, M m7, M m8, std::nullptr_t listEnd) { return variadicCreate(m1, m2, m3, m4, m5, m6, m7, m8, NULL); } static Menu* create(M m1, M m2, M m3, M m4, M m5, M m6, M m7, M m8, M m9, std::nullptr_t listEnd) { return variadicCreate(m1, m2, m3, m4, m5, m6, m7, m8, m9, NULL); } static Menu* create(M m1, M m2, M m3, M m4, M m5, M m6, M m7, M m8, M m9, M m10, std::nullptr_t listEnd) { return variadicCreate(m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, NULL); } // On WP8 for lists longer than 10 items, use createWithArray or variadicCreate with NULL as the last argument static Menu* variadicCreate(MenuItem* item, ...); #else /** creates a Menu with MenuItem objects */ static Menu* create(MenuItem* item, ...) CC_REQUIRES_NULL_TERMINATION; #endif
次に、レイヤーにスプライトを配置。
Sprite::create() でスプライトを生成し、addChild() で画面に配置、sprite->setPosition() で位置を指定している。
RotateBy::create(2, 360) はスプライトアニメーションの指定。RepeatForever::create(rotate) と組み合わせることで、延々回転し続ける。
それを sprite->runAction(repeat); で指定している。
最後の schedule( schedule_selector(SceneTestLayer1::testDealloc) ); は過去の残骸で、3.1 では指定する必要は無いようだ。
シーンを切り替えるには Director::getInstance()->replaceScene( scene ); を実行。
イフェクトを指定する場合は