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