読者です 読者をやめる 読者になる 読者になる

なかじまの開発ブログ

アプリ開発における備忘録などなど。

MENU

for文で複数のrunActionを実行しつつ最後のアクション終了を取得する方法【cocos2d-x】

タイトルって難しいですね。

何が言いたいかっていいますと、

複数のスプライトのアニメーションの移動距離が違うと、アニメーションの終了する順番がカウンタに沿ってではなく、バラバラになります。

つまり、for文のカウンタ最大値(?)で最後の処理を実行しようとしても、ズレのせいでうまく実行できない。。。

f:id:s_nakajima:20160421102753p:plain

for (int i = 0; i != SpriteVector.size(); i++) {
  // 移動
  SpriteVector.at(i)->runAction(Sequence::create(MoveTo::create(/*省略*/), CallFunc::create([=](){
    log("%d移動完了", i);
    if (i == SpriteVector.size()-1) log("最後のスプライト移動完了");
  }), NULL));
}

上の図と処理の場合、結果として

2移動完了
最後のスプライト移動完了
1移動完了
0移動完了


てなかんじになるわけですよ!!!(*´Д`)もー。


そして考えた結果、
スプライトの入ったVectorの要素数を1から足した合計値と、
for文で順番に足していった値を比較して、同じになったら最後の処理になるじゃないか!!

ということで↓

『.h』

Vector<Sprite *> SpriteVector;
int vectorsize;
int cnt;

bool countNum(int num);


『cpp』

// SpriteVectorの要素数を1から足した合計値を取得
int getTotal(int num) {
  int sum = 0;
  for (int i = 1; i != num + 1; i++) {
    sum += i;
  }

  return sum;
}


// 合計値とcntが一緒かチェック
bool SampleScene::countNum(int num) {
  cnt += (num + 1);

  int (cnt == getTotal(vectorsize)) return true;

  return false;
}


使い方

for (int i = 0; i != SpriteVector.size(); i++) {
  // 移動
  SpriteVector.at(i)->runAction(Sequence::create(MoveTo::create(/*省略*/), CallFunc::create([=](){
    log("%d移動完了", i);
    if (countNum(i)) log("最後のスプライト移動完了");
  }), NULL));
}


どんなけバラバラでも、要素数を1から足した合計値は変わらないので、すべてを足し終わったときが最後の処理となるわけですね。