モンスターなどのユニットを表現するのに、今まではこんなクラスを用意していた
class Monster{
int x, y;
int id;
}
またフロア内のすべてのモンスターをリストで表現する
List<Monster> monsters;
こうした場合に発生する問題の一つとして、
ある座標に関してモンスターの有無を調べる関数が必要になることがある
Monster GetMonsterByCoord(int x, int y){
return (from m in monsters where m.x == x && m.y = y select m).SingleOrDefault();
}
これは実に効率が悪いので、
Monsterレイヤーのマップを作ってしまうというアイデアが浮かぶ
Monster[][] layer_monster;
こうすると、座標に対して直接モンスターのデータを取ってくることができる
また、こうなるとモンスタークラスに座標を入れる必要もなくなる
class Monster{
int id;
}
ただし、モンスターの移動のふるまいを定義する際には注意が必要である
layer_monsterの元座標に相当するポインタはnullにしておかねばならない
参照カウンタを1に固定する仕組みなんかがあればよいのだが…
-*- ついき -*-
実際に実装してみると問題が発生した
すべてのモンスターを順に行動させるとき、マップをなめる必要があるのだが
そのときまだ処理していないマスに移動すると、繰り返す限り何回でも行動してしまう…
ということで、モンスターは座標を持っていてリストを作るべき…だ
-*- ついき2 -?-
まず一回なめてからモンスターリストを作ればいいということがわかった
List<Tuple<Monster, Coord>> monsterlist;
0 件のコメント:
コメントを投稿