-1

私はアンドロイドで小さなゲームを作成しています。画面に描画する必要があるものはすべてクラスを拡張します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);
            }
        }
    }
4

1 に答える 1

2

テキストを描画した後にビットマップを描画しない限り(および位置が重なって)、ビットマップはテキストの上に描画されません。

onDrawメソッドを公開していないのでわかりませんが、描画メソッドを正しい順序で呼び出していないのではないかと思います。マネージャーはそれに追加された価値をどのように保存しますか?追加された要素の順序を維持しないMap実装を使用している可能性があります(ほとんどの実装は維持していませんが、LinkedHashmapは維持しています)。

于 2012-10-14T11:15:26.760 に答える