-1

我正在用 android 创建一个小游戏。任何需要在屏幕上绘制的东西都扩展了我的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 回答