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には実行するメソッド名を指定する方法もありますが、ここではラムダ式を使って実行コードを記述しています。
ラムダ式は次のような形が基本となります。
[キャプチャ](引数){
// 実行コード
}
キャプチャとはラムダ式内部の実行コードから、外部の変数などにアクセスする方法で、「参照(&)」や「コピー(=)」などを選択できます。
うっかりローカル変数をラムダ式の中で参照アクセスすると、とんでもない事態が起きるので、キャプチャに参照(&)を指定する場合は注意が必要です。
上記の例では、コピー(=)を指定しているので、ラムダ式からローカル変数にアクセスする場合は、コピーされた値が使われます。
コメントをお書きください