物理エンジンを明示的に使用する必要のない効果的なアプローチは、更新ループでスプライトの速度と位置を手動でステップすることです。これは本質的にオイラー積分です。
// define your gravity value
#define GRAVITY -0.1
// define a velocity variable in the header of your Game class/CCSprite Subclass (neater)
float velocity_y;
-(void) update: (ccTime) dt
{
// Step the y-velocity by your acceleration value (gravity value in this case)
velocity_y += GRAVITY *dt; // drop the dt if you don't want to use it
// Step the position values and update the sprite position accordingly
sprite.position.y += velocity_y* dt; // same here
}
上記のコード スニペットでは、y 方向に沿ったスプライトの現在の速度を追跡するために、velocity_y 変数を定義しました。init メソッドでこの値を 0 に初期化することを忘れないでください。
次はオイラーの核心です。すべての時間ステップで:
- 加速度 (重力) に dt を掛けて速度を上げ、新しい速度を求めます。
- 新しく計算された速度値に dt を掛けて位置を進め、新しい位置を見つけます。
デルタ時間を使用するかどうかを試すことができます (それを使用することの短所に関する LearnCocos2D の優れたコメントを参照してください)。LearnCocos2d が指摘したように、デルタ時間を乗算すると、オブジェクトの動きがさまざまなフレームレートをより正確に考慮できるようになりますが、システムが中断するリアルタイム ゲーム (新着メール、低バッテリー、広告ポップ) での使用を避けるのが賢明かもしれません。 -out) が発生し、その後、ゲーム シミュレーションが補おうとして前方にジャンプする可能性があります。
したがって、dt を削除する場合は、適切な感覚を維持するために、それに応じて GRAVITY 値を微調整 (スケールダウン) することを忘れないでください。この値はデルタ時間の値 (約 1/60) で乗算されなくなるためです。
追加のヒント: スプライトを動かすインパルスを適用するには (スワイプなどで)、velocity_x (ある場合) とvelocity_y の値を変更することで速度に直接影響を与えることができます。
私は自分のゲームでこのアプローチを使用しましたが、非常にうまく機能します。それが役に立てば幸い。