うまくいけば、このC#は大丈夫です-私のc ++は非常に錆びています:
abstract class MapFeature
{
public void Draw();
public bool IsWall();
}
enum Direction
{
North, South, East, West
}
class Wall : MapFeature
{
public bool IsWall() { return true; }
public Tile Front, Back; // Tiles on either side of the wall, otherwise null.
#region Implementation of MapFeature
public void Draw()
{
// Wall specific drawing code...
}
#endregion
}
class Tile : MapFeature
{
public bool IsWall() { return false; }
public MapFeature North, South, East, West; // Tiles/Walls on each side, otherwise null
public bool CanGo(Direction direction)
{
switch (direction)
{
case Direction.North:
return !North.IsWall();
case Direction.South:
return !South.IsWall();
case Direction.East:
return !East.IsWall();
case Direction.West:
return !West.IsWall();
default:
throw new ArgumentOutOfRangeException("direction");
}
}
#region Implementation of MapFeature
public void Draw()
{
// Tile specific drawing code...
}
#endregion
}
壁固有の情報をWallクラスに、タイル固有の情報をTileクラスに追加し、「CanGo」メソッドで条件をさらに絞り込むことができます。たとえば、壁が実際にロックされたドアである場合-たとえば、ドアクラス。
これを描画するには、任意のタイルから始めます。たとえば、現在のカメラ位置の中央にあるタイルと言います。次に、タイルのサイズに応じて、カメラに向かって左に移動します。次に、IMapFeatureノードの幅優先トラバーサルを行い、各壁/タイルを出現順に描画します。
A *はこの構造で機能しますが、ロックされたドアのようなものを処理するには、明らかにいくつかの変更が必要になります。
必要に応じて、カメラの境界内にあるタイルを見つけるために、暗黙的に壁を含むタイルの空間インデックスを維持することもできます。
それでも、開始タイルと、タイルサイズに基づいてトラバースする距離を選択するだけで済みます。