ワームのように、破壊可能な2Dランドスケープを構築するにはどのような手順が必要ですか?理想的には、このプロセスを可能な限り効率的にする方法は何ですか?
ワームのように、破壊可能な2Dランドスケープを構築するにはどのような手順が必要ですか?理想的には、このプロセスを可能な限り効率的にする方法は何ですか?
回答:
ワームのランドスケープが正確にどのように実装されたかはわかりませんが、ランドスケープにビットマップを使用したことは確かです(少なくともシリーズの古いゲームでは)。
非常に基本的なアプローチは、黒いピクセルが空気を表し、白いピクセルが地面を表すビットマップ画像(B / W)です。ピクセル操作を使用して、風景の破壊を簡単に行うことができます。そのため、ロケットが地面に当たった場合はradius = blastRadius
、衝突点に黒い円を描きます。
その後、そのビットマップを使用してワールド(またはその一部)をレンダリングできます。パフォーマンスを向上させるには、「世界」の一部のみを更新/レンダリングできるように実装することをお勧めします。例えば。風景の一部がロケットで破壊された場合は、全世界ではなく、影響を受ける地域を再レンダリングするだけです。
「コリジョンマップ」としての白黒画像の代わりに、24ビット画像を使用して、ピクセルごとに表面法線(x、y)を保存する2つのチャネルと実際の「コリジョン-地図"。手元に表面法線があると、跳ねる手rena弾を計算したり、キャラクターが特定の方向に移動できるかどうかを判断したりするのに非常に役立ちます。
私の頭の上の1つの可能性:
破壊可能な「土地」のアウトラインを保存するために、ベクターグラフィックスパス表現を使用します。破壊イベントが発生すると(手g弾が鳴るなど)、円で表される爆風領域はブール減算操作によって土地の経路から削除されます。結果のパスは、地面の衝突を検出するための新しい「土地」を表し、場合によっては土地を描画するためのマスクも表します。
破壊可能な地形を処理するために建設的なソリッドジオメトリを使用した概念実証を作成しました。GLU Tessellatorを使用してブール演算を実行しました。ドキュメントには、の検索方法を説明し、「CSGは、ルールを巻き取るための使用します」。
テッセレータの三角形の出力を静的ポリゴンとしてBox2Dに送りました。PoCは非常にうまく機能しました。地形を任意にリアルタイムで減算および追加することができ、地形はBox2Dで適切に動作し続けました。唯一の問題は、GLUテッセレータがBox2Dが好ましくない退化した三角形を生成できることでした。そのため、それらを手動でフィルタリングする必要がありました。
PoCの次のステップ(私はこれまで行ったことはありませんでした)は、ブーストグラフライブラリのSCCアルゴリズムを使用して、地形の一部が切断されたことを検出しました(山の頂上を切り取りました)。切断された地形はまだ破壊可能ですが、三角形が形状として付加された動的(非静的)Box2Dボディで表されます。設計はうまくいきましたが、ブーストのドキュメントを掘り始めたら興味を失いました。いつか焦土/ワームのゲームを作るとき、私はそのアイデアを再検討することを「計画」します。
上記の答えはすべて、ワームのように最も単純なケースの実装について述べています。つまり、影響のある領域が破壊され、他のすべてが影響を受けない場合です。あなたの風景が最終的に2つに分割されるかもしれないと考えましたか?たとえば、山があり、プレイヤーはロケットランチャーで山の底を切ります。さて、山は落ちてはいけませんか?また、風景が少し弾力性があるのは自然です。ワームの時代(少なくとも私が覚えている限り、私はワームを長年プレイしていませんでした)、コンピューターはそれを正しく実行できるだけの強度ではありませんでした。しかし、彼らは今です。
もちろん、それはプロジェクトの野心に完全に依存しています。しかし、本当に素晴らしいものにしたい場合は、おそらく物理エンジンとしてBox2Dを試してみてください。それでできることはたくさんあります。
bummzackが言ったように、ビットマップ。1ビットのOHPフィルムを使用することも、サポートが必要ない場合は、ゲームで使用することのない恐ろしいピンク色を使用することもできます。
ピクセルの色を確認するだけで、影響点を計算できます。衝撃が発生すると、ビットマップの色を変更(または削除)します。
爆風半径に関しては、私の最初の目的地はブレゼンハムの円アルゴリズムであり、非常に高速で効率的です。私は最初に正方形のようなものでラフ削除を行い、エッジを取得するために円を丸くします。