cocosCreator 动态设置tiledMap碰撞区域

需求:

在cocosCreator项目里,动态识别tiledMap的图层,并设置某些图层的碰撞分组。(这样一来,每次改动地图,就不需要重新手动修改碰撞区域,复杂形状的碰撞区域也可以自动设置)

cocosCreator 动态设置tiledMap碰撞区域_第1张图片

代码:

传入需要动态设置的地图节点(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();
                }

            }
        }
    },

界面:

分组设置:

cocosCreator 动态设置tiledMap碰撞区域_第2张图片

cocosCreator 动态设置tiledMap碰撞区域_第3张图片

(注意:地图的基准点,需要设置到左下角!)

最终效果:

cocosCreator 动态设置tiledMap碰撞区域_第4张图片

(附:开启碰撞检测系统以及调试模式的代码)

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)