Здравствуйте.
Цель:
Определить какие противники находятся в области прицела. +
Поместить этих противников в специальный массив. +
Определить какой противник в специальном массиве самый слабый. +
Присвоить координаты самого слабого противника мушке. ?
Положение:
Прицел A.
Мушка B.
Противник C.
Мушка находится в том же контейнере, что и прицел. Противник снаружи.
Перед проверкой "какие противники находятся в области прицела" я перевожу координаты прицела с локальных в глобальные. Чтобы убедиться в том, что проверка действительно работает я присваивал определённую прозрачность тем противникам, которые находятся в области прицела.
Когда я определил самого слабого противника я перевёл его глобальные координаты в локальные и присвоил их мушке. Я получил в итоге: то движение мушки вокруг прицела, то противник стоит в одном месте, а мушка совсем в другом.

Код AS3:
package madness.operation
{
import flash.events.Event;
import flash.display.MovieClip;
import flash.geom.Point;
import flash.display.Sprite;
import madness.*;
import flash.display.Shape;
import madness.background.Fields;
public class Aiming
{
private var enemies:Array = [];
private var range:Number = 40;
private var limit:Number = 20;
public function Aiming()
{
//Создаю прицел:
var wings:MovieClip = new Wings();
wings.name = 'sight';
wings.y = -200;
Settings.wings.addChild(wings);
Fields.FIELDFORWINGS.addChild(Settings.wings);
//Создаю прицел:
//Создаю мушку:
var foresight:MovieClip = new Foresight();
foresight.name = 'foresight';
wings.addChild(foresight);
//Создаю мушку:
Settings.stage.addEventListener(Event.ENTER_FRAME,work);
}
public function work(event:Event):void
{
wingsMove();
drawLimitAiming();
const LENGTHENEMIES:int = Settings.rangers.length;
const WINGS:MovieClip = MovieClip(Settings.wings.getChildByName('sight'));
var clickPoint:Point=new Point(0, 0);
var wingsPoint:Point = WINGS.localToGlobal(clickPoint);
const FORESIGHT:MovieClip = MovieClip(WINGS.getChildByName('foresight'));
for(var e:int = 0; e < LENGTHENEMIES; e++)
{
const ENEMY:MovieClip = Settings.rangers[e];
var onePoint:Point = new Point();
var twoPoint:Point = new Point();
var r:Number = Settings.wings.rotation*Math.PI/180;
onePoint.x = ENEMY.x - wingsPoint.x;
onePoint.y = ENEMY.y - wingsPoint.y;
twoPoint.x = onePoint.x*Math.cos(r) - onePoint.y*Math.sin(r);
twoPoint.y = onePoint.y*Math.sin(r) + onePoint.y*Math.cos(r);
if(range >= getDistanceForesightAndTarget(twoPoint,new Point()) && limit > Math.abs(twoPoint.y))
{
enemies.push(ENEMY);
ENEMY.alpha = .5;
}
else
{
ENEMY.alpha = 1;
}
}
const L:int = enemies.length;
if(L == 0)
{
FORESIGHT.x = 0;
FORESIGHT.y = 0;
return;
}
var id:int = int.MAX_VALUE;
var l:int = int.MAX_VALUE;
for(var feeble:int = 0; feeble < enemies.length; feeble++)
{
const life:int = enemies[feeble].life;
if(l > life)
{
l = life;
id = feeble;
}
}
if(id != int.MAX_VALUE)
{
var enemy:MovieClip = enemies[id];
enemies.splice(0,enemies.length);
var cp:Point = new Point(0,0);
var fPoint:Point = enemy.globalToLocal(cp);
FORESIGHT.x = fPoint.x;
FORESIGHT.y = fPoint.y;
}
}
//Метод рисования границ прицеливания:
private function drawLimitAiming():void
{
var sight:MovieClip = MovieClip(Settings.wings.getChildByName('sight'));
sight.graphics.clear();
sight.graphics.lineStyle(1,0x00FFFF);
//Верхняя линия:
sight.graphics.moveTo(-range, -limit);
sight.graphics.lineTo(range, -limit);
//Нижняя линия:
sight.graphics.moveTo(-range, limit);
sight.graphics.lineTo(range, limit);
}
//Метод определения дистанции между мишенью и мушкой:
private function getDistanceForesightAndTarget(foresight:Point,target:Point):Number
{
return Math.sqrt(Math.pow(foresight.x-target.x,2)+Math.pow(foresight.y-target.y,2));
}
//Движение крыльев:
private function wingsMove():void
{
var wings:MovieClip = Settings.wings;
var mainPersona:MovieClip = Settings.mainPersona;
wings.x = mainPersona.x;
wings.y = mainPersona.y;
wings.rotation = mainPersona.rotation;
}
}
}