RTS製作日記。その6

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

RTS製作日記。その6

投稿記事 by MNS » 14年前

*ユニットが重ならないようにする

ユニット同士を重ならないようにするには、
ユニット同士が近づいた際に、互いに離れあう力を与えればよいです。
これはすぐに実装できますが、
ユニット同士が近付いているかどうかを判定する処理が必要です。
とりあえず現状では、総当りで実装してみますが、
いずれ改造が必要ですね・・・。

CODE:

const	double	N_RADIUS = 9;

Vec2D	MotionManager::Separate()
{
	Vec2D	Force;

	//全ユニットとの距離を調べる。
	std::map*
		UnitList = UnitManager::Instance().GetUnitList();
	std::map::iterator it;
	for(it = UnitList->begin();
		it != UnitList->end(); ++it)
	{
		//自分自身との距離は調べない
		if((*it).second==m_pUnit) continue;

		Vec2D	dist = m_pUnit->Pos() - (*it).second->Pos();

		if( dist.LengthSQ() Pos().x,
			 (int)m_pUnit->Pos().y,
			 (int)Target.x,
			 (int)Target.y,
			 GetColor(200,200,200));


	Vec2D To = Target - m_pUnit->Pos(); 
	
	double dist = To.Length();

	//distの除算があるので…
	if(dist > 0)
	{
		//速度は距離に比例する
		double speed = dist * WEAKER;

		//理想速度が最大速度を超えることはない
		if(speed > m_pUnit->MaxSpeed())
		{
			speed = m_pUnit->MaxSpeed();
		}

		//力を計算
		Vec2D	V = To * speed / dist;
		
		return	V - m_pUnit->Velocity();
	}

	else return Vec2D();

}
距離が小さくなるにつれて速度を小さくするには、
距離に比例した速度を計算して、
その速度に近づくような力を発生させます。
こうすることによって、ある種の減速のような挙動をするようになり、
ターゲットを飛び越えるということもありません。


ゲーム画面の様子をまたgif動画であげようと思ったのですが、
これを繰り返しているといずれサーバーの多くの容量を占めてしまいそうで、
申し訳ない気持ちがあるので、youtubeに投稿しました。
[youtube][/youtube]
今回はこのくらいで終わりです。
添付ファイル
whrdoigo.png
whrdoigo.png (14.85 KiB) 閲覧数: 89 回

ああ
記事: 49
登録日時: 14年前

Re: RTS製作日記。その6

投稿記事 by ああ » 14年前

おぉ、動いてる!!