cocos creator box2d


title Map 使用box2d

var sfloors = this.tiledMap.getObjectGroup('Special_Floor').getObjects(); //此處獲取對象層

for (let i = 0, l = sfloors.length; i < l; i++)

{

  let sfloorsgNode = sfloors[i];

  let compoent = this.floor_physics.addComponent(cc.PhysicsPolygonCollider);

  let poitlist = sfloorsgNode.getProperties().points //一個是在這 getProperties 找了很久都沒找到這個points的屬性結果沒在shNode上,而且這個方法也是隱藏得很深 文檔根本沒有???

  compoent.points = [];

  for (var index = 0; index < poitlist.length; index++)

  {

     poitlist[index].y = -poitlist[index].y;//翻轉碰撞體 compoent.points.push(cc.p(poitlist[index]));

  }

  compoent.offset = new cc.p(sfloorsgNode.sgNode.x, sfloorsgNode.sgNode.y);

}

 

 

臨時寫了一個插件,
操作步驟:
1.設置tiledMap節點,選要map文件,編輯出現圖下的層節點
2.選擇層節點,拖LayerCollider.js文件到節點上。
3.在層節點下生成數個靜態剛體節點。

問題:
1.原來是每一個tile生成一個剛體,結果會比較多(如果正好您有特殊需要還行,類似憤怒小鳥的磚),於是改寫了一下,但自己算法懶得太想,就按橫行連接的生成一個剛體塊,減少了不少剛體。當然如果有能力,也可改寫成多邊形剛體collider,再計算相連區域生成剛體,我這里只是用了boxCollider
2.可能會反復生成,暫時沒想好怎么弄,所以生成完了就把script從節點中刪掉就好。
3.本來想做成標准插件,但界面及操作沒有文檔,類似ui-node。以及如果反向操作編輯器中的節點,都不太明白,所以按類似hsl_shader的寫法,因為現在文檔比較缺,也不太會。
4.未考慮方向
5.未考慮圖像原因形成的斜線,我這里暫時都是大方塊。反正是設計階段生成的,自己再改吧。
6.考慮地圖中不同效果放到不同層中,所以在層上生成,也可以考慮不同層不同的生成策略。不會弄界面,再說。

LayerCollider.js
/**
* create by shishi11 20170524
@param {[type]} ) { let tlayer [description]
@return {[type]} [description]
*/
var LayerCollider = cc.Class({
extends: cc.Component,
editor: {
requireComponent: cc.TMXLayer,
executeInEditMode: true
},
onEnable: function() {
let tlayer = this.node.getComponent(cc.TiledLayer);
cc.log(tlayer.getLayerSize());
cc.log(tlayer.getMapTileSize().width + ' ,' + tlayer.getMapTileSize().height);
cc.log(tlayer.getTiles().length);
let tileSize = tlayer.getMapTileSize();
let layerSize = tlayer.getLayerSize();
let tiles = tlayer.getTiles();
for (let i = 0; i < tiles.length; i++) {
let ty = parseInt(i / layerSize.width);
let tx = i % layerSize.width;
if (tiles[i] !== 0) {
//說明此處有圖片 
let cnode = new cc.Node();
cnode.name = tlayer.getLayerName() + "(" + tx + "," + ty + ")";
cc.log(cnode.name);
cnode.anchorX = 0;
cnode.anchorY = 0;
let cRB = cnode.addComponent(cc.RigidBody);
cRB.type = cc.RigidBodyType.Static; //全是靜態的
let pCollider = cnode.addComponent(cc.PhysicsBoxCollider);
pCollider.offset = new cc.Vec2(tileSize.width / 2, tileSize.height / 2);
pCollider.size = new cc.Size(tileSize.width, tileSize.height);
cnode.width = tileSize.width;
cnode.height = tileSize.height;
cnode.setPosition(tileSize.width * tx, (layerSize.height - 1) * tileSize.height - tileSize.height * ty);
this.node.addChild(cnode);
//用來合並橫向連續tile
for (let n = tx + 1; n < layerSize.width - tx; n++) {
if (tiles[i + 1] != 0) {
cnode.width = cnode.width + tileSize.width;
pCollider.size.width = pCollider.size.width + tileSize.width;
pCollider.offset.x = pCollider.size.width / 2;
i++;
if (i + 1 >= tiles.length) break;
} else {
break;
}
}
}
}
},
});


免責聲明!

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



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