2012-02-05 7 views
1

私はこれをかなり単純な表示にしました。一定期間(左から右へ移動する赤い線をアニメートすることになっています(DURATION)。 DELAYの位置を更新する必要があるので、アニメーションをよりスムーズに調整することができます。私はエミュレータでこれをテストしていることに注意してください。さて、もし私がDELAYを増やすと、アニメーションは、アニメーション時間全体に影響を与えなくても、より速く終了します。私は単純にアニメーション化するのが速すぎる、すべてのリソースを狙っていますか?または私の数学はオフですか?キャンバス上を移動する線をアニメ化する

public class AnimView extends View { 

    // Animation duration in milliseconds 
    private static final int DURATION = 4000; 

    // Update frame every delay (in milliseconds) 
    private static final int DELAY = 10; 

    private int pos; 
    private long lastTick; 
    private Paint paint; 

    public AnimView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     pos = 0; 
     lastTick = 0; 
     paint = new Paint(); 
     paint.setColor(Color.RED); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 

     if(System.currentTimeMillis() - lastTick >= DELAY) { 
      // Calculate a new position for the line 
      pos += (int) (((double) DELAY/DURATION) * getWidth()); 

      lastTick = System.currentTimeMillis(); 
     } 

     canvas.drawRect(pos, 0, pos + 1, getHeight(), paint); 

     if(pos < getWidth()) { 
      // Position is still below getWidth, keep animating 
      postInvalidate(); 
     } 

    } 

} 
+1

ここでlastTickを変更しますか? –

答えて

2

あなたはif文でlastTickを更新する必要があります。

long currentTime = System.currentTimeMillis(); 
if(currentTime - lastTick >= DELAY) { 
    // Calculate a new position for the line 
    pos += (int) (((double) DELAY/DURATION) * getWidth()); 
    lastTick = currentTime; 
} 

DELAYが経過した後、そうでない場合は、各時間を描画します。ですから、DELAYを増やすと描画が少なくなり、プログラムはより速く終了します。

+0

ええ、私はコードを更新しました。問題は同じように見えましたが、さらにいくつかのテストでは解決されました。ありがとう。 –

1

このスレッドに色を追加するには、これはゲーム開発のよく知られた問題です。あなたは、たとえば、「可変時間ステップ対固定時間ステップ」で検索した場合は、その上のリソースの多くを見つけることができます:http://gafferongames.com/game-physics/fix-your-timestep/

それの要点は、アニメーションの速度は直接であなたのフレームレートに結びついているということです瞬間これは、古いNESのメガマンゲームでは、一度にたくさんの敵が画面に表示されていたとき(CPUがそれらのエンティティのすべてのデータを計算するために時間がかかるため、各フレームの処理に時間がかかりました) )。

この問題を回避する2つの方法があります:あなたは、アニメーションの各フレーム間の進行時間の量によって、それぞれの動きを掛け可変時間ステップへ

  1. 移動します。そうすれば、何らかの理由でその金額が変わると、あなたのアニメーションは同じように見えます。
  2. 描画の速度に関係なく、更新メソッドに渡される時間の差分を制御できるように、更新と描画のフェーズを分けます。
+0

ありがとう、これは実際にゲームのペットプロジェクトの始まりでしたので、あなたのコメントは非常に関連しています。 –

関連する問題