0

シンプルなゲーム (cocos2d) では、小さな物理エンジンを作成してスプライトを動かし、プラットフォームなどでジャンプしたり立ったりできるようにしました。

位置 (垂直方向の動き) を更新するには、各更新で基本的な運動方程式を使用します。

  • 位置 = oldPosition + 速度(デルタ) +1/2(重力)(デルタ)^2
  • 速度 = 古い速度 + (重力)(デルタ)

どういうわけか、ゲームはあまり生き生きしているようには見えません。重力をいくら大きくしても、弧の頂上付近では長い時間がかかるようです。スプライトを同じ高さでジャンプさせ、減速と加速をより速くしたいが、それでも以前と同じ高さでジャンプさせたい場合、どうすればよいですか? それが理にかなっていることを願っています。

4

2 に答える 2

1

ここでの問題は、あなたがあなたの物理学を間違えたことです!しかし、それは簡単な修正なので、それは問題ありません。

スプライトの位置でupdateメソッドを呼び出すときは、最初に加速を設定する必要があります。このゲームでは重力が一定であると思いますので、一度設定するだけで済みます。(-9.81、または同様のもの。)

次に、y方向のキャラクターの速度をvelocity = old_velocity + Acceleration*timeで更新します。

これを行った後、同様の方法で位置を更新します:位置=old_position+速度*時間。

位置を更新するために使用している方程式は、デルタが合計経過時間であり、タイムステップではない場合にのみ有効です。(私は、デルタが時間ステップであると想定しました。これは、物理ゲームが通常プログラムされる方法だからです。)

これがお役に立てば幸いです。詳細を知りたい場合は、suvat方程式を確認してください。初期速度と一定の加速度がわかっている場合は、最終的な位置を計算できることがわかります。ゲームの速度は、ジャンプや衝突を行うと変化します。したがって、それが現実的でないことは驚くことではありません。他にご不明な点がございましたら、コメントしていただければ、さらにサポートさせていただきます。

編集:OpenGLを使用して描画されたいくつかのボックスを使用して、ここで行ったことを正確に再プログラムしました。位置を更新する方法が機能していないようです。dtまたはタイムステップが1.0dの場合にのみ、ボックスが正しく落下するように見えますが、その理由はわかりません。その後、何かと衝突すると、バウンドするのではなく、すべて一緒に停止します。正確な理由はわかりません。

ただし、画面上には、説明した物理演算を使用する別のボックスもあります v = u + a*ts = s_last + v*t ボックスは期待どおりに落下し、正しく跳ね返ります。単純化により、バウンス時にエネルギーが失われます。

于 2012-12-29T21:27:56.453 に答える
0

よりリアルな効果を得るために、cocos2d-iphoneゲームでBox2dまたはChipmunk物理エンジンを試してみることをお勧めします。さらに、それらは比較的簡単に実装できます。

独自の物理システムを作成する必要はありません-テクノロジーを機能させることを忘れないでください;D

于 2012-12-20T01:03:30.507 に答える