速いものを遅く見えるようにする(Box2D)


9

私はあなたがトレビュシェットを操作して対戦相手にボールを投げるゲームに取り組んでいます。

「中世の包囲」と呼ばれるゲームのようなものです。トレビュシェットが腕を振っているとき、プレーヤーはボタンを押してボールをリリースする最高の瞬間をつかむ必要があります。その後、ボールは接線角度で飛行します。 ここに画像の説明を入力してください 私の今の問題は、トレビュシェットの腕が速く振れすぎて、プレーヤーが適切な瞬間を捉えられないことです。その間、それはこれほど速くなければなりません、さもなければそれは十分に投げることができません。また、ボールとトレビュシェットアームをつなぐ小さなひもがあり、アームの動きが遅すぎると、アームが動くときにボールがひもにぶら下がっています。

ステップサイズを切り替えることで問題を解決し、腕を振るたびに、ステップサイズを1/60から1/200に変更します。そして、プレーヤーがボールをリリースすると、それは1/60に戻ります。

これは、私のゲームがネットワーキングを備えたマルチプレイヤー用であることを除いて、かなりうまくいきます。したがって、ステップを変更すると問題が発生する可能性があります。

私が考えることができるもう1つの解決策は、ゆっくりスイングできるようにすることですが、プレーヤーがボールをリリースするとき、方向を維持しながら手動でボールに速度を追加します。私はこのソリューションがあまり好きではないので、見た目が偽になり、ストリングを非常に短くしない限り、ボールがストリングにぶら下がっているという問題がまだあります。

これに少し光を当ててください、ありがとう!


編集

みんなの意見をありがとう、私は腕をゆっくり振って問題を解決し、プレーヤーがボールをリリースするとき、ボールの速度と2倍をつかみます。これは、ステップサイズを変更した場合とまったく同じように見えます。やらなければならないことがもう1つあります。腕の揺れが非常に遅いため、ボールが揺れるのではなく、腕の端にぶら下がっているだけです。私は、スイング期間中およびスイング期間中のみ、ボールに重力と等しい力を加えることによってこれを解決しました。それから、それはもはやそこにぶら下がらず、腕と一緒にスイングします。

@MrCrankyの答えは詳細であり、実行可能であるように見えるので、私はそれを受け入れます。:)


多分あなたはトレビュシェットをゆっくり動かすことができるかもしれませんが、ボールに作用する力を増やすことができますか?私は以前にBox2Dを使用したことがないので、これがばかげた考えである場合は申し訳ありません。それ以外の場合は、ボールの質量をいじって、重い速度または軽い速度で低速で許容できる結果が得られるかどうかを確認するだけです。また、実際のトレビュシェットの物理学を検討する価値があるかもしれません。それらはやや遅いように見えるので、おそらくそれらに関するデータ(サイズ、弾薬、力など)は、シミュレートされたものについていくつかのアイデアを与えるかもしれません。
クリスチャン

2
コンピュータの物理学を「本物」のように振る舞わせることは本当に難しい。ほとんどすべての物理エンジンはリジッドボディをシミュレートします。つまり、トレボシェットアームの曲がりなどの効果は、ロープの物理や材料の動作のいずれにも正確に対応していないため、「不正行為」のない正確なシミュレーションは不可能に近いものです。実際に見えるものに近づくプロセスは、次のようになります:微調整、微調整、微調整、チート、微調整、微調整、チート、チート、微調整、やり直し、微調整、微調整、微調整、微調整、チート、微調整、チート、チート、微調整。
LearnCocos2D 2013年

4
子猫の大砲は、この問題への最も現実的なアプローチを採用しています:人間は本当にあるあなたが、人間が手動で制御するためにその動きがゆっくりと十分に投石機の「気持ち」が、起動をさせていただきたいと思いならば、物理的現実とニーズマシンの支援を操作する時と悪いです物理的に可能な速度よりも速い場合は、純粋に芸術的な「発砲」アニメーションを作成し、ユーザーがアニメーションを中断した場所に基づいてボールをスポーンすることができます。
MickLH 2013年

回答:


3

直感的には、答えるために必要なコンテキストの大部分が欠けていると思います。それは、「マルチプレイヤーアスペクトがタイムステップを変更できない理由」です。

ネットワーク接続を介して物理シミュレーションを共有しようとしている場合、まあ、それは通常かなり難しいことです。シミュレーションは非常に簡単に発散します。特に、パケットを失う可能性のあるネットワーク接続では、物事をまとめることが非常に困難です。

