1

ゲームにリアルな見た目の重力機能を適用するさまざまなテクニックを試しましたが、今のところ成功していません。Cocos2D で CCSprite に重力を適用するコードを見せたり (共有したり) できる人には、 100 ポイントの報奨金を提供する予定です。

私がこれまで行ってきたことは、醜いまたは非現実的であり、最善のアプローチは何かについてさまざまな場所で尋ねましたが、見栄えの良い重力テクニックをまだ見つけていません.

とにかく、物理エンジンを使用せずに Cocos2D で CCSprite に重力を適用するだけのヒントやアイデア、またはアプローチを提供できる人はいますか?

ありがとう!

4

2 に答える 2

5

物理エンジンを明示的に使用する必要のない効果的なアプローチは、更新ループでスプライトの速度と位置を手動でステップすることです。これは本質的にオイラー積分です。

// 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 に初期化することを忘れないでください。

次はオイラーの核心です。すべての時間ステップで:

  1. 加速度 (重力) に dt を掛けて速度を上げ、新しい速度を求めます。
  2. 新しく計算された速度値に dt を掛けて位置を進め、新しい位置を見つけます。

デルタ時間を使用するかどうかを試すことができます (それを使用することの短所に関する LearnCocos2D の優れたコメントを参照してください)。LearnCocos2d が指摘したように、デルタ時間を乗算すると、オブジェクトの動きがさまざまなフレームレートをより正確に考慮できるようになりますが、システムが中断するリアルタイム ゲーム (新着メール、低バッテリー、広告ポップ) での使用を避けるのが賢明かもしれません。 -out) が発生し、その後、ゲーム シミュレーションが補おうとして前方にジャンプする可能性があります。

したがって、dt を削除する場合は、適切な感覚を維持するために、それに応じて GRAVITY 値を微調整 (スケールダウン) することを忘れないでください。この値はデルタ時間の値 (約 1/60) で乗算されなくなるためです。

追加のヒント: スプライトを動かすインパルスを適用するには (スワイプなどで)、velocity_x (ある場合) とvelocity_y の値を変更することで速度に直接影響を与えることができます。

私は自分のゲームでこのアプローチを使用しましたが、非常にうまく機能します。それが役に立てば幸い。

于 2012-07-14T06:55:45.440 に答える
0

これは些細なことではありません。他の投稿を参照してください。他の人がすでにこの問題を抱えていると確信しています。見てみてください:

または、仲良しの Google をお試しください:

いずれにせよ、ここにいくつかのヒントがあります:

ステップ 1、有効な方向ベクトルを計算します。 ステップ 2、速度を計算します。 ステップ 3、この速度を 2 つの有効な方向に投影します。ステップ 4、2 つの方向に等しく反対の力を発生させ、これを「応答力」と呼びます。

于 2012-07-20T08:39:44.997 に答える