コード例 #1
0
        public IPosition GetEscapePath(IPosition current, IEnumerable <IPosition> escape, IBattlefield battlefield)
        {
            const float desiredDistance = 20;

            var orderedByDistance = escape
                                    .Select(o => new { Position = o, Distance = current.GetDistance(o) })
                                    .OrderByDescending(o => o.Distance);

            var low  = orderedByDistance.First();
            var high = orderedByDistance.Last();

            var tuples = current
                         .GetVector2()
                         .GetDistancesTo(low.Position.GetVector2(), high.Position.GetVector2(), desiredDistance)
                         .OrderByDescending(o => o.Item3);

            var escapeVectors = tuples
                                .Where(o => o.Item1.AsVector3().IsInsideBounds(battlefield.CurrentBounds));

            var best = escapeVectors
                       .FirstOrDefault();

            if (best == null)
            {
                best = tuples.First();
            }

            return(best
                   .Item1
                   .AsVector3()
                   .Clamp(battlefield.CurrentBounds.Low, battlefield.CurrentBounds.High)
                   .GetPosition());
        }
コード例 #2
0
 public static float GetDistanceAbs(this IPosition position, IPosition other)
 {
     return(Math.Abs(position.GetDistance(other)));
 }