之前刚好写过一个画线物理游戏,你可以参考下
var PTM_RATIO = cc.PhysicsManager.PTM_RATIO;
/**
* @class PhysicsLineCollider
* @extends PhysicsCollider
* @uses Collider.Polygon
*/
var PhysicsLineCollider = cc.Class({
//name: 'PhysicsLineCollider',
extends: cc.PhysicsCollider,
mixins: [cc.Collider.Polygon],
properties: {
lineWidth: 5,
},
editor: {
menu: CC_EDITOR && 'i18n:MAIN_MENU.component.physics/Collider/Polygon',
//inspector: CC_EDITOR && 'packages://inspector/inspectors/comps/physics/points-base-collider.js',
requireComponent: cc.RigidBody
},
_createShape: function (scale) {
var shapes = [];
var polys = this.points;
var offset = this.offset;
var polyIdx = 0;
for (var i = 0; i < polys.length - 1; i++) {
var posBegin = polys[i];
var posEnd = polys[i+1];
var linelen = posBegin.sub(posEnd).mag();
var angle = Math.atan2(posEnd.y - posBegin.y,posEnd.x - posBegin.x) - Math.PI / 2;
var midPos = posBegin.add(posEnd).mul(0.5);
var shape = new b2.PolygonShape();
if(posBegin.equals(posEnd)){
cc.error('Failed to create shape, posBegin and posEnd is same!');
continue
}
if (shape) {
shape.SetAsBox(this.lineWidth / 2 / PTM_RATIO * scale.x, linelen / 2 / PTM_RATIO * scale.y, new b2.Vec2(midPos.x / PTM_RATIO * scale.x, midPos.y / PTM_RATIO * scale.y), angle);
shapes.push(shape);
}
}
return shapes;
}
});
module.exports = PhysicsLineCollider;
调用:
let collider = path.node.addComponent(PhysicsLineCollider)
collider.lineWidth = "线的宽度";
collider.points ="线段连接的点的集合,点距离不能太小,太小构成多边形的时候会有问题";