public override void Act()
 {
     if (Target != null && Target.Par.HP > 0)
     {
         var d = GameMath.CompareAngles(unit.Par.Angle, GameMath.GetAngleOfVector(Target.Par.X - unit.Par.X, Target.Par.Y - unit.Par.Y));
         if (d > lastDelta)
         {
             deltaCounter++;
         }
         else
         {
             deltaCounter = 0;
         }
         if (deltaCounter > 30)
         {
             lastDelta = 1000;
             SetTarget();
             deltaCounter = 0;
         }
         else
         {
             lastDelta = d;
         }
     }
     else
     {
         SetTarget();
         deltaCounter = 0;
     }
 }
Пример #2
0
        public override void Init(params object[] par)
        {
            CompositeUnit = (UCompositeGameObject)unit;
            SquareRadius  = CompositeUnit.Children[0].Par.Range * CompositeUnit.Children[0].Par.Range;
            UGameObjectBase tempTarget   = null;
            double          tempMinAngle = 360;
            double          a;
            double          r;
            double          MinRange = 9999999999;
            //temp out the range target
            UGameObjectBase tempOTRTarget = null;

            //поиск цели в радиусе поражения
            for (int i = 0; i < targetList.Count; i++)
            {
                r = (targetList[i].Par.X - unit.Par.X) * (targetList[i].Par.X - unit.Par.X) + (targetList[i].Par.Y - unit.Par.Y) * (targetList[i].Par.Y - unit.Par.Y);
                if (r < SquareRadius)
                {
                    a = GameMath.CompareAngles(unit.Par.Angle, GameMath.GetAngleOfVector(targetList[i].Par.X - unit.Par.X, targetList[i].Par.Y - unit.Par.Y));
                    if (a < tempMinAngle)
                    {
                        tempMinAngle = a;
                        tempTarget   = targetList[i];
                    }
                }
                else
                {
                    if (r < MinRange)
                    {
                        MinRange      = r;
                        tempOTRTarget = targetList[i];
                    }
                }
            }
            //поиск цели вне радиуса при необходимости
            RemoveAllBehaviorsExceptAI();

            if (tempTarget != null)
            {
                // if (currTarget != tempTarget)

                currStatus = 1;
                currTarget = tempTarget;
                CompositeUnit.Children[0].AddBehavior(new ShootWhenAimed(currTarget, "LightShell", targetList), "ShootWhenAimed");
            }
            else
            {
                currStatus = 3;
                currTarget = tempOTRTarget;
                unit.AddBehavior(new MoveForward(), "MoveForward");
                //что если tempOTRTarget=null?
            }
            unit.AddBehavior(new RotateTo(currTarget, 1), "RotateTo");
            CompositeUnit.Children[0].AddBehavior(new RotateTo(currTarget, 1), "RotateTo");
        }
        void SetTarget()
        {
            double t, min = 361;

            Target = null;

            for (int i = 0; i < targets.Count; i++)
            {
                if (targets[i].Par.HP > 0)
                {
                    t = GameMath.CompareAngles(unit.Par.Angle, GameMath.GetAngleOfVector(targets[i].Par.X - unit.Par.X, targets[i].Par.Y - unit.Par.Y));
                    if (t < min)
                    {
                        min = t;
                        //if(currTarget != null)
                        //game.Map.ContainerSetFrame(currTarget.GetContainerName(), "flyerRed3");
                        Target = targets[i];
                        //game.Map.ContainerSetFrame(currTarget.GetContainerName(), "flyerRed2");
                    }
                }
            }
        }