Немного сталкивался с такой задачей (игрушку делал), решил так - на каждое событие onEnterFrame добавляю в некий служебный массив инфу о мувиках в обертке объектов (каждму мувику соответствует пара - ссылка на сам мувик и его координата _y) , этот массив после его наполнения с каждым EnterFrame сортирую по убыванию _y, затем сообразно новому индексу мувика в массиве меняю его уровень . Массив удаляю. Это происходит непрерывно.
Нашел старый исходник, немного поправил нужный кусок под ваши реалии, и причесал.

Код AS1/AS2:
var countHero:Number = 0;
this.createEmptyMovieClip('heroes', 0);
var createHeroes:Number = setInterval(mc_clip, 1000);
function mc_clip()
{
countHero++;
s = random(2);
man = heroes.attachMovie('mc_clip', 'hr' + countHero, countHero);
man._y = 190 + random(90);
man.speed = 1 + random(2);
if (s == 0)
{
man._x = -20;
man._xscale = 100;
}
if (s == 1)
{
man._x = 220;
man._xscale = -100;
}
}
this.onEnterFrame = function ()
{
var arr:Array = new Array();
for (var h in heroes)
{
var hero:MovieClip = heroes[h]; //выбираем очередной мувик по очереди
hero._x += hero.speed * (hero._xscale / 100); //скорость
var obj:Object = { x:hero._x, y:hero._y};
heroes.localToGlobal(obj);
arr.push( { mc:hero, y:obj.y } ); //добавляем в массив пару: ссылка на мувик и его _y
}
trace('========ПЕРЕСОРТИРОВКА=========');
arr.sortOn('y', Array.DESCENDING | Array.NUMERIC ); //сортируем по _y по нисходящей
for (var i in arr)
{
trace(i + ' ' + arr[i].mc + ' ' + arr[i].y);
//выведет новый индекс мувика + ссылку на него + коорд. _y (приведенную к _root)
//можно будет увидеть, что мувики с младшими номерами имеют более низкую координату _y
//остается только свапнуть мувик сообразно его номеру, и подстраховавшись от удаления возможно уже имеющегося
//сама процедура свапа
var hero:MovieClip = arr[i].mc;
var hisNextLevel:Number = parseInt(i) + 1;
hero.swapDepths(hisNextLevel); //swap внутри heroes
}
delete arr;
};
Комментарии - здесь мувики создаются внутри контейнера
heroes, сам контейнер можно двигать по сцене.
Ужасное количество обработчиков onEnterFrame на каждом мувике (в вашем коде) я убрал, все решает одна общая функция.
Метод
localToGlobal тут остался от моего рабочего проекта, группы персонажей там были в разных контейнерах и бегали не в общем, и нужно было привести все их координаты к _root, чтобы можно было сравнить, кто кого должен закрывать.
Но, наверное, тоже решение не самое лучшее. У меня хорошо работало, мувиков совсем было немного.
Однако, если заинтересуетесь, то трейсы уберите, и не забывайте об удалении тех мувиков, кто ушел за пределы, иначе быстро начнутся тормоза.
Рабочий пример во вложении. Разумеется, все очень компактно в рабочем варианте - в цикле добавили мувики во временный массив, конец цикла, пересортировка, свап в цикле на полагающийся уровень. Через несколько миллисек. - по новой.
PS. Я не очень понял, какое наложение надо. Если над наоборот, то просто заменяете строку на

Код AS1/AS2:
//теперь сортируем по _y по возрастанию, объекты ниже по _y будут перекрывать тех, кто выше по _y
arr.sortOn('y', Array.NUMERIC );
- то есть убираете Array.DESCENDING и получается как бы имитация пространственной перспективы, более приближено к жизни.