Semoga C # ini cocok untuk Anda - c ++ saya sangat berkarat:
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
}
Anda dapat menambahkan informasi khusus dinding ke kelas Dinding, informasi khusus ubin ke kelas Tile, dan selanjutnya memperbaiki kondisi dalam metode "CanGo". Misalnya, ketika dinding sebenarnya adalah pintu yang terkunci - katakanlah, kelas Pintu.
Untuk menggambar ini, Anda akan mulai dengan ubin sewenang-wenang - katakan ubin di tengah posisi kamera saat ini. Kemudian bergerak ke arah dan ke kiri kamera sesuai dengan ukuran ubin. Kemudian lakukan lintasan pertama dari node IMapFeature, gambar setiap dinding / ubin sesuai urutan.
A * akan bekerja pada struktur ini, meskipun Anda jelas membutuhkan beberapa modifikasi untuk menangani sesuatu seperti pintu yang terkunci.
Jika Anda mau, Anda juga bisa mempertahankan indeks spasial ubin, yang secara implisit akan mencakup dinding, untuk mengetahui ubin mana yang berada dalam batas kamera.
Anda masih hanya perlu memilih ubin awal dan jarak untuk melintasi berdasarkan ukuran ubin.