Анимация героя

Наконец-то вымученный герой хоть как-то получился, анимация в конец меня убила, но все же есть и результаты.
Сам герой/персонаж оформлен виде отдельного SWF файла с набором фреймов названных особым образом: stand_s, stand_se, stand_e и т.п.
Количество фреймов на анимацию ходьбы - 3, левой-стой-правой.

Загрузка простым образом через loadMovie уже не устраивает, т.к. необходимо отслеживать процесс загрузки. Клип загружаем через MovieClipLoader, на onLoadInit вешаем обработчик загрузки.
Для тестов сделал отдельный тестовый клип (чтобы не мучаться встраивать сразу в основной), для onLoadInit – вызов setAnimateHero()
function setAnimateHero() {
var sdirect:Array = Array("s","se","e","ne","n","nw","w","sw");
hero_mc._x = heroX*square_size + heroX_dx;
hero_mc._y = heroY*square_size + heroY_dy;
hero_mc._visible = true;
var frm="stand_"+sdirect[heroD];
var animate_frame:Array = Array(0,1,2,1);
if (animate)
frm="move_"+sdirect[heroD]+"_"+animate_frame[frameAnimate];
hero_mc.gotoAndStop(frm);
}

Код примитивен – по переменной heroD определяется текущее положение героя, если есть анимация то фрейм определяется переменной frameAnimate, т.е. показывается например фрейм move_sw_0.
Повесил обработчик нажатии кнопки мыши onClipEvent (mouseUp) - определяю координаты и еще парочку действий:_root.animate = true;
_root.animate_step = 0;
_root.frameAnimate=0;
_root.nX = _root.heroX+dx;
_root.nY = _root.heroY+dy;

Переменные nX и nY – новые координаты героя (для основного кода в игре, естественно будет использоваться массив персонажей и все эти переменные будут в этом массиве, уникальные для каждого существа).
Ну и на enter в клип привязываем код:onClipEvent(enterFrame) {
if (getTimer()-_root.lastTimer > _root.animate_speed) {
_root.lastTimer= getTimer();
if (_root.animate) {
var numstep=6;
if (_root.animate_step==numstep) {
_root.animate=false;
//var sdirect:Array = Array("s","se","e","ne","n","nw","w","sw"); // 0 1 2 3 4 5 6 7
_root.heroX=_root.nX; _root.heroY=_root.nY;
_root.heroX_dx=0; _root.heroY_dy=0;
_root.setAnimateHero();
}
else {
_root.animate_step++;
var dx=_root.nX-_root.heroX;
var dy=_root.nY-_root.heroY;
_root.heroX_dx = (dx)*_root.square_size*(_root.animate_step/numstep);
_root.heroY_dy = (dy)*_root.square_size*(_root.animate_step/numstep);
_root.frameAnimate++;
if (_root.frameAnimate > 3) _root.frameAnimate=0;
_root.setAnimateHero();
}
}
}
}

Ну и вот что получилось: