Во-первых, не надо шустрить массивы каждый раз, когда Вам нужен элемент. На протяжении огромного куска кода Вы работаете с одним и тем же элементом, и каждый раз заставляете плеер искать массив и искать элемент в нем. Когда можно просто сохранить ссылку на этот элемент в начале витка цикла.

Код AS3:
var enemy:MovieClip = enemies[i];
Затем Вы добавили enemy в какой-то массив temp. Я не знаю зачем. Так же совершенно непонятно происходящее дальше — Вы забываете про enemy и вытаскиваете кого-то из массива temp. Вытаскиваете, если он там есть конечно, что маловероятно. Почему маловероятно? Ну вот у Вас массив enemies, и в нем, допустим, 50 зомби. Начинаем цикл. Вы берете зомби с индексом "0", проверяете хиттестом, и он не попадает в обзор. И не будет добавлен в temp. Однако, несмотря на это, Вы уверенно берете какой-то несуществующий temp[0] и начинаете сравнивать его Х и Y с координатами героя. Вообще-то здесь плеер уже выдал ошибку.
Если Вам так нужен массив видящих героя врагов, надо создать его в одном цикле. Затем надо провести второй цикл, уже обходя этот новый массив temp, с учетом его размера, а не массива всех врагов.
Мне же кажется, что никакой temp вообще Вам не нужен. Вы проходите по массиву врагов, и все враги, видящие героя, устремляются к нему.
Для этого вся ваша батарея if'ов должна помещаться внутри первого условия — хиттеста. Это и есть ваш "тру". Если enemy (т.е. enemies[i]) попал в обзор, то ЕГО координаты и меняем, устремляя его к герою. И никакого tempa для этого не надо — вот он, видящий враг, прямо здесь, в блоке условия.
Добавлено через 8 минут

Код AS3:
public function goblinAgr (e:Event): void
{
for (var i:Number=0; i < enemys.length; i++)
{
var enemy:MovieClip = enemys[i] as MovieClip;
if (hero.hitTestObject(enemy.obzor))
{
if (enemy.x > hero.x)
{
enemy.x -= HeroSpeedE;
enemy.gotoAndStop(1);
}
if (enemy.y > hero.y)
{
enemy.y -= HeroSpeedE;
}
if (enemy.x < hero.x)
{
enemy.x += HeroSpeedE;
enemy.gotoAndStop(3);
}
if (enemy.y < hero.y)
{
enemy.y += HeroSpeedE;
}
}
}
}