1) コーディングを簡素化する、2) 微調整を容易にし、ゲームをより面白くする、3) ロジックを別のコントローラー (キーボードではなくタッチ イベント) に簡単に「接続」するために、懸念事項を厳密に分離する必要があります。
したがって、ここでは 2 つの個別の懸念事項があります。
* ユーザーが加速している時間を測定します。
* 指定された現在の速度、最小/最大速度、推力時間、現在の加速度 (== 速度の変化) を決定します。
1) の場合はかなり簡単です: 入力が開始された時刻を記録します。現在の期間は現在の時刻 - 開始時刻です。(Date.now() ではなく) ある場合はゲーム時間を使用することをお勧めします。これにより、ゲームが長いタブアウトから再開した後の驚きを避けることができます。
2) については、ゲームの加速/減速を微調整する必要があります。これにより、ゲームがより面白くなります。
最も明白なのは、一定の加速を持たないことです。最大速度の最後の%に到達するのはますます難しくなる必要があります。このようにして、障害物に触れないようにプレーヤーにインセンティブ/報酬を与えます。
プレーヤーがスラストを打っていない場合はどうすればよいですか? わかりません: ゆっくりと減速するか、すぐに通常の速度に戻しますか?
また、ブーストが無限かどうか、そしておそらくクールダウン時間かどうかを決定する必要があります.
したがって、現在の加速度を計算する関数は、推力 (bool)、推力時間 (double)、regularSpeed、maxSpeed、minAcc、maxAcc に依存します。
ここには多くのオプションがありますが、加速度を計算するコードは次のようになります。
if (thrusting) {
// if we're not even at regular speed, max acceleration
if (speed<regularSpeed) { acc = maxAcc; return; }
// if we are above maxSpeed, no acceleration (?? or friction ??)
if (speed>maxSpeed) { acc=0; return; }
// compute current speed ratio
// a figure in [0;1] representing where is the speed in [minSpeed; maxSpeed]
var speedRatio = (currSpeed-regularSpeed)/(maxSpeed-regularSpeed);
// ease this ratio as you like
speedRatio = Math.sqrt(speedRatio);
// compute acceleration : the more speed, the less acceleration
// you might want to put one/some threshold this formula.
acc= minAcc + (1-speedRatio)*(maxAcc-minAcc);
return;
} else {
// do nothing if <= regularSpeed.
if (speed<=regularSpeed) { acc=0 ; return;}
// reduce speed if above regular speed
acc = breakAcc ; // or with friction => acc = - k * currSpeed;
return;
}