Egret社区

p2的碰撞检测到底如何做呢?

2015-11-10 11:30
691819
1银子
如题。 求大神,搞了一天了,都还是没有找到方法。box2d是有个接口,实现其,就能完成,p2的碰撞检测机制是什么呢?

最佳答案

查看完整内容

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; ...
分享到 :
5 人收藏

19 个回复

倒序浏览
AirMonkeyStudio  圆转纯熟 | 2015-11-10 11:30:11
本帖最后由 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);
        }
    }

点评

牛人  发表于 2016-3-24 10:17
赞!  发表于 2016-1-18 17:41
参与人数 2威望 +1 银子 +5 贡献 +1 收起 理由
city + 1 + 1 牛!很能钻研!
cast099 + 5 赞一个!

查看全部评分

city  初窥堂奥 | 2015-11-10 16:30:18
本帖最后由 city 于 2015-11-10 16:36 编辑

使用p2,你不需要了解碰撞机制,你只需要了解该怎么使用其API,以及设置正确的刚体类型。请先在EDN的Egret 扩展库中阅读关于物理引擎的教程,确保你已经理解该教程的知识。
然后,有用法问题请表述具体的细节,以便于我们提供准确的帮助。
zhuguojun  登堂入室 | 2015-11-10 16:56:04
city 发表于 2015-11-10 16:30
使用p2,你不需要了解碰撞机制,你只需要了解该怎么使用其API,以及设置正确的刚体类型。请先在EDN的Egret  ...

我的应用场景是:在某两个刚体接触时,捕捉此时的事件,然后对两个刚体的display进行变型等相关操作
city  初窥堂奥 | 2015-11-10 17:04:42
zhuguojun 发表于 2015-11-10 16:56
我的应用场景是:在某两个刚体接触时,捕捉此时的事件,然后对两个刚体的display进行变型等相关操作 ...

物理引擎对刚体的运动轨迹是自动计算的,你只需要设置好正确的类型及环境参数。 请具体说下,你这个变型是怎么回事
zhuguojun  登堂入室 | 2015-11-10 17:36:04
city 发表于 2015-11-10 17:04
物理引擎对刚体的运动轨迹是自动计算的,你只需要设置好正确的类型及环境参数。 请具体说下,你这个变型 ...

当我检测到两个刚体接触到时,我想让两个刚体消失,同时在接触点播放各自的爆炸动画。
还有一种跳跳游戏:当主角接触到踏板时,就会产生向上的速度,也是需要捕捉这个接触事件的
我知道可以不通过刚体去检测碰撞,但是那样精度就不够
太感谢你的解答了!
city  初窥堂奥 | 2015-11-10 18:30:39
zhuguojun 发表于 2015-11-10 17:36
当我检测到两个刚体接触到时,我想让两个刚体消失,同时在接触点播放各自的爆炸动画。
还有一种跳跳游戏 ...

嗯,事件这部分之前没用过,我找时间再帮你看吧,你自己也研究一下吧
zhuguojun  登堂入室 | 2015-11-11 09:27:53
city 发表于 2015-11-10 18:30
嗯,事件这部分之前没用过,我找时间再帮你看吧,你自己也研究一下吧

好的,谢谢!
zhuguojun  登堂入室 | 2015-11-12 10:37:11
AirMonkeyStudio 发表于 2015-11-11 11:03
hi
可以对p2.World监听相关事件捕获碰撞

太感谢你了!!!!!
gamedaybyday  初窥堂奥 | 2015-11-17 23:24:34
AirMonkeyStudio 发表于 2015-11-10 11:30
hi
可以对p2.World监听相关事件捕获碰撞

朋友,你是怎么学p2的。这个没资料真实难学啊
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|京网文[2014]0791-191号|京ICP证150115号|Egret社区 ( 京ICP备14025619号 )

Powered by Discuz! X3.4 © 2001-2019 Comsenz Inc.

返回顶部