1

Android 用のゲームを初めて作成しようとしていますが、キャンバスにアニメーションを描画するためのループを作成する必要があります。これは基本的に私が必要とするものです:

every 0.1 seconds do { //0.1 seconds is arbitrary of course, I need a time frame that's good for animation
   every 5 seonds do {
      someStuff();
    }
   drawEverything();
}

誰かがこれを実装する良い方法を推奨できますか? ありがとう!

4

4 に答える 4

2

あなたが使用することができますScheduleExecutorService

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ScheduledExecutorService.html

Runnable someStuff = new Runnable....

Runnable drawEverything = new Runnable...

次に、それらをスケジュールします。

ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();

executor.scheduleAtFixedRate(someStuff, 0, 100, TimeUnit.MILLISECONDS);
executor.scheduleAtFixedRate(drawEverything, 0, 5, TimeUnit.SECONDS);

これは、決して終了しないループを使用するよりもはるかにクリーンです。素晴らしいのは、シャットダウン フックがある場合、または直接呼び出したい場合は、次のように呼び出すことができるということです。

executor.shutDown()

保留中のタスクを完了してから停止します。

于 2012-11-27T23:13:39.610 に答える
0

CountDownTimerクラスonTickメソッドまたはChronometerクラスメソッドを使用してみてくださいsetOnChronometerTickListener

于 2012-11-27T22:57:14.737 に答える
0

対象とする Android API のバージョンと、ゲームの実装方法によって異なります。

API レベル 16 (4.1 / Jellybean) 以降で問題ない場合は、Choreographer クラス ( http://developer.android.com/reference/android/view/Choreographer.html ) を使用できます。

OpenGL ES、または vsync コールバックを提供するエンジンを使用している場合は、ゲームを別の方法で構築する必要があります。タイミングでディスプレイを駆動するのではなく、システムにゲームを駆動させ、経過時間に基づいてイベントが発生します。たとえば、http://code.google.com/p/android-breakout/GameState.calculateNextFrame()で弾むボールを進める方法を参照してください。トラフィックを誘導しなくなるため、これは不自然に感じられますが、画面の更新時にアニメーションがラッチされるため、より「リアル」になります。

于 2012-11-27T23:52:24.907 に答える
0

カスタムViewを作成し、そのメソッドを実装してonDraw()、そこで描画します。ビュー階層が無効化されるたびonDraw()に呼び出されます:

public class MyGameView extends View {

    @Override
    protected void onDraw(Canvas canvas) {
        // Any tasks that should run every frame can be placed here. For
        // example moving the player and monsters.

        // Draw everything to canvas here.
        canvas.drawBitmap(mPlayerBitmap, mPlayerX, mPlayerY, null);
        canvas.drawBitmap(mMonsterBitmap, mMonsterX, mMonsterY, null);

        // Either do a invalidate() to draw in maximum frame rate here. Or do
        // postInvalidateDelayed(10) to draw a new frame every 0.1 seconds.
        // onDraw() will automatically be called by the system.
        postInvalidateDelayed(10);
    }
}

を使用して、Buttonやなどの他のものを含む既存のビュー階層に新しいビューを追加できます。または、 を使用して、画面全体を占めるコンテンツ ビューとして設定することもできます。TextViewViewGroup.addView(myGameView)Activity.setContentView(myGameView)

繰り返し発生するタスクを投稿しView.postDelayed()て、 と同じスレッドで実行されるようにすることができますonDraw()。をポストすることができ、その後、そのメソッドが呼び出されるRunnableたびに自身をポストします。ゲームがバックグラウンドにあるときに何も実行されないようにするために、 にrun()タスクを投稿してActivity.onResume()で削除することをお勧めします。Activity.onPause()

@Override
protected void onResume() {
    super.onResume();
    mMyGameView.postDelayed(mRunnable, 5000);
}

@Override
protected void onPause() {
    super.onPause();
    mMyGameView.removeCallbacks(mRunnable);
}

private Runnable mRunnable = new Runnable() {
    @Override
    public void run() {
        // Perform reoccurring task...

        mMyGameView.postDelayed(mRunnable, 5000);
    }
};
于 2013-03-20T15:05:25.787 に答える