class Map
{
public Map Up {
get {
var field = Singleton.GetFieldMap();
return field.GetMap(_x, _y - 1);
}
}
public Map Down
{
get
{
var field = Singleton.GetFieldMap();
return field.GetMap(_x, _y + 1);
}
}
public Map Left
{
get
{
var field = Singleton.GetFieldMap();
return field.GetMap(_x - 1, _y);
}
}
public Map Right
{
get
{
var field = Singleton.GetFieldMap();
return field.GetMap(_x + 1, _y);
}
}
class FieldMap
{
public Map GetMap(int x, int y)
{
if(x < 0 || x >= MaxX || y < 0 || y >= MaxY)
{
return null;
}
else
{
return _map[x, y];
}
}
これでだいぶ扱いやすくなったはず。
動作結果は前回と同じ。
で、ここからが今回の本題。
マップと都市のリンクを作成します。
マップから所属する都市を取得できるようにします。
まぁ、やっていることは簡単ですが。
class Map
{
public void SetCity(City city)
{
_city = city;
}
public City GetCity()
{
return _city;
}
class City
{
public City(string name, Point[] points, int population)
{
_name = name;
_population = population;
_maps = new List<Map>();
var r = Singleton.GetRandom();
_color = new asd.Color((byte)r.Next(0, 255), (byte)r.Next(0, 255), (byte)r.Next(0, 255));
var fieldMap = Singleton.GetFieldMap();
foreach (var p in points)
{
Map m = new Map(p.x, p.y, _color);
m.SetCity(this);
_maps.Add(m);
fieldMap.SetMap(m);
}
}
private List<City> GetLinkedCities()
{
List<City> cities = new List<City>();
foreach (var m in _maps)
{
if (m.Up != null)
{
var c = m.Up.GetCity();
if (cities.Contains(c) == false && c != this)
{
cities.Add(c);
}
}
if (m.Down != null)
{
var c = m.Down.GetCity();
if (cities.Contains(c) == false && c != this)
{
cities.Add(c);
}
}
if (m.Left != null)
{
var c = m.Left.GetCity();
if (cities.Contains(c) == false && c != this)
{
cities.Add(c);
}
}
if (m.Right != null)
{
var c = m.Right.GetCity();
if (cities.Contains(c) == false && c != this)
{
cities.Add(c);
}
}
}
return cities;
}
public void OnMouse(asd.Vector2DF pos)
{
foreach (var m in _maps)
{
if(m.IsOnMouse(pos))
{
var info = Singleton.GetInfomationWindow();
info.ShowText(pos, _name + "\r\n" + _population.ToString());
// test
var cities = GetLinkedCities();
foreach (var c in cities)
{
c.linkedCity();
}
}
}
}
//test
private void linkedCity()
{
foreach(var m in _maps)
{
m.linkedMap();
}
}
class HokkaidoWar
{
public void Run()
{
while (asd.Engine.DoEvents())
{
FieldMap fieldMap = Singleton.GetFieldMap();
fieldMap.unlinkMap();
class FieldMap
{
public int MaxX { get { return 44; } }
public int MaxY { get { return 35; } }
private Map[,] _map;
public FieldMap()
{
_map = new Map[44, 35];
}
public Map GetMap(int x, int y)
{
return _map[x, y];
}
public void SetMap(Map map)
{
_map[map.X, map.Y] = map;
}
class Singleton
{
private static FieldMap _map = null;
public static FieldMap GetFieldMap()
{
if (_map == null)
{
_map = new FieldMap();
}
return _map;
}
public City(string name, Point[] points, int population)
{
_name = name;
_population = population;
_maps = new List<Map>();
var r = Singleton.GetRandom();
_color = new asd.Color((byte)r.Next(0, 255), (byte)r.Next(0, 255), (byte)r.Next(0, 255));
var fieldMap = Singleton.GetFieldMap();
foreach (var p in points)
{
Map m = new Map(p.x, p.y, _color);
_maps.Add(m);
fieldMap.SetMap(m);
}
}
たぶん、これだけでOKのはずなので、うまく管理出来ているか、テストコードで確認したいと思います。
マウスカーソルのあるマップの隣にあるマップの色を変化させます。
class City
{
public void OnMouse(asd.Vector2DF pos)
{
var fieldMap = Singleton.GetFieldMap();
foreach (var m in _maps)
{
if(m.IsOnMouse(pos))
{
var info = Singleton.GetInfomationWindow();
info.ShowText(pos, _name + "\r\n" + _population.ToString());
// test
fieldMap.onMouse(m);
}
}
}
class FieldMap
{
// Test
public void onMouse(Map map)
{
for(int x = 0; x < MaxX; x++)
{
for(int y = 0; y < MaxY; y++)
{
if(_map[x,y] != null)
{
_map[x, y].unlinkedMap();
}
}
}
if(map.X > 0)
{
if (_map[map.X + 1, map.Y] != null)
{
_map[map.X + 1, map.Y].linkedMap();
}
}
if (map.X < MaxX)
{
if (_map[map.X - 1, map.Y] != null)
{
_map[map.X - 1, map.Y].linkedMap();
}
}
if (map.Y > 0)
{
if (_map[map.X, map.Y - 1] != null)
{
_map[map.X, map.Y - 1].linkedMap();
}
}
if (map.Y < MaxY)
{
if (_map[map.X, map.Y + 1] != null)
{
_map[map.X, map.Y + 1].linkedMap();
}
}
}
class Map
{
// Test
public void linkedMap()
{
var changeColor = new asd.Color(200, 200, 200);
_geometryObj.Color = changeColor;
}
public void unlinkedMap()
{
_geometryObj.Color = _color;
}