私はアンドロイドで小さなゲームを作成しています。画面に描画する必要があるものはすべてクラスを拡張しますVisibleObject
。次に、表示されてManager
いるすべてのゲームオブジェクトを追加できるクラスがあり、各フレームは、その中のすべての描画関数を呼び出すようにマネージャーに指示します。
オブジェクトが初期化され、マネージャーに追加されたのは次のとおりです。
@Override
public void surfaceCreated(SurfaceHolder holder) {
fps = new TextDrawable(Color.BLACK, 14, 100, 40, 40);
player = new Player();
map = new Map();
leftTouch = new TouchCircle(Color.GRAY);
manager.add("fpsText", fps);
manager.add("leftTouch", leftTouch);
manager.add("player", player);
manager.add("map", map);
gameloop = new GameLoop(getHolder(), this, fps);
gameloop.setRunning(true);
gameloop.start();
}
今私が抱えている問題は、オブジェクトが参照用にマネージャーに追加される順序を見ると、描画順序にあります。
- プレイヤーがマップの上に描かれていることは確かです!これらは両方とも、それぞれのビットマップを。で描画することによって描画され
drawBitmap(..)
ます。 - ただし、fpsTextとleftTouchはマップの下に描画されています。これらはそれぞれとを使用
drawText(..)
して描画されdrawOval(..)
ます。
それらは異なるCanvas.draw..
関数を実装しますが、必要なキャンバスオブジェクトをマネージャークラスに渡し、マネージャーにそのキャンバスを渡す各オブジェクトを循環させて描画するため、すべてが順番に描画されることを期待します。
ビットマップが上に描画されているように見える理由と、プレーヤーの上にfpsとタッチ領域を描画してビットマップをマップするための解決策を誰かに教えてもらえますか?私はそれを感謝します。
編集:私はprivate ConcurrentSkipListMap<String, VisibleObject> objectMap;
マネージャー内でオブジェクトを保存し、そのように描画するために使用しています。
public void draw(Canvas c){
for (Map.Entry<String, VisibleObject> object : objectMap.entrySet()){
synchronized(object){
object.getValue().draw(c);
}
}
}