P2JS 物理エンジンで Phaser を実行すると、 との衝突を検出できることがわかっていPhaser.Physics.P2.Body#onBeginContact
ます。しかし、小惑星と衝突したときに宇宙船に現実的なレベルの損傷を与えることができるように、衝突の衝撃力をテストする方法はありますか?
2 に答える
Phaser.Physics.P2.Body#onBeginContact
次のように使用して、衝撃の勢いを判断できます。
船を作成し、onBeginContact
信号ハンドラーをその P2 本体に追加します
ship.body.onBeginContact.add(contactHandler);
イベントには 4 つのcontactHandler
パラメータが送信されます: 接触しているボディ、接触を引き起こしたこのボディの形状、接触ボディの形状、および接触式データ配列。
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/
頭のてっぺんから考えることができる最も簡単な方法は、小惑星の物体の速度を考慮に入れることです。したがって、小惑星が画面の上部から船に降りてきて、小惑星の 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 はもう少し理にかなっていることに気付きました)