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