轉自: http://miraklelhj.i.sohu.com/blog/view/227380352.htm
最近在開發《三國》的戰場地圖,爲了提高開發速度,果斷使用CCTMXTiledMap拼接地圖。美術畫好圖塊後,再用TileMap自帶的編輯器畫好關卡,地圖就生成了,簡單方便,以下是我對各區域的讀法,以防大家不理解我在說啥…
PS:編輯器下載地址:http://www.mapeditor.org/
如果圖塊集只有一張的畫,那麼TileMap應該是怎麼畫都沒問題的。但是,如果一張地圖會有多張圖塊集的話,各個圖塊集的圖塊還畫在同一圖層的話,那麼就會出問題了。
(多個圖塊集)
先把問題重現一下,我把【圖塊集Ground】和【圖塊集Activity】的圖塊:“綠地”和“草“畫在同一層【地表層】上,如圖:
然後跑一下程序,崩了…
從錯誤信息來看,是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
跟蹤源代碼,就很明顯了:一個圖層只支持一個圖塊集…
void CCTMXLayer::setupTiles()
{
…;
CCAssert( m_uMaxGID >= m_pTileSet->m_uFirstGid
&&
m_uMinGID >=
m_pTileSet->m_uFirstGid, "TMX: Only 1 tilset per layer is
supported");
}
之所以這麼做,我的想法是:
class CC_DLL CCTMXTilesetInfo : public CCObject
{
CCTMXTilesetInfo();
virtual ~CCTMXTilesetInfo();
CCRect rectForGID(unsigned int
gid);
}
一個圖塊集對應一個CCTMXTilesetInfo對象,因此如果一個gid如果不在這個圖塊集裏面,那麼這個獲取gid的CCRect函數就有可能出問題了,大概是爲了安全性吧…
一般手機遊戲都不會有這麼多圖塊集的,要是遇到這種情況,就注意一下吧…