本文整理汇总了C++中Ship::Acceleration方法的典型用法代码示例。如果您正苦于以下问题:C++ Ship::Acceleration方法的具体用法?C++ Ship::Acceleration怎么用?C++ Ship::Acceleration使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Ship
的用法示例。
在下文中一共展示了Ship::Acceleration方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: DoScatter
void AI::DoScatter(Ship &ship, Command &command, const list<shared_ptr<Ship>> &ships)
{
if(!command.Has(Command::FORWARD))
return;
double turnRate = ship.TurnRate();
double acceleration = ship.Acceleration();
for(const shared_ptr<Ship> &other : ships)
{
if(other.get() == &ship)
continue;
// Check for any ships that have nearly the same movement profile as
// this ship and are in nearly the same location.
Point offset = other->Position() - ship.Position();
if(offset.LengthSquared() > 400.)
continue;
if(fabs(other->TurnRate() / turnRate - 1.) > .05)
continue;
if(fabs(other->Acceleration() / acceleration - 1.) > .05)
continue;
// Move away from this ship. What side of me is it on?
command.SetTurn(offset.Cross(ship.Facing().Unit()) > 0. ? 1. : -1.);
return;
}
}
示例2: PrepareForHyperspace
void AI::PrepareForHyperspace(Ship &ship, Command &command)
{
int type = ship.HyperspaceType();
if(!type)
return;
Point direction = ship.GetTargetSystem()->Position() - ship.GetSystem()->Position();
if(type == 150)
{
direction = direction.Unit();
Point normal(-direction.Y(), direction.X());
double deviation = ship.Velocity().Dot(normal);
if(fabs(deviation) > ship.Attributes().Get("scram drive"))
{
// Need to maneuver; not ready to jump
if((ship.Facing().Unit().Dot(normal) < 0) == (deviation < 0))
// Thrusting from this angle is counterproductive
direction = -deviation * normal;
else
{
command |= Command::FORWARD;
// How much correction will be applied to deviation by thrusting
// as I turn back toward the jump direction.
double turnRateRadians = ship.TurnRate() * TO_RAD;
double cos = ship.Facing().Unit().Dot(direction);
// integral(t*sin(r*x), angle/r, 0) = t/r * (1 - cos(angle)), so:
double correctionWhileTurning = fabs(1 - cos) * ship.Acceleration() / turnRateRadians;
// (Note that this will always underestimate because thrust happens before turn)
if(fabs(deviation) - correctionWhileTurning > ship.Attributes().Get("scram drive"))
// Want to thrust from an even sharper angle
direction = -deviation * normal;
}
}
command.SetTurn(TurnToward(ship, direction));
}
// If we are moving too fast, point in the right direction.
else if(Stop(ship, command, ship.Attributes().Get("jump speed")))
{
if(type != 200)
command.SetTurn(TurnToward(ship, direction));
}
}
示例3: StoppingPoint
Point AI::StoppingPoint(const Ship &ship)
{
const Point &position = ship.Position();
const Point &velocity = ship.Velocity();
const Angle &angle = ship.Facing();
double acceleration = ship.Acceleration();
double turnRate = ship.TurnRate();
// If I were to turn around and stop now, where would that put me?
double v = velocity.Length();
if(!v)
return position;
// This assumes you're facing exactly the wrong way.
double degreesToTurn = TO_DEG * acos(-velocity.Unit().Dot(angle.Unit()));
double stopDistance = v * (degreesToTurn / turnRate);
// Sum of: v + (v - a) + (v - 2a) + ... + 0.
// The number of terms will be v / a.
// The average term's value will be v / 2. So:
stopDistance += .5 * v * v / acceleration;
return position + stopDistance * velocity.Unit();
}