RTS製作日記。その12

アバター
MNS
記事: 35
登録日時: 15年前

RTS製作日記。その12

投稿記事 by MNS » 14年前

*経路をなめらかにする


A*で計算した経路は、そのグラフのリンクに従った場合の、
最短の経路であることは保障されていますが、
実際に、リンクに沿って進むことが最短であることはほとんどありません。
それどころか、不自然な動きだと言えます。
(例)
wkeiro.png
wkeiro.png (2.08 KiB) 閲覧数: 84 回
これを防ぐためには、途中の無駄な中継点を消す必要があります。
それには、1点をまたいだ2点のノード座標を抽出し、
その間に障害物があるかどうかを調べる必要があります。
コード:

CODE:

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;
}
こうすることによって、無駄な中継点を経路上から削除できます。

削除した結果:
skeiro.png
skeiro.png (3.85 KiB) 閲覧数: 78 回
現時点でのゲーム画面:
[youtube][/youtube]

さて、そろそろ敵を登場させてゲームらしくしたいところです。
ゲームのコンセプトのようなもの(どういうユニットが登場するか‥など)
も決めなければいけませんね~(-.-)

コメントはまだありません。