проще поворачивать в другую сторону. тогда и координаты и рейтинг сортировки высчитывается проще.
расчёт рейтинга становится элементарным: x + y. у кого это число больше - тот ближе к экрану. принцип оптимизации сортировки тоже очень прост: составляешь массив, в котором у тебя лежат объекты с их рейтингами. индекс элемента в массиве должен соответствовать его в глубине на сцене. в этом случаи алгоритм в общем виде будет выглядеть так:

Код AS3:
/**
* @private
* контейнер, в котором отображается всё наше барахло
*/
private var _content:DisplayObjectContainer;
/**
* хэш, где хранятся соответствия модели их вьюхам
* model -> view
*/
private const _elements:Dictionary = new Dictionary();
/**
* @private
* храним рейтинги сортировки
*/
private const _sortings:Vector.<uint> = new Vector.<uint>();
/**
* @private
* принудительно обновляет позицию вьюхи относительно модели
*/
private function updatePosition(data:MapElement):void {
// получаем ссылку на вьюшку
var view:DisplayObject = this._elements[ data ];
var x:Number = data.x;
var y:Number = data.y;
// изменяем координаты вьюшки
view.x = ( x - y ) * COOEF_X;
view.y = ( x + y ) * COOEF_Y;
// получаем текущий индекс
var lastIndex:uint = this._content.getChildIndex( view );
var lastRating:uint = this._sortings[ lastIndex ];
// новый рейтинг
var newRating:uint = Math.round( x + y ) + COOEF_SORT; // считаем новый рейтинг сортировки
// если рейтинг не изменился, то ничего не делаем
if ( lastRating != newRating ) {
// удаляем себя из списка
this._sortings.splice( lastIndex, 1 );
// найдём куда ставить и поставим
var newIndex:uint = this._sortings.length;
while ( --newIndex ) {
if ( this._sortings[ newIndex ] <= newRating ) break;
}
// вставляем новый индекс
this._sortings.splice( i, 0, newRating );
this._content.setChildIndex( view, newIndex );
}
}
Добавлено через 1 минуту
код не тестировался и набросан прямо тут, но смысл я надеюсь передал. такой метод сортировки гарантирует, что не происходит постоянного перебора всех объектов, а сравниваются только рейтинги.