版本2.3.4
參考:
游戲中經常會用到瓦片地圖,cocos也提供了對Tiled編輯器的支持。現在來學習下如何使用。
現在來創建一個TiledMap,並用到cocos中,最終效果如下
一 打開Tiled 新建地圖
選擇創建新地圖,塊大小64x64,地圖行列30x40
新建好的地圖
二 新建圖層
選擇右上角圖層中的“圖層塊1”,修改為“Layer”(雙擊可改名)
在圖層空白處右鍵,新建對象層,並命名為object
然后調整下圖層位置(拖拽Layer到object上方),圖層最終這樣
三 新建地圖塊
准備的場景圖片如下
選擇圖層,新建圖塊集,選擇ground.png
另存為這樣一個文件,ground.tsx
回到tmx后會看見右下方自動有圖塊集了(如果沒有,直接拖動ground.tsx文件到空白處會自動打開,右下就會顯示圖塊集)
選擇圖層Layer,選擇工具欄圖章刷,選擇右下圖塊(可以點擊單選,或者按住shift多選),然后就可以在格子里繪制地圖了。
最終繪制成這樣
圖層只能填64x64的格子,那么我想貼整張圖上去。就得使用多圖片集合。
右下角選擇圖層欄,點擊新建圖集,選擇多圖片集合,任意取個名字test,另存為test
test是這樣的,空空如也
點擊添加圖塊,選擇多個植物圖片,然后保存。
回到map.tmx。可以看到右下角多出了剛才創建的test圖塊集。因為圖片太大,我們縮放顯示12%。
1. 選擇右上圖層欄的對象層object
2. 選擇右下test圖塊集
3. 選擇右上工具欄的插入圖塊
4. 選擇右下一個木頭圖片,然后可以擺放在地圖任意位置了 (只有對象層能任意擺放,如果是Layer層,則只能按照64x64的固定位置擺放)
我隨便擺個
四 在cocos中使用tmx
復制所有文件到cocos的assets/resources/tmx下 (沒有就自己新建,或者隨便建個文件夾)
直接拖動map.tmx到舞台,則可直接生成了地圖 (我之前項目就新建好了map1.tmx了,懶得重新又擺一次)
選擇map的Node節點,查看屬性檢查器,看到有個TiledMap,這個對象就保存了tmx地圖的所有屬性,我們把他打印出來
打印出來的TiledMap
現在我們想獲取地圖上的二維數組數據,用於其他操作。比如我在tmx里新建一個collider圖層,專門用來生成碰撞檢測的圖層,根據二維數組上的id,來生成碰撞檢測的boxcollider。
那么如何獲取地圖圖層上的二維數組數據呢,現在以獲取Layer的數據為例子。大家可以查看API GitBook TiledTile API。
//根據圖層名獲取圖層 let layer:cc.TiledLayer = this.map.getLayer("Layer1"); //獲取圖層的行列數 let layerSize:cc.Size = layer.getLayerSize(); let width = layerSize.width; let height = layerSize.height; console.log(layerSize); // size(width:40, height:30) //獲取圖層的gid let mapData = []; for(let i=0;i<height;i++){ mapData[i] = []; for(let j=0;j<width;j++){ mapData[i].push(layer.getTileGIDAt(new cc.Vec2(j,i))); } } console.log(mapData);
關於上面的代碼,我經常搞不清楚,i,j,width,height究竟哪個代表行,哪個代表列。這個需要自己打印出來看下對不對.
打印出來獲取的二維數組,和map.txt對比下,恩,是正確的
那么數組里這些數字是什么呢?是圖塊集里的圖片id,例如上圖二維數組左下角的9,對應地圖左下角的圖塊id。
可以看到是圖塊集中對應的一塊ID是0,那么為什么打印出來是9呢。
因為有兩個圖集塊。如下圖
所以左下角的圖塊實際ID是:
左下圖塊ID0 + 上一圖集數量8 + 1 = 0+8+1 = 9
(因為0代表空白,所以所有圖塊ID會+1)
那么這樣可以知道,圖塊和打印出來的二維數組是正確匹配的。
假如所有9-14都是可以碰撞的,那么我們根據二維數組來生成boxcollider碰撞就行了。
Tiled坐標系和在cocos中生成的對象坐標系
在Tiled編輯器中,地圖左上角是原點(0,0),對象層的圖片對象錨點在左下角。
Tiled的tmx在cocos中生成的地圖
地圖TiledMap的節點map1以及圖層bgLayer等,和cocos生成的button、label等對象一樣,都是錨點居中。
所以在地圖上添加玩家、怪物等對象到對應圖層時,了解圖層錨點居中這個特點,開發者知道怎么擺游戲對象位置。
對象層的對象,錨點是左下角。比如圖中的那顆紫色花。
如果怪物刷新點也是在Tiled對象層中編輯,那么刷新點圖片錨點也是左下角,知道這個特點,開發者在刷新點生成怪物時,就可以知道怎么擺位置了。
自定義屬性
選擇一個.tsx文件,選中一個圖塊,點擊右下角+號
彈出框中自定義屬性名
給自定義屬性type賦值1
代碼中根據GID,使用getPropertiesForGID(20)獲取自定義屬性
console.log( this.titedMap.getPropertiesForGID(20)); // 輸出 {type:1}
使用場景
河流圖塊 類型1 不可行走
流沙圖塊 類型2 移動速度-1
障礙圖塊 類型3 不可行走
陷阱模塊 類型4 在此圖塊生成類型4的陷阱
...
總結
嗯。地圖使用暫時到這里。總結一下
1. 新建地圖
2. 新建圖層 ,對象層和圖塊層
3. 新建圖塊集, 單圖和多圖集合
4. cocos中拖動生成Tiled的實體
5. 獲取地圖數據信息GID,用於判斷哪些地方生成碰撞BoxCollider等等