public override void Step(IEnumerable <object> data) { var userTank = Screen.UserTank; if (userTank.DrawingBounds.IntersectsWith(RadarBounds)) { target = userTank; if (target is null) { var boundsCenter = BoundsCenter; Single distance = 0f, minimumDistance = Single.MaxValue; foreach (var movableShape in Screen.MovableShapes.Where(a => !(a is Tracker))) { distance = (Single)Math.Sqrt(Math.Pow(boundsCenter.X - movableShape.Bounds.X, 2) + Math.Pow(boundsCenter.Y - movableShape.Bounds.Y, 2)); if (distance < minimumDistance) { minimumDistance = distance; target = movableShape; } } } } long elapsed = Screen.Elapsed.Ticks; if (target != null) { Target = target.Bounds.GetCenter(); var freshAngle = BoundsCenter.GetAngle(Target); Angle = freshAngle; var tempVector = Extensions.GetVectorFromAngle(freshAngle); movementVector.X += tempVector.X * .00001f * elapsed; movementVector.Y += tempVector.Y * .00001f * elapsed; Move(movementVector); } else { angle += .0000001f * elapsed; var vector = Extensions.GetVectorFromAngle(angle); Move(vector); } // //if (Angle > Math.PI * 2) // Angle -= (Single)Math.PI * 2; //if (Math.Cos(freshAngle) > 0) //{ // var fSin = Math.Sin(freshAngle); // var sin = Math.Sin(angle); // // // if (fSin > 0 && sin < 0) // { // } // else if (fSin < 0 && sin > 0) // { // } //} //Angle += (freshAngle - Angle) / 10000; }
public override void Step(IEnumerable <object> data) { if (targetAchieved || Target == PointF.Empty) { RandomizeTarget(); } // Updating Target if (dynamicTarget && TargetSource != null) { if (TargetSource is Shape targetBlock) { if (!targetBlock.Active) { RandomizeTarget(); } } Target = TargetSource.Bounds.GetCenter(); } // var freshAngle = BoundsCenter.GetAngle(Target, false); if ((Math.Sin(freshAngle) > 0 && Math.Sin(Angle) > 0) || (Math.Sin(freshAngle) < 0 && Math.Sin(Angle) < 0)) { Angle += (freshAngle - Angle) / 10000; } else { Angle += (freshAngle - Angle) / 100000; } // Move(movementVector); // Verifying target reaching //var center = Bounds.GetCenter(); //var distance = Math.Sqrt(Math.Pow(Target.X - center.X, 2) + Math.Pow(Target.Y - center.Y, 2)); //if (distance < 5) //{ // RandomizeTarget(); //} }