Просмотр полной версии : Как отсортировать 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);
x,y - координата объекта
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]
И главное, центры координат различных объектов находящихся в одной ячейке должны совпадать.
Гы-гы, РТС, да еще на флэше, да еще 50 объектов, да еще чтоб не тормозило... ))) Забудь
Вспоминаешь про делаю стратегию - пара вопросов (http://www.flasher.ru/forum/showthread.php?t=67492&highlight=%E8%E7%EE%EC%E5%F2%F0%E8%FF)? :bye:
sergwizard
21.04.2006, 03:11
Вот неплохой пример Эриклина. Он поможет тебе разобраться с тем, что сказал iNils.
Вспоминаешь про делаю стратегию - пара вопросов ?
Гы, ну да. Я бы и сделала её, но в какойто момент поняла, что нафиг эти тормоза и глюки. Объекты ж не только двигаться будут и глубину менять, но еще и взаимодействовать друг с другом, искать короткий путь и т д. А это кучи циклов в каждом кадре. Нафиг. Пошаговые стратегии в этом плане лучше ))
Спасибо, что подсказали! Попробовал по совету iNils - производительность раза в два-три возросла:) , тем более что у меня проекция только выглядит как изометрия, и предыдущий код вобще упрощается:
var i=_root.grafica.length; while(i--){
$=_root.grafica[i];
$.swapDepths($._y*80+$.prior);
};
Осталось только проверить, чтобы оъекты grafica поверх других не оказались, но это уже мелочи.
p.s.
Гы-гы, РТС, да еще на флэше, да еще 50 объектов, да еще чтоб не тормозило... ))) Забудь
- типа заказчикам так и скажу:(
- типа заказчикам так и скажу
Ну ты же флэшер, а не они, ты и должен сказать, что будет работать, а что тормозить.
Не ну раз сказал, что смогу сделать, такие атмазы не прокатят
Хотя после последнего отчета у заказчиков воображение разыгралось :), что несколько пугает...
Все приходит с опытом, умением пользоваться поиском и смекалкой.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.