本帖最后由 AirMonkeyStudio 于 2015-11-20 23:50 编辑
hi
可以对p2.World监听相关事件捕获碰撞
world.on("beginContact",this.onBeginContact,this);
world.on("endContact",this.onEndContact,this);
//如下对代码可以计算出来碰撞位置(测试对状况是playerBody.type=dynamic,障碍Body.type=dynamic,他们之间碰撞位置可以获得,其他情况没测试)
private onBeginContact(event):void{
var bodyA: p2.Body = event.bodyA;
var bodyB: p2.Body = event.bodyB;
if(bodyA.id == this.playerBodyId || bodyB.id == this.playerBodyId){
console.log("on target sensor BeginContact bodyA.id:"+bodyA.id+",bodyB.id:"+bodyB.id);
var hittedBody: p2.Body;//与playerBodyId碰撞的刚体
if(bodyA.id == this.playerBodyId) {
hittedBody = bodyB;
} else if(bodyB.id == this.playerBodyId) {
hittedBody = bodyA;
}
console.log("hittedBody.id:" + hittedBody.id);
if(hittedBody.shapes[0].sensor == true) {//碰到了传感器,这里不需要计算爆炸位置,只作为传感器就好
//碰撞到了传感器,不是普通dynamic刚体
console.log("碰撞到了传感器,不是普通dynamic刚体,id:"+hittedBody.id);
}else{
this.getPlayerContactPos(); //这里是计算和其他Body.type=dynamic的刚体碰撞的位置
}
}
}
//获得player碰撞位置
private getPlayerContactPos():void{
for(var i = 0;i < this.scene.world.narrowphase.contactEquations.length;i++) {
var c: p2.ContactEquation = this.scene.world.narrowphase.contactEquations;
if(c.bodyA.id == this.playerBodyId || c.bodyB.id == this.playerBodyId) {
var ptA: Array<number> = c.contactPointA;//pointA delta向量,上次使用contactPointB貌似没用对,用contactPointA就对了
var contactPos: Array<number> = [c.bodyA.position[0] + ptA[0],c.bodyA.position[1] + ptA[1]];//在BodyA位置加上delta向量,这个就是碰撞发生的p2位置
var dispX: number = jbP2.P2Space.convertP2ValueToEgret(contactPos[0]);//转换到egret世界的位置
var dispY: number = jbP2.P2Space.convertP2Y_To_EgretY(contactPos[1]);//转换到egret世界的位置
//drawing the point to the graphics
this.contactDrawing.graphics.lineStyle(1,0);
this.contactDrawing.graphics.drawCircle(dispX,dispY,15);
this.contactDrawing.graphics.endFill();
}
}
}
private onEndContact(event):void{
var bodyA: p2.Body = event.bodyA;
var bodyB: p2.Body = event.bodyB;
if(bodyA.id == 5 || bodyB.id == 5){
console.log("on target sensor EndContact bodyA.id:"+bodyA.id+",bodyB.id:"+bodyB.id);
}
} |