モンスターがプラットフォームを歩き回らないようにするにはどうすればよいですか?


8

それについてのチュートリアルを見つけるのはかなり簡単なはずだと思うので、私を夢中にさせている質問があります。現在、XNAとFarseerを使用して、シンプルなプラットフォーマーゲームを作成しています。もうすぐ完成ですが、モンスターをもっとスマートにしてほしいです。この場合、私は自分のモンスターが崖から落ちてほしくないことを意味します。

簡単に言うと、モンスターが方向を変えるタイミングを決定するために、「モンスター」の前の領域をチェックするものが欲しいのです。皆さんは私を正しい方向に向けることができますか?

私は何を使うことになっていますか?これをチェックするための簡単な解決策または簡単なアルゴリズムが存在するはずです、いいえ?

回答:


17

私はこれまでXNAを使用したことがなく、私のソリューションよりも優れたソリューションになると思います。しかし、うまくいくかもしれない回避策は、見えないオブジェクトを崖の両極端に置くことができ、モンスターがそれらのオブジェクトとの衝突をチェックできることです。衝突した場合、方向を変えます。


2
シンプルでエレガント、+ 1
バルモンド

それは良い解決策です。Farseerは「センサー」をサポートしているため、崖で使用します。
bummzack、2011年

私はあなたの答えが本当に好きなので、それを主張したくありません。彼はまた、(移動方向に応じて)左下/右のタイルを使用することもできます-これはより「明白な」解決策です。
ジョナサンディキンソン

1
このようなソリューションの主な問題は、すべての崖に障害を配置する必要があることです。ゲームの数が少ない場合は問題ないかもしれませんが、そうでない場合は時間がかかり、崖が見逃される可能性があります。
AlbeyAmakiir、2011年

4
@AlbeyAmakiirまあ、これを交換して、プレーヤーの前の下部にセンサーを配置することもできます(センサーはプレーヤーと一緒に移動します)。このセンサーが衝突の記録を停止するとすぐに、あなたは崖にいます。
bummzack、2011年

7

それを実装する素朴な方法の1つは、レイキャスティングを使用することです。

モンスターが少しの時間(おそらくフレーム)のどこにいるかを計算します。その位置から(または、より堅牢にしたい場合は、その位置+/-敵の境界領域)レイキャストダウンします。適切な範囲内で何かに当たらない場合(レイキャストを垂直に開始する場所、キャラクターの高さ、目的の「ステップサイズ」などに応じて)、キャラクターがなりたい場所に崖があると判断できます。そして方向を適切に変更することを決定します。


1

私のAIを使用して、下にプラットフォームがあるかどうかを確認し、その移動方向を調べます(タイルシステムを使用せず、ただのグルービーコリジョンシステム)。ない場合、またはしっかりしたブロックにぶつかった場合、混乱した外観になり、向きを変えます。

このようにして、動的マップを持つことができますが、有効な(用語は大まかに使用されます)AIを使用できます。


0

私はあなたがタイルマップを使用しているのではないかと思います、その場合の解決策はタイルインデックスに基づいてそれを行うことです。次の公式を使用して、モンスターが現在どのタイル上にあるかを見つける必要があります。

int tileX = (int)(monster.Position.X / TILE_WIDTH);
int tileY = (int(monster.Position.Y / TILE_HEIGHT);

これらがわかったら、(前のブロックをチェックするために)どのX方向に行くかを見つける必要があります。

int direction = 0;
if (monster.Velocity > 0f)
    direction = 1;
if (monster.Velocity < 0f)
    direction = -1;

これで、操作する正規化されたX方向ができました。

次に、周りのブロックをチェックして、方向を変える必要があるかどうかを確認します。

if (GetTileCollision(tileX + direction, tileY) == TileCollision.Impassable || // going into a wall
    GetTileCollision(tileX + direction, tileY) == TIleCollision.Passable &&
    GetTileCollision(tileX + direction, tileY + 1) == TileCollision.Passable)) // we're going to fall down a block
    ChangeDirection(); // we change direction

あなたは一般的な考えを得ます。TileCollision.Impassableタイルインデックスがマップの外にある場合は、必ず(または何でも)返して、プログラムが無効なインデックスでクラッシュするのを防ぎ、モンスターがマップの外に出るのを防ぎます。

タイルの扱い方に本当に依存すると思いますが、これが私に有効な解決策です。

http://www.sgtconker.com/のチュートリアルに基づいています(ただし、これを書いている間、Webサイトはダウンしています)。


0

別のレイヤー上にあるプラットフォームの外側にボックスを設定し、モンスターがそれをチェックするようにして、落ちないようにしますが、プレーヤーはまだ落ちます。


これはギルソンの答えと同じだと思います。
Richard Marskell-Drackir、2012年

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