PDA

Просмотр полной версии : Как отсортировать depth


expl
21.04.2006, 01:45
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?
Или другой алгоритм для устранения налезаний движущихся объектов на карте?

Takato
21.04.2006, 02:21
Гы-гы, РТС, да еще на флэше, да еще 50 объектов, да еще чтоб не тормозило... ))) Забудь

iNils
21.04.2006, 02:51
Косоугольная проекция это ты про изометрию?
На сам деле все просто. Надо сразу назначать глубину по координатам:
имя_элемента.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]

И главное, центры координат различных объектов находящихся в одной ячейке должны совпадать.

iNils
21.04.2006, 02:53
Гы-гы, РТС, да еще на флэше, да еще 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.

Takato
21.04.2006, 10:17
Вспоминаешь про делаю стратегию - пара вопросов ?

Гы, ну да. Я бы и сделала её, но в какойто момент поняла, что нафиг эти тормоза и глюки. Объекты ж не только двигаться будут и глубину менять, но еще и взаимодействовать друг с другом, искать короткий путь и т д. А это кучи циклов в каждом кадре. Нафиг. Пошаговые стратегии в этом плане лучше ))

expl
22.04.2006, 00:46
Спасибо, что подсказали! Попробовал по совету iNils - производительность раза в два-три возросла:) , тем более что у меня проекция только выглядит как изометрия, и предыдущий код вобще упрощается:
var i=_root.grafica.length; while(i--){
$=_root.grafica[i];
$.swapDepths($._y*80+$.prior);
};
Осталось только проверить, чтобы оъекты grafica поверх других не оказались, но это уже мелочи.
p.s.
Гы-гы, РТС, да еще на флэше, да еще 50 объектов, да еще чтоб не тормозило... ))) Забудь
- типа заказчикам так и скажу:(

Takato
22.04.2006, 00:50
- типа заказчикам так и скажу

Ну ты же флэшер, а не они, ты и должен сказать, что будет работать, а что тормозить.

expl
25.04.2006, 23:25
Не ну раз сказал, что смогу сделать, такие атмазы не прокатят
Хотя после последнего отчета у заказчиков воображение разыгралось :), что несколько пугает...

iNils
26.04.2006, 00:01
Все приходит с опытом, умением пользоваться поиском и смекалкой.