Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Как отсортировать depth (http://www.flasher.ru/forum/showthread.php?t=78628)

expl 21.04.2006 01:45

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

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

Цитата:

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

Вспоминаешь про делаю стратегию - пара вопросов ? :bye:

sergwizard 21.04.2006 03:11

Вложений: 1
Вот неплохой пример Эриклина. Он поможет тебе разобраться с тем, что сказал 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

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


Часовой пояс GMT +4, время: 17:44.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.