我正在用 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);
}
}
}