![]() |
Как отсортировать depth
Cуществует игра, отдаленно похожая на стратегию; Вид - подобие косоугольной проекции.
Чтобы элементы, стоящие сзади не налезали на передние использую двойную сортировку: сначала по _y(стандартную) и методом Шела (с использование оператора swapDepths. Все бы ничего, только тормоза идут. Метод Шела на быструю сортировку не стал заменять, т.к. не уверен, что для 40-50 элементов это будет эффективно. Код вот такой: _root.grafica.sort(function(o1,o2){return o1._y-o2._y}); var j, c, e; var n=_root.grafica.length-1; var g=int((n+1)/2); do{i=g; do{j=i-g; c = true; do{ if(_root.grafica[j].getDepth()<=_root.grafica[j+g].getDepth()){ c = false; }else{ _root.grafica[j].swapDepths(_root.grafica[j+g]); };j--; }while(j>=0&&c); i++; }while(i<=n); g=int(g/2); }while(g>0); Есть ли какой-нибудь стандартный способ сортировать свойство depth? Или другой алгоритм для устранения налезаний движущихся объектов на карте? |
Гы-гы, РТС, да еще на флэше, да еще 50 объектов, да еще чтоб не тормозило... ))) Забудь
|
Косоугольная проекция это ты про изометрию?
На сам деле все просто. Надо сразу назначать глубину по координатам: Код:
имя_элемента.swapDepths (y * noCollision + x * offsetMax + offset);noCollision - разрядность поля. число позволяющие избегать совпадения значений глубин при разных координатах, но с одинаковой суммой 3(x)+4(y)=7=7=4(x)+3(y). С noCollision = 10 будет так 3(x)+4(y)*10=43!=34=4(x)+3(y)*10. Так как максимальная глубина может быть 1048575, то y * noCollision + x * offsetMax + offset с максимальными значениями, не должен это число превышать. offsetMax - максимальное число объектов которые могут находится на одной ячейке игрового поля (например поверх дороги можно поставить телегу) offset - уровень приоритета объекта при одинаковых координатах (это значит, что если у тебя на дорогу (offset=1) наедет телега (offset=2), то телега будет выше дороги. если дорога (offset=2), а телега (offset=1), то телега окажется под дорогой). offset=[0;<offsetMax] И главное, центры координат различных объектов находящихся в одной ячейке должны совпадать. |
Цитата:
|
Вложений: 1
Вот неплохой пример Эриклина. Он поможет тебе разобраться с тем, что сказал iNils.
|
Цитата:
|
Спасибо, что подсказали! Попробовал по совету iNils - производительность раза в два-три возросла:) , тем более что у меня проекция только выглядит как изометрия, и предыдущий код вобще упрощается:
Код:
var i=_root.grafica.length; while(i--){p.s. Цитата:
|
Цитата:
|
Не ну раз сказал, что смогу сделать, такие атмазы не прокатят
Хотя после последнего отчета у заказчиков воображение разыгралось :), что несколько пугает... |
Все приходит с опытом, умением пользоваться поиском и смекалкой.
|
| Часовой пояс GMT +4, время: 17:44. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.