2011-10-23 9 views
2

私はプログラミング割り当ての一部として少しゲームを書いています。私はスプライト/イメージが私が望むように動いているが、非常にぎこちない。私は、画像をアップロードしていますする方法は次のとおりです。私のアニメーションを不規則にする方法を教えてください。

//missile and paint are private members of the animation thread 
missile = Bitmap.createBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.missile)); 
paint = new Paint(); 
paint.setAntiAlias(true); 
startTime = new Date().getTime(); 

私のスレッドのrun方法は、このようなものです:

@Override 
public void run() { 
    while(running) { 
     Canvas canvas = null; 

     try { 
      canvas = surfaceHolder.lockCanvas(null); 

      synchronized (surfaceHolder) { 
       updatePhysics(); 
       doDraw(canvas); 
      } 
     } finally { 
      if(canvas != null) { 
       surfaceHolder.unlockCanvasAndPost(canvas); 
      } 
     } 
    } 
} 

updatePhysicsは、単に計算を実行し、呼び出したスレッドのプライベートメンバ内の値を格納しますprojectilePosition

:私は私の doDraw方法で次に

function updatePhysics() { 
    projectilePosition = interceptionCalculationService.positionAtTime((startTime - new Date().getTime())/1000); 
} 

private void doDraw(Canvas canvas) { 
    canvas.drawColor(Color.BLACK); 

    ... 

    //I update the position of the missile 
    canvas.drawBitmap(missile, (int) projectilePosition.getDistance() * 2, (int) (getHeight() - (95 + projectilePosition.getHeight())), paint); 
    canvas.restore(); 
} 

問題は、アニメーションが非常にぎくしゃくすることです。ミサイルは正しい道をたどりますが、滑らかではありません。スレッドのrunメソッドが呼び出されたときの間隔を実際に制御していないためです。アニメーションをよりスムーズにするにはどうすればよいですか?私はTranslateAnimationを見ていましたが、私はそれをどのように使用するかを理解できません。

これは初めてゲームを書くときとグラフィックス/アニメーションを行うときのため、ベストプラクティスやツールについてもよく理解していません。私は数多くのチュートリアルを調べることで、これまでのところこれを得ました。

+0

ViewはViewまたはSurfaceViewから派生していますか? – Goz

+0

これは 'SurfaceView'から派生したものです。 –

+0

それからフレームごとにあまりにも多くのことをしようとしていると思うでしょう...バックグラウンドスレッドの優先順位を上げる価値があるかもしれません... – Goz

答えて

0

解決方法私の解決策は、という変数(つまり、doDrawまたはupdatePhysics)を使用する変数(スレッドのプライベートメンバー)を使用することでした。だから、updatePhysicsは次のようになります。

function updatePhysics() { 
    projectilePosition = interceptionCalculationService.positionAtTime(currentTime); 
    currentTime++; 
} 

currentTimeは、スレッドのコンストラクタで0に初期化されます。これは私のアニメーションを滑らかにしました。

0

はいdoDrawメソッドは、プロセッサが処理できるオペレーティングシステムと同じ速さで呼び出されます。つまり、他のプロセスの影響を受け、プロセッサ時間が大量にかかります。かなりシンプルだが推奨されない解決策として、あなたのwhileループにThread.Sleep(50)を追加してください。アニメーションにタイマーを使用する方法を調べる。

+0

私は問題は私が私の位置を計算するためにシステム時間を使用していたと思います発射体。私はそれをどのようにしたかを説明する答えをここに追加します。 –

関連する問題