需求:
在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) {
// },
});

本文介绍了如何在cocosCreator项目中动态识别TiledMap图层并设置碰撞分组,以实现无需手动修改碰撞区域的效果。通过提供代码示例,展示了设置过程,并强调了地图基准点需设为左下角,以及开启碰撞检测和调试模式的方法。
2813





