A*で計算した経路は、そのグラフのリンクに従った場合の、
最短の経路であることは保障されていますが、
実際に、リンクに沿って進むことが最短であることはほとんどありません。
それどころか、不自然な動きだと言えます。
(例) これを防ぐためには、途中の無駄な中継点を消す必要があります。
それには、1点をまたいだ2点のノード座標を抽出し、
その間に障害物があるかどうかを調べる必要があります。
コード:
bool PathFinder::GetShortestPath(Vec2D target,
std::list& path)
{
…略…
//経路をなめらかにする
std::list::iterator Itr1(path.begin()),
Itr2(path.begin()),
Itr3(path.begin());
//Itr2はItr1の次のものを指す
//Itr3はItr2の次のものを指す
Itr3=++Itr2;
if(Itr3 == path.end()) return true;
++Itr3;
while(Itr3 != path.end())
{
//Itr1とItr3の間に障害物がなければ、
//Itr2は不要!
if(!WallManager::Instance().
IntersectWalls(*Itr1, *Itr3))
{
Itr2 = path.erase(Itr2);
++Itr3;
}
else
{
Itr1 = Itr2;
Itr2 = Itr3;
++Itr3;
}
}
return true;
}
削除した結果: 現時点でのゲーム画面:
[youtube][/youtube]
さて、そろそろ敵を登場させてゲームらしくしたいところです。
ゲームのコンセプトのようなもの(どういうユニットが登場するか‥など)
も決めなければいけませんね~(-.-)