Dip52 Вы всегда создаете такое количество циклов, констант и временных переменных? Особенно циклов. В прошлый раз было три... Я считаю оптимальным подходом, при работе с группой объектов, получать ссылки на них единожды и делать все вычисления на ходу пока не закончатся все преобразования и исчисления. Вы постоянно создаете "временные" массивы куда складываете результаты одной составной итерации всего действия.
Добавлено через 15 минут

Код 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'));
var weakTarget:MovieClip;
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))
{
if (!weakTarget || weakTarget.life<ENEMY.life) {
weakTarget = ENEMY;
}
ENEMY.alpha = .5;
}
else
{
ENEMY.alpha = 1;
}
}
if (weakTarget) {
// странная пляска с бубном над globalToLocal
var cp:Point = new Point(0,0);
var fPoint:Point = weakTarget.globalToLocal(cp);
FORESIGHT.x = fPoint.x;
FORESIGHT.y = fPoint.y;
) else {
FORESIGHT.x =
FORESIGHT.y = 0;
}
}
//Метод рисования границ прицеливания:
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;
}
}
}