2012-10-14 67 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實現。 –