Cocos2d-x Ver 3.x タイマー「schedule」


タイトルを数秒間表示して、次の処理を実現するには、タイマーが必要です。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.00

    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.50

    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.50

    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();