2014年3月28日金曜日

Roguelike 実装に関するノウハウ

モンスターなどのユニットを表現するのに、今まではこんなクラスを用意していた

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 件のコメント:

コメントを投稿