質問に対する単純で最も堅牢な答えは、可変タイムステップを使用することです。決定の瞬間に近づくと、通過する実際の1秒ごとに1秒ずつ物理シミュレーションを更新する代わりに、0.5秒または別の適切な数値で更新します。これは統合効果であるため、決定ウィンドウ中に更新レートをより低いレートにスナップするだけで済む可能性がありますが、より低いレートにすばやく下向きに補間することもできます。どちらの方法でも、基本的には物理シミュレーションをスローモーションで再生しています。それは完全に正確に振る舞うべきであり、プレイヤーが彼らの決定を下すことができるのに十分遅いだけです。私はそれを機能させるために物理学を曖昧にする他の手段を考慮しません、それらはおそらく恐ろしく機能し、「正しい」と感じないでしょう。

それで、ネットワーキングの実装に戻ります。これ以上の情報がなければ、2つの選択肢があると思います。最初に、あなたが他のネットワーク化された当事者とロックステップで操作している場合。したがって、一方のプレイヤーが決定を下すためにスローダウンする必要がある場合、両方のプレイヤーを等しくスローダウンします。自分の反応時間を混乱させるので、これはおそらく発砲していないプレイヤーにとって不愉快で奇妙に感じるでしょう。

2つ目は、2つの投石機が互いに発砲することを想像してください。投石機はスローするのに10秒かかり、射撃ウィンドウはT + 5秒から始まります。P1はT + 0秒で発砲サイクルを開始し、T + 5秒でローカル物理シミュレーションを50%遅くします。サイクル全体でプレイするには、15秒かかります。したがって、T + 5sで、P1はP2に10sの起動サイクルをフルスピードで再生するように指示します。したがって、P1はトレビュシェットサイクルに15秒かかり、P2には10秒かかることがわかりますが、両方のプレイヤーはT + 15秒でサイクルの終了を確認します。P1が実際に解放するとき、彼らは概念上のサイクルで解放したときにP2に通知します。したがって、P1がT + 10秒でリリースする場合、実際には10秒の起動サイクルを通じて7.5秒です。その後、P2はT + 12.5秒(サイクルのローカル再生の7.5秒)でリリースを表示できます。両方のプレイヤーのシミュレーションは、サイクルの同じ物理ポイントで発射物を発射する必要があります。

したがって、この2番目のアプローチでは、ロックステップでのシミュレーションは行われません。2つの独立したシミュレーションを実行していますが、代わりにプレーヤー入力を追跡しています。プレーヤーが7.5秒で発射サイクルにリリースしたと両方に通知された場合、両者は発射体がどこに着陸するかについて合意する必要があります。実際には、それは非常に速く分岐する可能性が高く、シミュレーションの状態を何らかの方法で同期する必要があります。


0

すでに存在するものを単にコピー/適応して、同様のケースで機能しないのはなぜですか?

ここに画像の説明を入力してください


0

投石器の動きが速すぎる場合、明白な解決策は時間をスケーリングして遅くすることです。つまり、リアルタイムの1秒ごとに、たとえば物理シミュレーションで0.1秒だけ経過させます。これで、プレーヤーの視点から見ると、ボールの動きは10倍遅くなります。

実際には、同じ効果を実現する別の方法があります。時間をスケーリングする代わりに、時間を含む単位ですべての物理定数をスケーリングするだけです。例えば、重力加速度には速度/時間=距離/時間²の単位があるため、重力がゲームで唯一の定数である場合、100倍に縮小すると、10倍に時間を遅くするのと同じ効果が得られます。 。

もちろん、物理モデルに時間の単位(または速度=距離/時間、または加速度=距離/時間²など)を持つ他の定数が含まれている場合、軌道を同じに保つには、これらもスケーリングする必要があります。 。

これで実際にどこまで行けるかには限界があることに注意してください。たとえば、時間を100倍に遅くすると、投石機は非常に制御しやすくなりますが、プレイヤーは待って退屈する可能性があります。ボールを発射した後、ゆっくりと浮かぶボール。それが問題である場合は、トレビュシェットの発射中に非常に遅い時間スケーリングを使用するなど、他の回答で提案されているようなより高度なトリックに頼る必要があるかもしれませんが、ボールが発射されるとより速い時間スケールに切り替えます。


ありがとう、でも、おそらく私の編集を見ていません。はい、私はあなたの答えの最後の方法でそれを解決しました
Arch1tect '28
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.