2012-10-14 70 views
-1

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

回答

2

不对位图进行绘制在文本的顶部(和位置重叠)。

你没有透露onDraw方法,所以我不能确定,但​​我怀疑你没有以正确的顺序调用绘图方法。 经理如何存储添加到其中的值?也许你使用的Map实现不会保持添加元素的顺序(大多数实现不会,LinkedHashmap)。

+0

啊,这很有趣!我用我的代码更多地编辑了我的问题..但是我使用了ConcurrentSkipListMap,并且我刚刚再次阅读文档,它说“地图按照其按键的自然顺序排序”所以我想按字母顺序排列,doh! :p你最适合这种储存容器的是什么?非常感谢您的帮助 – Holly

+1

是的,它意味着按字母顺序排列,所以不是为了添加元素。如果你真的需要Map,LinkedHasmap会更合适,但是从你公开的代码中我看不到Map需要,你可以使用像ArrayList一样的List实现。 –