tmx加載出錯m_uMaxGID >= m_pTileSet->m_uFirstGid

最近在開發《三國》的戰場地圖,爲了提高開發速度,果斷使用CCTMXTiledMap拼接地圖。美術畫好圖塊後,再用TileMap自帶的編輯器畫好關卡,地圖就生成了,簡單方便,以下是我對各區域的讀法,以防大家不理解我在說啥…

61d2d3f5gb9371d192112&690.jpg

PS:編輯器下載地址:http://www.mapeditor.org/


如果圖塊集只有一張的畫,那麼TileMap應該是怎麼畫都沒問題的。但是,如果一張地圖會有多張圖塊集的話,各個圖塊集的圖塊還畫在同一圖層的話,那麼就會出問題了。

61d2d3f5gb9371eaa51e4&690.jpg

(多個圖塊集)


先把問題重現一下,我把【圖塊集Ground】和【圖塊集Activity】的圖塊:“綠地”和“草“畫在同一層【地表層】上,如圖:61d2d3f5gb937218fa574&690.jpg


然後跑一下程序,崩了…

從錯誤信息來看,是GID的取值範圍越界了,關於GID,先來一段掃盲貼:

CCTMXTiledMap中的GID是CCTMXLayer所對應的CCTMXTilesetInfo中每一個tile獨一無二的編號,在cocos2d中CCTMXLayer只能對應一個CCTMXTilesetInfo,如果使用tile map editor來編輯的話,這個CCTMXTilesetInfo實際上對應一張包含各種tile的spritesheet圖。這個gid編號是以這樣圖中tile的位置來決定的,規則是從該圖中的左上角開始,從左到右,每一行從左開始。CCTMXTilesetInfo中的方法rectForGID即是獲取對應gid的tile在spritesheet圖中的位置。一般這個編號是從1開始的。

摘抄自:飛翔的自由辛

http://www.cnblogs.com/flyFreeZn/archive/2011/12/19/2293980.html



跟蹤源代碼,就很明顯了:一個圖層只支持一個圖塊集…


  1. void CCTMXLayer::setupTiles()

  2.      …;
  3.        CCAssert( m_uMaxGID >= m_pTileSet->m_uFirstGid &&
  4.                      m_uMinGID >= m_pTileSet->m_uFirstGid, "TMX: Only 1 tilset per layer is supported");  
  5. }
複製代碼

之所以這麼做,我的想法是:

  1. class CC_DLL CCTMXTilesetInfo : public CCObject
  2.        {
  3.               CCTMXTilesetInfo();
  4.               virtual ~CCTMXTilesetInfo();
  5.               CCRect rectForGID(unsigned int gid);
複製代碼

一個圖塊集對應一個CCTMXTilesetInfo對象,因此如果一個gid如果不在這個圖塊集裏面,那麼這個獲取gid的CCRect函數就有可能出問題了,大概是爲了安全性吧…

一般手機遊戲都不會有這麼多圖塊集的,要是遇到這種情況,就注意一下吧…

PS:文章先寫個大概,等項目做完比較閒的時候,把關於CCTMXTiledMap實現認真開一次,再把文章慢慢補充完整,希望各位高手可以給點意見,補充一下~

轉自 http://blog.sina.com.cn/s/blog_61d2d3f501010lo0.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章