当使用P2JS物理引擎运行相位器时,我知道可以使用Phaser.Physics.P2.Body#onBeginContact检测冲突。但是,有没有一种方法可以测试碰撞的冲击力,这样当我的宇宙飞船与小行星相撞时,我就可以对它施加一个真实的损伤水平?
发布于 2015-01-27 21:21:30
您可以使用Phaser.Physics.P2.Body#onBeginContact确定影响的动量,如下所示:
创建您的ship并将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/
发布于 2014-07-25 01:47:27
我能想到的最简单的方法,就是把小行星物体的速度考虑在内。因此,如果小行星从屏幕的顶部落到飞船上,小行星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速度值。我现在意识到,y速度为20实际上是相当慢的,100-300更有意义。)
https://stackoverflow.com/questions/23587975
复制相似问题