最近在開發《三國》的戰場地圖,爲了提高開發速度,果斷使用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函數就有可能出問題了,大概是爲了安全性吧…
一般手機遊戲都不會有這麼多圖塊集的,要是遇到這種情況,就注意一下吧…
PS:文章先寫個大概,等項目做完比較閒的時候,把關於CCTMXTiledMap實現認真開一次,再把文章慢慢補充完整,希望各位高手可以給點意見,補充一下~
轉自 http://blog.sina.com.cn/s/blog_61d2d3f501010lo0.html