Add WVec.HorizontalLengthSquared to simplify range checks.

This commit is contained in:
Paul Chote
2013-07-20 19:04:19 +12:00
parent 56da57bc09
commit f18994f800
3 changed files with 12 additions and 10 deletions

View File

@@ -38,6 +38,7 @@ namespace OpenRA
public static int Dot(WVec a, WVec b) { return a.X * b.X + a.Y * b.Y + a.Z * b.Z; }
public long LengthSquared { get { return (long)X * X + (long)Y * Y + (long)Z * Z; } }
public int Length { get { return (int)Math.Sqrt(LengthSquared); } }
public long HorizontalLengthSquared { get { return (long)X * X + (long)Y * Y; } }
public WVec Rotate(WRot rot)
{

View File

@@ -91,12 +91,7 @@ namespace OpenRA.Traits
// Target ranges are calculated in 2D, so ignore height differences
var rangeSquared = range.Range*range.Range;
return Positions.Any(t =>
{
var dx = (long)(t.X - origin.X);
var dy = (long)(t.Y - origin.Y);
return dx*dx + dy*dy <= rangeSquared;
});
return Positions.Any(t => (t - origin).HorizontalLengthSquared <= rangeSquared);
}
}

View File

@@ -25,13 +25,19 @@ namespace OpenRA.Mods.RA.Air
if (!Target.IsValid)
Cancel(self);
if (IsCanceled) return NextActivity;
var d = Target.CenterPosition - self.CenterPosition;
if (d.LengthSquared < 256*256) // close enough (1/4 cell)
if (IsCanceled)
return NextActivity;
var aircraft = self.Trait<Aircraft>();
var d = Target.CenterPosition - self.CenterPosition;
// close enough (1/16 cell)
// TODO: TickMove may overshoot if the aircraft speed is too high
if (d.HorizontalLengthSquared < 4096)
{
aircraft.SetPxPosition(self, PPos.FromWPos(Target.CenterPosition));
return NextActivity;
}
if (aircraft.Altitude > 0)
--aircraft.Altitude;