需求:
在cocosCreator項目裏,動態識別tiledMap的圖層,並設置某些圖層的碰撞分組。(這樣一來,每次改動地圖,就不需要重新手動修改碰撞區域,複雜形狀的碰撞區域也可以自動設置)
代碼:
傳入需要動態設置的地圖節點(mapNode)即可。
第一個 wall 是tiledMap中的圖層名稱,
第二個 wall 是我設置的碰撞分組名稱。
initMap(mapNode) {
let tiledMap = mapNode.getComponent(cc.TiledMap);
let tiledSize = tiledMap.getTileSize();
let layer = tiledMap.getLayer("wall");
let layerSize = layer.getLayerSize();
for (let i = 0; i < layerSize.width; i++) {
for (let j = 0; j < layerSize.height; j++) {
let tiled = layer.getTiledTileAt(i, j, true);
if (tiled.gid != 0) {
tiled.node.group = "wall";
let body = tiled.node.addComponent(cc.RigidBody);
body.type = cc.RigidBodyType.Static;
let collider = tiled.node.addComponent(cc.PhysicsBoxCollider);
collider.offset = cc.v2(tiledSize.width / 2, tiledSize.height / 2);
collider.size = tiledSize;
collider.apply();
}
}
}
},
界面:
分組設置:
(注意:地圖的基準點,需要設置到左下角!)
最終效果:
(附:開啓碰撞檢測系統以及調試模式的代碼)
cc.Class({
extends: cc.Component,
properties: {
// foo: {
// default: null, // The default value will be used only when the component attaching
// to a node for the first time
// url: cc.Texture2D, // optional, default is typeof default
// serializable: true, // optional, default is true
// visible: true, // optional, default is true
// displayName: 'Foo', // optional
// readonly: false, // optional, default is false
// },
// ...
is_debug: false, // 是否顯示調試信息;
// 重力加速度是一個向量, 有方向的,2D, Vec重力加速度的大小;
gravity: cc.p(0, -320), // 系統默認的
},
// use this for initialization
onLoad: function () {
// 遊戲引擎的總控制
// cc.Director, cc.director 區別呢?
// 大寫的cc.Director是一個類, 小寫cc.direcotr全局的實例
cc.director.getPhysicsManager().enabled = true; // 開啓了物理引擎
cc.director.getCollisionManager().enabled = true; // 開啓了碰撞檢測系統
// 獨立的形狀,打開一個調試區域,遊戲圖像的,邏輯區域;
// 開始調試模式:
if (this.is_debug) { // 開啓調試信息
var Bits = cc.PhysicsManager.DrawBits; // 這個是我們要顯示的類型
cc.director.getPhysicsManager().debugDrawFlags = Bits.e_jointBit | Bits.e_shapeBit;
//碰撞檢測
cc.director.getCollisionManager().enabledDebugDraw = true;
cc.director.getCollisionManager().enabledDrawBoundingBox = true;
}
else { // 關閉調試信息
cc.director.getPhysicsManager().debugDrawFlags = 0;
}
// 重力加速度的配置
cc.director.getPhysicsManager().gravity = this.gravity;
},
// called every frame, uncomment this function to activate update callback
// update: function (dt) {
// },
});