歩行/衝突用のサイドスクローラー可変地形高度マップ


7

私はXNAの傾斜したタイルを移動するのをいじっていますが、それは半機能的ですが完全に満足できるものではありません。また、あらかじめ決められた勾配のセットがあると、「有機的」に見える地形が十分に得られない可能性があるとも考えていました。また、スロープごとにいくつかの異なるタイプのタイルを作成する必要があるという問題もあります(私が理解しているように、45度のタイルのみが完全にチェーンされます)。

傾斜したタイルがつながっているエッジのグリッチで問題が発生したため、傾斜したタイルのつながったチェーンをスキャンして新しい大きな三角形として扱うことを考えていました。しかし、これは地形の曲率を制限する問題に戻ります。

したがって、私が今やりたいのは、レベル(またはレベルのセクション)のテレインの単純な画像またはテクスチャを作成し、テレインの単純な高さマップ(各XのYの)を生成することです。プレーヤーのY位置は、X位置に基づいて更新されます。

これを行う簡単な方法(またはこの問題を解決するより良い方法)はありますか?私がこの方法で見ることができる主な問題は、歩くことができる地上の領域がある場合です。多分歩くことができるすべての地上エリアをマッピングする方法はありますか?

私はこの有用なコードを調べてきました:http : //thirdpartyninjas.com/blog/2010/07/28/sloped-platform-collision/ しかし、実際のポイント/ベクトルを生成する方法が必要です。

編集:私は投稿したリンクを使用して傾斜したパスを事前に生成しようとしましたが、今は提案したとおりにピクセルごとの衝突を使用する必要があると確信しています。私はhttp://create.msdn.com/en-US/education/catalog/tutorial/collision_2d_perpixelで例を見ていて、衝突が検出されたときにスプライトを調整する方法を理解しようとしています。デビッドが示唆したように、私はいくつかのセンサーポイント(足、側面、下部中央など)を作成し、これらのポイントが実際に2番目のテクスチャの不透明な部分(単純な傾斜)と衝突するときを簡単に検出できます。衝突に基づいて実際にスプライトの位置を調整する方法のアルゴリズムに問題があります。

スプライトの右足の斜面との衝突を検出したとしましょう。傾斜テクスチャデータをスキャンして、スプライトの足を傾斜の内側に配置しないようにY位置を見つけるにはどうすればよいですか?例で1D配列として格納する方法は少しわかりにくいですが、代わりに2D配列としてデータを格納する必要がありますか?

また、衝突チェックを水平方向と垂直方向に分離するのが最善であると何人かの人々が述べていることに気づきました。なぜそれが正確なのですか?

回答:


12

あなたが説明した問題のために、マップ全体を単一の高さマップに変換しようとするべきではないと思います。マップは、高度マップで表現することができない任意の複雑さを持つことができます。

ただし、タイルのタイプごとに傾斜を固定する必要はありません。タイルのタイプごとにピクセルごとに衝突情報を保存するか、タイルのアルファチャネルからそれを計算し、それを使用して、現在交差しているタイルに基づいて、キャラクターが各時点でどこに立つかを決定できます。1つのタイルの衝突データの例を次に示します。

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

このスキームを使用すると、タイルの衝突マスクを変更するだけで、任意のタイプの傾斜を設定できます。これが、Sonicゲームが当時実装されていた方法です。そのため、次のページ全体を読んで理解を深めることをお勧めします。

http://info.sonicretro.org/SPG:Solid_Tiles#Slopes_And_Curves

次に、キャラクターと環境の間の衝突を処理するために、下の画像のマゼンタのドットなど、キャラクターにいくつかのセンサーまたは衝突ポイントを定義することをお勧めします。

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

たとえば、上部のセンサーを使用して天井との衝突を検出および反応し、中央のセンサーを使用して壁との衝突を検出および反応し、下部のセンサーを使用して床との衝突を検出し、プレーヤーの正しい高さ。中央のセンサーを上下に動かすことで、プレーヤーが登ることができなくなるまでの勾配を制御することができます。

下部センサーを使用してできるもう1つのきちんとしたトリックは、床に衝突しているセンサーの数に応じて、プレーヤーが棚の近くにいることを検出し、下の画像のような別のアニメーションを再生することです。

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


回答をありがとう、私は事前生成されたパスを形成することで別のアプローチを試みましたが、これを今試してみています。上記の投稿を編集しましたが、実際には別の質問なので、別の質問として投稿します。
JiminyCricket
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.