ViVi Home > 技術文書 > cocos2d-x > Scene テスト


 
Follow @vivisuke Tweet

 

Scene テスト
Copyright (C) 2014 by Nobuhide Tsuda

概要

上図のテストプログラム画面で、「Node: Scene」を選ぶと、下図のシーンテスト画面になる。

シーンテスト画面では、画面上のシーン切り替えボタンを押すと、シーンが切り替わる。

シーン切り替えは、単純にシーンを変更するものと、上部からスライドしてくるもの、回転により切り変わるイフェクト付きのものがある。
上図は回転により切り替えている途中のスクショだ。

SceneTest.h

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() 仮想関数を宣言している。

SceneTest.cpp

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 ); を実行。

イフェクトを指定する場合は



まとめ