2015年

3月

03日

Cocos2d-x Ver 3.x DelayTime 複数のアクションを順番に実行(ディレイ付き タイミングをずらす)


Sequence、DelayTimeを使用し複数のアクションを、間にディレイを入れながら順番に実行します。 

 

Cocos2dx 3.x C++言語
DelayTimeScene.hを次のように変更してみてください。

#ifndef __DelayTime__DelayTimeScene__

#define __DelayTime__DelayTimeScene__


#include "cocos2d.h"


class DelayTimeScene : public cocos2d::Layer

{

protected:

    DelayTimeScene();

    virtual ~DelayTimeScene();

    //初期化のメソッド

    bool init() override;

    

public:

    static cocos2d::Scene* createScene();

    

    // create()を使えるようにしている。

    CREATE_FUNC(DelayTimeScene);

    

};


#endif /* defined(__DelayTime__DelayTimeScene__) */


DelayTimeScene.cppを次のように変更してみてください。


2つのアクションを、ディレイを入れて順番に実行
最初に拡大、その後3秒経ってからフェードアウトするアクションを作成します。

#include "DelayTimeScene.h"

// 名前空間 #define USING_NS_CC using namespace cocos2d

USING_NS_CC;


using namespace std; // String*


DelayTimeScene::DelayTimeScene()

{

    

}


DelayTimeScene::~DelayTimeScene()

{

    

}


Scene* DelayTimeScene::createScene()

{

    // 「シーン」は自動解放オブジェクトです

    auto scene = Scene::create();

    

    // 「レイアウト」は自動解放オブジェクトです

    auto layer = DelayTimeScene::create();

    

    // シーンに子としてレイヤーを追加

    scene->addChild(layer);

    

    // シーンを返す

    return scene;

}


// INIT」初期化

bool DelayTimeScene::init()

{

    if ( !Layer::init() )

    {

        

        return false;

    }

    

    //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

    

    Size winSize = Director::getInstance()->getVisibleSize();

    

    // バックグランドカラー(ホワイト)

    auto background = LayerColor::create(Color4B::BLUE,

                                         winSize.width,

                                         winSize.height);

    this->addChild(background);

    

    //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

    //スプライトの作成

    auto Sprite = Sprite::create("Icon-152.png");

    Sprite->setPosition(Vec2(winSize.width/2, winSize.height/2));

    this->addChild(Sprite);

    

    //拡大のアクション 0.5 3倍拡大

    auto scaleAction = ScaleBy::create(.5, 3);

    

    //3秒のお休み

    auto delay = DelayTime::create(3);

    

    //フェードアウトのアクション 0.5

    auto fadeOutAction = FadeOut::create(0.5);

    

    //拡大->3秒お休み->フェードアウトの順番にアクションを並べる

    auto sequence = Sequence::create(scaleAction, delay, fadeOutAction, NULL);

    

    //開始!

    Sprite->runAction(sequence);

    

    return true;

}


GitHub DelayTime


NodeクラスのrunActionメソッドとラムダ式


this->runAction(Sequence::create(DelayTime::create(0.5f), CallFunc::create([=](){

// (例) 0.5秒後に行わせたい処理

auto sprite = Sprite::create("sprite.png");

sprite->setPosition(this->getContentSize()*0.5f);

this->addChild(sprite);

}),nullptr));


0.5秒に設定したDelayTimeインスタンスと、CallFuncインスタンスをSequenceでくるんで、runActionメソッドに送ります。
CallFuncには実行するメソッド名を指定する方法もありますが、ここではラムダ式を使って実行コードを記述しています。

ラムダ式は次のような形が基本となります。

[キャプチャ](引数){
  // 実行コード
}


キャプチャとはラムダ式内部の実行コードから、外部の変数などにアクセスする方法で、「参照(&)」や「コピー(=)」などを選択できます。
うっかりローカル変数をラムダ式の中で参照アクセスすると、とんでもない事態が起きるので、キャプチャに参照(&)を指定する場合は注意が必要です。

上記の例では、コピー(=)を指定しているので、ラムダ式からローカル変数にアクセスする場合は、コピーされた値が使われます。