タイトルを数秒間表示して、次の処理を実現するには、タイマーが必要です。cocos2dxにはscheduleという便利なタイマー機能があります。ただ覚えておかないといけないのが、何秒後に「関数を呼び出す」ということしかできない点です。
Cocos2dx 3.x C++言語
ScheduleScene.hを次のように変更してみてください。
#ifndef __Schedule__ScheduleScene__
#define __Schedule__ScheduleScene__
#include "cocos2d.h"
// 名前空間 #define USING_NS_CC using namespace cocos2d
USING_NS_CC;
class ScheduleScene : public cocos2d::Layer
{
protected:
ScheduleScene();
virtual ~ScheduleScene();
//初期化のメソッド
bool init() override;
public:
static cocos2d::Scene* createScene();
// create()を使えるようにしている。
CREATE_FUNC(ScheduleScene);
// 1番目画像
Sprite* Sprite01;
// 2番目画像
Sprite* Sprite02;
// 3番目画像
Sprite* Sprite03;
// 1番目画像Runアクション
void Action01(float frame); // float型のパラメータが必要です。
// 2番目画像Runアクション
void Action02(float frame); // float型のパラメータが必要です。
// 3番目画像Runアクション
void Action03(float frame); // float型のパラメータが必要です。
};
#endif /* defined(__Schedule__ScheduleScene__) */
Scheduleタイマーを使用し3つの画像を順番に縮小し消していくアクション実行します。
ScheduleScene.cppを次のように変更してみてください。
#include "ScheduleScene.h"
// 名前空間 #define USING_NS_CC using namespace cocos2d
USING_NS_CC;
using namespace std; // String*
ScheduleScene::ScheduleScene()
{
}
ScheduleScene::~ScheduleScene()
{
}
Scene* ScheduleScene::createScene()
{
// 「シーン」は自動解放オブジェクトです
auto scene = Scene::create();
// 「レイアウト」は自動解放オブジェクトです
auto layer = ScheduleScene::create();
// シーンに子としてレイヤーを追加
scene->addChild(layer);
// シーンを返す
return scene;
}
// 「INIT」初期化
bool ScheduleScene::init()
{
if ( !Layer::init() )
{
return false;
}
//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
Size winSize = Director::getInstance()->getVisibleSize();
// バックグランドカラー(ブルー)
auto background = LayerColor::create(Color4B::BLUE,
winSize.width,
winSize.height);
this->addChild(background);
//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
// 1番目スプライトの作成
Sprite01 = Sprite::create("img001.png");
//画面の中央に表示
Sprite01->setPosition(Vec2(winSize.width/2, winSize.height/1.5));
this->addChild(Sprite01);
// 2番目スプライトの作成
Sprite02 = Sprite::create("img002.png");
//画面の左に表示
Sprite02->setPosition(Vec2(winSize.width/5, winSize.height/4));
this->addChild(Sprite02);
// 3番目スプライトの作成
Sprite03 = Sprite::create("img003.png");
//画面の右に表示
Sprite03->setPosition(Vec2(winSize.width/1.25, winSize.height/4));
this->addChild(Sprite03);
//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
// 1番目1回実行画像Runアクションスケジュール 2秒後
this->scheduleOnce(schedule_selector(ScheduleScene::Action01), 2.0f);
// 2番目1回実行画像Runアクションスケジュール 4秒後
this->scheduleOnce(schedule_selector(ScheduleScene::Action02), 4.0f);
// 3番目1回実行画像Runアクションスケジュール 7秒後
this->scheduleOnce(schedule_selector(ScheduleScene::Action03), 7.0f);
return true;
}
// 1番目画像Runアクションメソッド
void ScheduleScene::Action01(float frame)
{
// 大きさ(縮小)アクションを適用 1.0秒 0倍
auto scaleTo1 = ScaleTo::create(1.0f, 0.0f);
//callbackでの消去処理
auto removeSprite1 = CallFunc::create([this](){
this->removeChild(Sprite01);
});
// 縮小、消去アクションを適用
auto sequence1 = Sequence::create(scaleTo1, removeSprite1, NULL);
// 縮小、消去runアクションを適用
Sprite01->runAction(sequence1);
}
// 2番目画像Runアクションメソッド
void ScheduleScene::Action02(float frame)
{
// 大きさ(縮小)アクションを適用 2.5秒 0倍
auto scaleTo2 = ScaleTo::create(2.5f, 0.0f);
//callbackでの画像消去処理
auto removeSprite2 = CallFunc::create([this](){
this->removeChild(Sprite02);
});
// 縮小、消去アクションを適用
auto sequence2 = Sequence::create(scaleTo2, removeSprite2, NULL);
// 縮小、消去runアクションを適用
Sprite02->runAction(sequence2);
}
// 3番目画像Runアクションメソッド
void ScheduleScene::Action03(float frame)
{
// 大きさ(縮小)アクションを適用 2.5秒 0倍
auto scaleTo3 = ScaleTo::create(2.5f, 0.0f);
//callbackでの画像消去処理
auto removeSprite3 = CallFunc::create([this](){
this->removeChild(Sprite03);
});
// 縮小、消去アクションを適用
auto sequence3 = Sequence::create(scaleTo3, removeSprite3, NULL);
// 縮小、消去runアクションを適用
Sprite03->runAction(sequence3);
}
GitHub Schedule
まとめ
.hファイルにメソッドを記述する。
class ScheduleScene : public cocos2d::Layer
{
public:
................
// update()メソードは所謂「メインループ」のことです。scheduleUpdateを使うには、まずヘ
// ッダーファイルにupdate()メソードの定義
void update( float frame
); // float型のパラメータが必要です。
// メソードを使用したタイマー
// 1番目画像Runアクション
void Action01(float frame); // float型のパラメータが必要です。
// 2番目画像Runアクション
void Action02(float frame); // float型のパラメータが必要です。
// 3番目画像Runアクション
void Action03(float frame); // float型のパラメータが必要です。
};
.cppファイルに1回だけの実行する「scheduleOnce」とアクションメソッドを記述する。
// 「INIT」初期化
bool ScheduleScene::init()
{
if ( !Layer::init() )
{
return false;
}
.................
// 1番目1回実行画像Runアクションスケジュール 2秒後
this->scheduleOnce(schedule_selector(ScheduleScene::Action01), 2.0f);
// 2番目1回実行画像Runアクションスケジュール 4秒後
this->scheduleOnce(schedule_selector(ScheduleScene::Action02), 4.0f);
// 3番目1回実行画像Runアクションスケジュール 7秒後
this->scheduleOnce(schedule_selector(ScheduleScene::Action03), 7.0f);
{
// 1番目画像Runアクションメソッド
void ScheduleScene::Action01(float frame)
{
......................
// 縮小、消去runアクションを適用
Sprite01->runAction(sequence1);
}
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
メインループ
this->scheduleUpdate()
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
スケジュールの実行(フレーム毎に実行)
フレーム毎にAction01Logic関数を呼び出す例です。
this->schedule(schedule_selector(ScheduleScene::Action01));
3秒に一回「Action01」を繰り返す場合。
this->schedule(schedule_selector(ScheduleScene::Action01), 3.0f);
スケジュールの実行(秒、リピート回数、ディレイを指定)
下記の場合は、5.0秒後にスタートして、
1.0秒毎にAction01Logic関数を3回繰り返す例です
this->schedule(schedule_selector(ScheduleScene::Action01),1.0f, 3, 5.0f);
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
scheduleOnceを使うと、メソードが一回だけ実行
this->scheduleOnce(schedule_selector(ScheduleScene::Action01), 3.0f);
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
update()メソードを使用したタイマーを止める場合
this->unScheduleUpdate();
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
メソードを使用したタイマーを止める場合
this->unschedule(schedule_selector(ScheduleScene::Action01));
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
すべてのタイマーを止めたい場合
this->unscheduleAllSelectors();
コメントをお書きください