ネットワーク統合のため、独自の物理エンジンを作成する必要がありますか?


11

現在、トップダウンのリアルタイムゾンビシューティングゲームを開発しています。これをJavaでコーディングし、物理エンジンとしてJBox2Dを使用しています。私は今週ネットワークをコーディングしており、現在は物理の同期まで行っています。

私は、サーバーが後でそれを承認する限り、クライアントが自由に移動できる予測クライアント/権限のあるサーバーモデルを使用することを計画しています。これには、クライアントが動きのデータを含むパケットをサーバーに送信し、サーバーが待ち時間を計算し、古い状態から世界を再シミュレーションすることが含まれます。

私の問題は、私の現在の物理エンジンであるJBox2D(基本的にはBox2Dのポート)は、ワールドのロールバックをサポートしておらず、ワールドデータをシリアル化するのがそれほど簡単ではないことです。私には2つの解決策があります。現在の物理エンジンを変更または拡張するか、自分で作成することができます。

自分の物理エンジンを作成する理由-

  • 不要な機能を削除できます。トップダウンゲームでは、衝突のメカニズムと力の処理だけが本当に必要です。重力は関係ありません。
  • 私はコードをよりよく理解でき、ロールバック機能を実装する方が[おそらく]簡単です

JBox2Dを拡張/変更する理由

  • 私自身の物理エンジンを書くことは、かなりの量の仕事になるでしょう、それは面倒かもしれません
  • JBox2Dには幅広いサポートコミュニティがあり、開発者と協力することができます
  • JBox2Dには、衝突検出など、特定の最適化があり、便利です
  • これについては既に行われているようにいくつかの作業が行われますが、コードはほとんど共有されていません

だからあなたの意見は何ですか。これは私の最初のゲームであり、私はプロのゲーム開発者ではありません。誰かがその領域ですでに行われた作業へのリンクを提供できる場合(できればJBox2D / Box2D / Javaを使用)。


また、JBox2Dを使用する場合は、strictfpあらゆる場所で使用する必要があり、パフォーマンスに深刻な影響を与えることに注意してください。そうしないと、サーバーとクライアントでまったく同じ結果が得られない場合があります。代わりに固定小数点を使用することをお勧めします。
sam hocevar

回答:


7

2Dでの衝突検出は非常に単純です。そもそもなぜ物理エンジンを使用する必要があるのか​​わからないのです。そして、すべての操作力はまっすぐ進むか、またはカーブ上にあるので(落下、診断の変更などはありません)個人的には、あなたが選択する必要があるのは私にとっては非常に簡単です。自分で作るのは簡単です。衝突:

2つの長方形で発生する可能性のある3つの可能な衝突を考慮します。

  1. エッジからエッジ:非常に単純です。1つのエッジの軸と別のエッジの軸を取得し、それらが同じスペースを占めるか、それとも十分に近いスペースを占めるかを決定します。
  2. エッジからコーナー:回転するシェイプがある場合、これが最も一般的です。幸い、実装も非常に簡単です。
  3. 隅々まで:これはめったに起こりませんので、実装する価値すらありません。その理由は、2つの事柄が、最後に計算された10進数のエンジンまで、同じ正確な軸で正確に反対方向に移動する必要があるためです。さて、すべてが45度または90度回転する場合、これは(おそらくそうでなくても)

編集:コメントしたように、私はこの問題にあまり詳しくないので、弾丸/発射体の衝突について相談するべきではありません。

2Dスペースで弾丸を扱ったとき、物理エンジンを使用して発射体を投げる(ゼロから作成しなかった)直線と曲線の両方で機能する一種のパスを使用し、標準の衝突を使用しました。

コメントでこれをゼロから構築することについて読んでください。


編集: * 信頼してください *どちらの場合でも、発射体と画面上に表示できる発射体の数により、ゲームエンジンで何らかの推測航法が必要になります。画面上の特定の位置にあるフレームごとに、すべての箇条書きを更新することは絶対に望まないでしょう。しかし、それはゲームをプレイできないほど遅くする素晴らしい方法です:D!次のもののみを更新してください。

  • 発射物が投げられています
  • それが投げられている方向
  • 湾曲しているかどうか
    • もしそうなら、曲線の機能は何ですか
  • それがどのような発射物か(これはグラフィック、エフェクト、ダメージ、すべてを説明します)

エンジン上のデータをサーバー上ではなく、そのデータに応じて更新し、すべての弾丸のパケットデータを送信します。(画面上にたった2つの機関銃でそれを行うことを想像してください!イエス!)


もちろん、実装は比較的簡単ですが、衝突検出の最適化にも興味があります。実装方法がわかりません。
liamzebedee

私が説明した方法は、説明どおりに実行すれば、最適化は実際には必要ありません。必要となる可能性がある唯一の最適化は、チェックを実行する時間と、衝突が実際に更新される頻度です。例:衝突の可能性がある場合にのみ、本当に更新する必要があります。
ジョシュアヘッジ

最後に述べたことをさらに詳しく説明します。たとえば、建物の衝突を確認する必要があるのは、たとえば、最初にキャラクターが動いているときだけです。自分のキャラクターではないユニットが表示されている場合でも、ユニットの衝突をチェックする必要があるだけです。発射体の衝突が存在する場合(その時点で)さえチェックする必要があるだけです。何かが他の何かに触れていたり、近くにあることさえわかっていれば、どのような種類の衝突タイプの検出(エッジからエッジ、コーナーからエッジなど)もスキップできます。それ以外の場合は、全体をスキップします。
Joshua Hedges

私は、衝突サーバ側の処理をしていたときを除き、ここで私は、など複数のプレーヤーのための衝突を検出する必要がある
liamzebedee

4
@MadPumpkin:あなたの自信過剰はあなたの答えにひどく反映されます。あなたは衝突の検出について話していますが、2Dシューターでの適切な弾丸処理の絶対的なコアであるスイープ衝突検出については触れません。また、スイープの場合でも、最初に発生した衝突を判断し、潜在的な競合を解決し、エンティティが削除された場合は解決全体を再度開始する必要があるため、解決は検出とほぼ同じくらい重要です。確かに、それが示唆しているように見える些細な問題ではありません。
sam hocevar
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.