2Dの破壊可能なランドスケープの実装(ワームなど)


76

ワームのように、破壊可能な2Dランドスケープを構築するにはどのような手順が必要ですか?理想的には、このプロセスを可能な限り効率的にする方法は何ですか?


7
素晴らしい質問です。ワームには2つの課題があります。破壊性と、奇妙な角度での動きです。
ashes999

ここで何度も質問されていると思う
ヴィシュヌ

2
Vish、関連リンクはそれを示唆していないようです。
共産主義者ダック

3
Hedgewarsでどのように実行されているかを確認できます。これは、オープンソースのWormsクローンです。
GvS

答えとしては十分ではありませんが、Clonkもチェックしてみてください。これはドイツの開発者による古い2Dゲームであり、特定のピクセルに至るまで破壊可能な風景もありました。開発中ではありませんが、ソースコードは上記のリンクから入手できます。オープンソースの後継者であるOpenClonkもありますが、ビデオからはピクセル単位の完全な破壊から遠ざかり、破壊可能なブロックの種類でテラリア風の方向に進んだようです。
クリスチャン

回答:


47

ワームのランドスケープが正確にどのように実装されたかはわかりませんが、ランドスケープにビットマップを使用したことは確かです(少なくともシリーズの古いゲームでは)。

非常に基本的なアプローチは、黒いピクセルが空気を表し、白いピクセルが地面を表すビットマップ画像(B / W)です。ピクセル操作を使用して、風景の破壊を簡単に行うことができます。そのため、ロケットが地面に当たった場合はradius = blastRadius、衝突点に黒い円を描きます。

その後、そのビットマップを使用してワールド(またはその一部)をレンダリングできます。パフォーマンスを向上させるには、「世界」の一部のみを更新/レンダリングできるように実装することをお勧めします。例えば。風景の一部がロケットで破壊された場合は、全世界ではなく、影響を受ける地域を再レンダリングするだけです。

「コリジョンマップ」としての白黒画像の代わりに、24ビット画像を使用して、ピクセルごとに表面法線(x、y)を保存する2つのチャネルと実際の「コリジョン-地図"。手元に表面法線があると、跳ねる手rena弾を計算したり、キャラクターが特定の方向に移動できるかどうかを判断したりするのに非常に役立ちます。


3
追加の情報を保存することは衝突マップであり、素晴らしいアイデアです。
-deft_code

6

私の頭の上の1つの可能性:

破壊可能な「土地」のアウトラインを保存するために、ベクターグラフィックスパス表現を使用します。破壊イベントが発生すると(手g弾が鳴るなど)、円で表される爆風領域はブール減算操作によって土地の経路から削除されます。結果のパスは、地面の衝突を検出するための新しい「土地」を表し、場合によっては土地を描画するためのマスクも表します。


2
それがHedgewarsのやり方だと思います。@ビル、あなたはそれを見ることができます。なぜならオープンソースだからです。
ガストン

2
@GastónHedgewarsのマップはすべて画像(PNG)です。私はそれらがベクターグラフィックスに変換されているとは思わない。また、衝突検出や形状の減算などの場合、ベクターグラフィックス(スプライン、ベジェなど)を使用するとCPUの負荷が大きくなります。ただし、ソースを確認するのは良い考えです(ただし、コーディングスタイルはやや悪い:))
bummzack

4
このような計算幾何学は非常に複雑で、非常に高速になります!
アダムハート

グーグル「box2d destructible terrain」では、いくつかの実行可能なベクターデモが提供されるようになりました。
Ciro Santilli新疆改造中心法轮功六四事件

6

建設的なソリッドジオメトリを使用する

破壊可能な地形を処理するために建設的なソリッドジオメトリを使用した概念実証を作成しました。GLU Tessellatorを使用してブール演算を実行しました。ドキュメントには、の検索方法を説明し、「CSGは、ルールを巻き取るための使用します」

テッセレータの三角形の出力を静的ポリゴンとしてBox2Dに送りました。PoCは非常にうまく機能しました。地形を任意にリアルタイムで減算および追加することができ、地形はBox2Dで適切に動作し続けました。唯一の問題は、GLUテッセレータがBox2Dが好ましくない退化した三角形を生成できることでした。そのため、それらを手動でフィルタリングする必要がありました。

PoCの次のステップ(私はこれまで行ったことはありませんでした)は、ブーストグラフライブラリのSCCアルゴリズムを使用して、地形の一部が切断されたことを検出しました(山の頂上を切り取りました)。切断された地形はまだ破壊可能ですが、三角形が形状として付加された動的(非静的)Box2Dボディで表されます。設計はうまくいきましたが、ブーストのドキュメントを掘り始めたら興味を失いました。いつか焦土/ワームのゲームを作るとき、私はそのアイデアを再検討することを「計画」します。


5

上記の答えはすべて、ワームのように最も単純なケースの実装について述べています。つまり、影響のある領域が破壊され、他のすべてが影響を受けない場合です。あなたの風景が最終的に2つに分割されるかもしれないと考えましたか?たとえば、山があり、プレイヤーはロケットランチャーで山の底を切ります。さて、山は落ちてはいけませんか?また、風景が少し弾力性があるのは自然です。ワームの時代(少なくとも私が覚えている限り、私はワームを長年プレイしていませんでした)、コンピューターはそれを正しく実行できるだけの強度ではありませんでした。しかし、彼らは今です。

もちろん、それはプロジェクトの野心に完全に依存しています。しかし、本当に素晴らしいものにしたい場合は、おそらく物理エンジンとしてBox2Dを試してみてください。それでできることはたくさんあります。


3
ワームでは、トーチを使用して風景に穴を掘ることができます。そのトンネルがあなたの貧弱なトーチを振るうワームの上でただ崩壊するならば、それほど面白くないでしょう。風景の一部を空中に「浮遊」させることもできました。あなたの提案は、ワームのゲームのようではなく、楽しいアイデアのように聞こえます。
bummzack

それが全体のポイントでした、私はそのゲームプレイのバリエーションについて考えていました。また、景観の一部は破壊されない、および/または空中に永久に浮遊している場合があり、これにより「フローティング」ブロックを作成できます。また、World of Gooで行われた空気のボールのように、一定の力を加え、上向きまたは横向きに引っ張る人もいます。
セプタグラム

私は実際にこのようなゲームを作ることを考えていたので面白いです、それはワームのメカニックにとって楽しいひねりになるでしょう。ビットマップリジッドボディのアイデア自体は間違いなく興味深いトピックになりますが、その複雑さは頭に浮かびます。
ウィリアムカサリン

さて、この場合、ビットマップリジッドボディは使用できませんが、代わりに、弾性的に接続された頂点の三角形のグリッドとしてランドスケープを作成します。グーの世界をプレイしましたか?ない場合は、スクリーンショットを参照してください。vgchartz.com/games/pics/6644424aaa.jpgの doublegames.de/images/screenshots/world-of-goo_1_big.jpg。いいえ、いいえ、いいえ、いいえ、あなたがそれをプレイしなかった場合、絶対に必要です:)ここで、すべての三角形があなたの風景テクスチャの一部を表示し、それらがはるかに小さいことを想像してください。定数とあなたの景観と周りのフィドルのいずれか非常に困難、またはゼリーのようなソフトになります
Septagram

2
物理エンジンを見てください。エンジン全体は、すべてが変形/破壊可能な格子(グーの塔のような)であるという考えに基づいています。
-deft_code

3

bummzackが言ったように、ビットマップ。1ビットのOHPフィルムを使用することも、サポートが必要ない場合は、ゲームで使用することのない恐ろしいピンク色を使用することもできます。

ピクセルの色を確認するだけで、影響点を計算できます。衝撃が発生すると、ビットマップの色を変更(または削除)します。

爆風半径に関しては、私の最初の目的地はブレゼンハムの円アルゴリズムであり、非常に高速で効率的です。私は最初に正方形のようなものでラフ削除を行い、エッジを取得するために円を丸くします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.