SurfaceView を使用して簡単なゲーム エンジンを作成しました。
私は RectF を「カメラ」ウィンドウとして使用し、SurfaceView キャンバスのスケーリングされたピクセル幅と高さを表し、画面に何が表示されているかを把握します。
canvas.translate を使用して、カメラが「指している」場所に移動します。描画ループは次のとおりです。
mCamera.UpdateCamera();
scaleWorld(c, mCamera);
c.translate(-mScreen.left, mScreen.top - miHeight
* (1 / mCamera.getScaleLevel()));
drawBehavior.drawGame(c);
いずれにせよ、発射物を発射すると、ゲームはスムーズにレンダリングされ、キャンバスをフラッシュするために使用している色である黒の視覚的な閃光は見られません.
ただし、カメラが見ることができるものを即座に変更すると、おそらく 3 つ以上の「画面」が離れていると、常にではありませんが、多くの場合、黒い閃光が発生します。時々私は「幸運」になり、移行はシームレスです.
1 つまたは 2 つのビットマップを使用して地面と背景を再帰的に描画するため、これらのフラッシュは通常ビットマップの位置にあります。
突然の変更が問題であると思われたので、基本的にgameLoopスレッドを破棄してすべてを停止し、新しいRect座標を設定してから別のスレッドで再起動しようとしましたが、これは機能しません.
振り返ってみると、私はこれを行うことでシステムへの「ショック」を遅らせただけであり、それを処理しなかったと思います。
おそらくフェードアウトやその他の視覚的なトリックによって、このおそらくひどいデザインを敷物の下に一掃しようとする前に、誰かがこの問題をより深く理解し、よりエレガントな解決策に導くことができるかどうか疑問に思っています.