2

当使用 P2JS 物理引擎运行 Phaser 时,我知道可以检测与Phaser.Physics.P2.Body#onBeginContact. 但是有没有办法测试碰撞的冲击力,这样当我的宇宙飞船与小行星相撞时,我就可以对它施加现实程度的损坏?

4

2 回答 2

2

您可以使用如下方式确定冲击的动量Phaser.Physics.P2.Body#onBeginContact

创建您的船并将onBeginContact信号处理程序添加到它的 P2 主体

ship.body.onBeginContact.add(contactHandler);

contactHandler事件将被发送 4 个参数:它所接触的物体、引起接触的物体的形状、接触物体的形状和接触方程数据数组。

function contactHandler(body, shape1, shape2, equation) {

    //get the velocity of asteroid at point of contact
    var v = body.velocity.y;

    //and the asteroid's mass
    var m = body.mass;

    //calculate momentum
    var momentum = m*v;

    //momentum affects ship damage
    ship.damage(momentum);

}

请注意,在此示例中,我只是使用小行星的垂直速度来计算动量。要进行更准确的计算,请同时使用飞船和小行星的速度……如下所示:

var v1 = new Phaser.Point(ship.velocity.x, ship.velocity.y);
var v2 = new Phaser.Point(body.velocity.x, body.velocity.y);

// calculate difference 
var v = Math.abs( v1 - v2 );

这是实际代码:http: //jsfiddle.net/bstevens/a6paycw6/

于 2015-01-27T13:21:29.960 回答
1

好吧,我能想到的最简单的方法就是考虑小行星物体的速度。因此,如果小行星从屏幕顶部降落在船上,并且小行星 y 速度大于 200 会增加更多伤害,那么您将添加 y 速度为 100。我不确定是什么你游戏中的实际数字是,但我认为使用小行星速度的概念仍然存在。

- 编辑 -

假设您有一艘宇宙飞船和一颗小行星并且它们发生了碰撞(与宇宙飞船垂直朝向屏幕底部),现在您采用的方法将根据碰撞的严重程度降低宇宙飞船的健康状况,if 语句看起来像这个:

if(asteroid.body.velocity.y<100)
    spaceship.health-=10;
else if(asteroid.body.velocity.y<200)
    spaceship.health-=20;
else
    spaceship.health-=30;

(另外为了让数字更真实一点,我更改了 y 速度值。我现在意识到 20 的 y 速度实际上很慢,而 100-300 更有意义)

于 2014-07-24T17:47:27.393 回答