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; } }
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"); } } } }