Cocos Creator 配合Tiled地圖的使用


版本2.3.4

參考:

TiledMap Editor官網

cocos TiledMap組件參考

GitBook TiledTile API

 

游戲中經常會用到瓦片地圖,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等等

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM