前回までの状況はこちら。
最新ソースはこちら(gitHub)
https://github.com/takishita2nd/HokkaidoWar
前回はマップ同士のリンクを作成しました。
ここ、もうちょっと改良します。
すぐ終わります。
マップのプロパティにUp、Down、Left、Rightを追加してそこから隣接するマップを取得させましょう。
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();
List.Contains(Obj)を使用すると、Listの中にObjと同じ物があるかを確認できます。
自分の都市の隣接する都市なので、自分自身は含めていません。
実行結果はこうなりました。