0

シーンで使用している CCSprite があり、単一の CCSpriteFrameCache sharedSpriteFrameCache を使用してすべてに適用する複数の CCAnimation アクションを作成しました。すべてが機能しており、アニメーションを切り替えることができますが、うまくいかないように感じます。次のアクションを実行する前に、CCSprite で実行中のアクションを取得して個別に停止することで、コードを簡素化したいと考えています。それ。

コンテキストを作成しやすくするために、次の状況を想定してみましょう。

  • mySprite という CCSprite があります。

  • それぞれ actionAnimWalkRight、actionAnimWalkLeft、actionAnimSitForward と呼ばれる、右に歩く、左に歩く、前を向いて座るという 3 つの個別の CCAnimation アクションが定義されています。

  • 誰かが mySprite の右側の画面に触れるとスプライトが右に歩き、mySprite の左側の画面に触れると左に歩き、誰かが mySprite に触れると座るようにします。

これを達成するために私が使用しているアプローチは次のとおりです。

  1. シーンに CCSprite を子として配置します。
  2. [self runAction:actionWalkRight]; を使用してアクションを実行するようにスプライトに指示します。
  3. 誰かが触れた後にアクションを変更したい場合、実行中のアニメーション アクションを停止する新しいアクションを適用する前に呼び出す stopAllAnimationActions というメソッドがあります。基本的に、私が定義したすべての CCAnimation/CCActions をリストし、stopAllActions を使用したくないので、それぞれを個別に停止します。次のように: [self stopAction:actionWalkRight]; [self stopAction:actionWalkLeft]; [self stopAction:actionSitForward];
  4. 次に、[self runAction:actionWalkLeft]; を使用して、上記のメソッドが起動した後に新しいアニメーションを適用します。

これは機能しますが、何が実行されているか正確にわからないという理由だけで、実行されていないことがわかっているアイテムを停止するのは設計が悪いようです。したがって、非常に複雑な状況でこのようなことを行うためのアドバイスと最も推奨されるプラクティスを探しているだけなので、考えられるすべての状況を追跡することは困難です. フィードバックをいただければ幸いです。

4

2 に答える 2

1

プロセスを簡素化し、を含むネイティブのCocos機能を利用することをお勧めしますstopAllActions。アクションを再利用しないでください。アクションの再利用にはバグがある可能性があることがCocos開発者の間でよく議論されているため、常に最初からアクションを作成してください。

Cocosは十分に最適化されており、のような機能stopAllActionsはパフォーマンスを低下させません。実際には、おそらくあなたのアプローチよりも速いでしょう。

于 2012-04-20T05:12:33.780 に答える
1

アクションを作成するときに、そのアクションのタグに定数を設定します。

actionWalkRight.tag= kCurrentAction;
[self runAction:actionWalkRight];

次に、そのタグで実行中のアクションを取得して停止します。

[self stopActionByTag:kCurrentAction];
于 2012-04-20T15:10:28.713 に答える