Espero que este C # esté bien para ti, mi C ++ está muy oxidado:
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
}
Puede agregar información específica del muro a la clase Muro, información específica del mosaico a la clase Mosaico y refinar más las condiciones en el método "CanGo". Por ejemplo, cuando una pared es en realidad una puerta cerrada, por ejemplo, una clase de puerta.
Para dibujar esto, comenzaría con un mosaico arbitrario, digamos el mosaico en el medio de la posición actual de la cámara. Luego, muévase hacia y a la izquierda de la cámara de acuerdo con el tamaño de los mosaicos. Luego, haga un recorrido transversal de los nodos IMapFeature, dibujando cada muro / mosaico en el orden encontrado.
A * funcionará en esta estructura, aunque obviamente necesitaría algunas modificaciones para manejar algo como puertas cerradas.
Si quisiera, también podría mantener un índice espacial de los mosaicos, que incluiría implícitamente los muros, para descubrir qué mosaicos estaban dentro de los límites de la cámara.
Todavía solo necesitaría elegir un mosaico inicial y una distancia para recorrer según el tamaño del mosaico.