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