我在android中创建一个小游戏。任何需要在屏幕上绘制的东西都会扩展我的类,然后我有一个Manager
类,我可以将所有可见的游戏对象添加到每个框架中,并告诉经理调用其中所有内容的绘图函数。Android的位图,绘图和文本的绘制顺序?
这里的是对象初始化,并添加到管理:
@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..
的功能,我希望他们都为了绘制成我只是通过Canvas对象,我有我的经理类,然后让管理者循环每个对象传递给它的是帆布画画。
任何人都可以为我澄清为什么位图看起来在顶部绘制,以及解决方案应该是什么让我的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);
}
}
}
啊,这很有趣!我用我的代码更多地编辑了我的问题..但是我使用了ConcurrentSkipListMap,并且我刚刚再次阅读文档,它说“地图按照其按键的自然顺序排序”所以我想按字母顺序排列,doh! :p你最适合这种储存容器的是什么?非常感谢您的帮助 – Holly
是的,它意味着按字母顺序排列,所以不是为了添加元素。如果你真的需要Map,LinkedHasmap会更合适,但是从你公开的代码中我看不到Map需要,你可以使用像ArrayList一样的List实现。 –