Andengine小ネタ > AnimatedSpriteを最後までアニメーションさせる

概要

AnimatedSpriteでループなしのアニメーションをさせる時、高速にアニメーションさせると最後じゃないフレームで止まってしまうことがあります。

例としてモグラたたきを考えます(作りかけなのでクオリティは無視して下さい)。もぐらのスプライトに以下のようなタイルテクスチャを用意します。


これをアニメーションさせて「にょき」っと、もぐらが出てくる感じを再現したいとします。

このテクスチャからAnimatedSpriteを作成して、並べてアニメーションさせてみます(アニメーションの開始タイミングは乱数でずらしています)。

すると、以下のように、最後じゃないフレームで止まってしまうスプライトが出てきてしまいます。

1回の画面更新の間隔に比べてアニメーションの間隔が短いと起こりやすいようです。古い端末やエミュレータなどでよく見られます。

解決策

animate命令にリスナーを設定して、アニメーション終了時に強制的に最後のフレームに変更するようにします。

フレームを指定して止めるのはstopAnimation(int)命令を使います。

コード

以下のようにanimeteの引数にIAnimationListenerを設定して、onAnimationFinishedをオーバーライドしてstopAnimation(int)を実行するようにします。

setCurrentTileIndexでもフレームの指定はできますが、アニメーションの再生は止まらないのでうまく行かないこともあるようです。

//スプライトの生成
AnimatedSprite aSprite = new AnimatedSprite(x, y, region, vbom);
 
//フレーム間隔は30ミリ秒
//ループなし
//再生するフレームは5枚(0〜4)で、最後は5枚目(フレーム番号4)で止める。
aSprite.animate(30, false,new IAnimationListener() {
 
		@Override
		public void onAnimationStarted(AnimatedSprite pAnimatedSprite,
				int pInitialLoopCount) {
			// TODO Auto-generated method stub
 
		}
 
		@Override
		public void onAnimationLoopFinished(AnimatedSprite pAnimatedSprite,
				int pRemainingLoopCount, int pInitialLoopCount) {
			// TODO Auto-generated method stub
 
		}
 
		@Override
		public void onAnimationFrameChanged(AnimatedSprite pAnimatedSprite,
				int pOldFrameIndex, int pNewFrameIndex) {
			// TODO Auto-generated method stub
 
		}
 
		@Override
		public void onAnimationFinished(AnimatedSprite pAnimatedSprite) {
			pAnimatedSprite.stopAnimation(4);
 
			}
	});
 

結果

以下のようにうまく最終フレームで止まってくれます。

合計: -
今日: -
昨日: -
最終更新:2014年09月17日 06:21