Esempio n. 1
0
        /// <summary>
        /// 朝向目标
        /// </summary>
        /// <param name="body"></param>
        /// <param name="targetPoint"></param>
        /// <param name="angularVelocityProc">角速度系数(0.1 - 1)</param>
        /// <returns></returns>
        public static float FowardToTarget(this Body body, Vector2 targetPoint, float angularVelocityProc, float deadArea = 0.95f)
        {
            if (Vector2.DistanceSquared(body.GetPosition(), targetPoint) < double.Epsilon)
            {
                return(0);
            }

            Vector2 tmp         = targetPoint - body.GetPosition();
            bool    isClockwise = MathUtils.Cross(tmp, body.GetForward()) > 0;
            float   cos         = CrazyUtils.IncludedAngleCos(tmp, body.GetForward());

            body.ApplyAngularImpulse(-body.AngularVelocity * body.Inertia, true);

            if (cos > deadArea)
            {
                return(cos);
            }

            if (isClockwise)
            {
                body.ApplyAngularImpulse(-angularVelocityProc * body.Inertia, true);
            }
            else
            {
                body.ApplyAngularImpulse(angularVelocityProc * body.Inertia, true);
            }

            return(cos);
        }
Esempio n. 2
0
        /// <summary>
        /// 圆形检测
        /// </summary>
        /// <param name="body"></param>
        /// <param name="bodies"></param>
        /// <param name="radius"></param>
        /// <returns></returns>
        public static List <Body> CircleDetection(this Body body, IEnumerable <Body> bodies, double radius)
        {
            List <tempBody> CollisionalBodies = new List <tempBody>();

            foreach (var b in bodies)
            {
                var distance = Vector2.DistanceSquared(body.GetPosition(), b.GetPosition());
                if (distance < radius * radius)
                {
                    CollisionalBodies.Add(new tempBody(b, (float)Math.Sqrt(distance)));
                }
            }

            return((from o in CollisionalBodies.OrderBy(o => o.Distance) select o.Body).ToList());
        }
Esempio n. 3
0
 /// <summary>
 /// 距离检测
 /// </summary>
 /// <param name="body"></param>
 /// <param name="point"></param>
 /// <param name="distance"></param>
 /// <returns></returns>
 public static bool DistanceDetection(this Body body, Vector2 point, double distance)
 {
     return(Vector2.DistanceSquared(body.GetPosition(), point) <= distance * distance);
 }