cocosCreator 動態設置tiledMap碰撞區域

需求:

在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) {

    // },
});

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章