Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 03.12.2015, 12:38
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 11  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
писок отображения уже является массивом. Зачем плодить ещё?
Затем, что у тебя нет доступа к массиву списка отображения и ты не можешь его сортировать напрямую.

Старый 03.12.2015, 12:58
callme вне форума Посмотреть профиль Отправить личное сообщение для callme Найти все сообщения от callme
  № 12  
Ответить с цитированием
callme
 
Аватар для callme

Регистрация: Dec 2014
Сообщений: 312
Цитата:
Сообщение от zCHESNOKz Посмотреть сообщение
Я понял. Я тоже сортировал массив по 'y'. А дальше, как относительно положения в (отсортированном) массиве расположить графические объекты с нужным положением глубины отображения?

Каждый раз после сортировки надо выполнять вот этот код:
Код AS3:
for (var i:int = 0; i < clips.length; i++) 
{
    addChild(clips[i]);
}

Старый 03.12.2015, 18:19
Bletraut вне форума Посмотреть профиль Отправить личное сообщение для Bletraut Найти все сообщения от Bletraut
  № 13  
Ответить с цитированием
Bletraut
 
Аватар для Bletraut

Регистрация: Mar 2013
Адрес: Вне пространства.
Сообщений: 566
Отправить сообщение для Bletraut с помощью ICQ Отправить сообщение для Bletraut с помощью Skype™
Когда я создавал подобные игры, я не использовал сортировку дисплей листа ибо это влияет на производительность, но взамен этого я каждый раз генерировал дисплей лист. Мой метод заключался в следующем.

Создается двумерный массив, в первом массиве хранится индекс массива который определяется по сортируемой величине, второй массив хранит объекты имеющие данную величину. Код примерно следующий

Код AS3:
var container:Sprite = new Sprite(); //допустим это какой-то контейнер в котором нужно сортировать всех детей по Y.
 
var sortChildList:Array = new Array(); //наш двумерный массив со списком отображения
 
//перебираем всех детей и записываем их в массив
var i:int = container.numChildren;
while(i--)
{
    var j:Sprite = container.getChildAt(i);
    if (sortChildList[Math.floor(j.y)] == undefined)
    {
        var na:Array = new Array(j);
        sortChildList[Math.floor(j.y)] = na;
    }
    else
    {
        sortChildList[Math.floor(j.y)].push(j);
    }
}
 
container.removeChildren(); //удаляем всех детей из списка отображения
 
//добавляем всех детей заново
for (i = 0; i < sortChildList.length; i++)
{
    if (sortChilList[i] == undefined) continue;
    for (var j:int = 0; j < sortChilList[i].length; j++)
    {
        container.addChild(sortChilList[i][j]);
    }
}
Опытных гуру прошу оценить и прокомментировать мой способ, есть ли у него преимущества перед сортировочным?
__________________
Я заклинаю вас действовать иначе.


Последний раз редактировалось Bletraut; 03.12.2015 в 18:41.
Старый 03.12.2015, 18:41
ObOs вне форума Посмотреть профиль Отправить личное сообщение для ObOs Найти все сообщения от ObOs
  № 14  
Ответить с цитированием
ObOs
 
Аватар для ObOs

Регистрация: Jul 2009
Сообщений: 149
Код AS3:
container.removeChildren(); //удаляем всех детей из списка отображения
это писать не обязательно.

Старый 04.12.2015, 08:33
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 15  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
я не использовал сортировку дисплей листа ибо это влияет на производительность, но взамен этого я каждый раз генерировал дисплей лист. Мой метод заключался в следующем.
Мм.. ну, как бы тут очевидно, что этот метод гораздо тормознее. Тут происходит то же самое, только 2 раза.
Готов поспорить, что сортировка предложенная callme, будет работать гораздо быстрее

Старый 04.12.2015, 11:23
zCHESNOKz вне форума Посмотреть профиль Отправить личное сообщение для zCHESNOKz Посетить домашнюю страницу zCHESNOKz Найти все сообщения от zCHESNOKz
  № 16  
Ответить с цитированием
zCHESNOKz
 
Аватар для zCHESNOKz

Регистрация: May 2013
Адрес: (0, 0)
Сообщений: 176
Цитата:
Сообщение от callme Посмотреть сообщение
Каждый раз после сортировки надо выполнять вот этот код:
Код AS3:
for (var i:int = 0; i < clips.length; i++) 
{
    addChild(clips[i]);
}
Тоже мелькало в голове. Большое спасибо это именно то что мне нужно было)

И в правду, насколько это будет пагубно влиять на производительность? Если допустим объектов будит до 30, не говорю уже больше 100. А можно ли это использовать в изометрии? Там ведь тоже много объектов. Или в изометрии все как то иначе?


Последний раз редактировалось zCHESNOKz; 04.12.2015 в 11:49.
Старый 04.12.2015, 11:47
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 17  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
и 30 и 100 объектов - это ничто. У меня в игре сортировалось около тысячи объектов при 30 кадрах в секунду. При этом fps не проседал (хотя сортировка у меня была выборочная, алгоритм ниже), учитывая даже то, что там еще и постоянное взаимодействие с сервером и бокс2д (который, как известно, довольно тупой)
Игрушка браузерная. Для мобил могут быть затупы при таких объемах как у меня. Но если использовать старлинг, то у него есть уже встроенный метод sortChildren(), который работает довольно быстро

Код AS3:
children.sortOn("y", Array.NUMERIC);
i = children.length;
while (i--) {
	var childIndex:int = _container.getChildIndex(children[i]);
	if (childIndex != i) {
		_container.setChildIndex(children[i], i);
	}
}
А сам массив children, как я уже говрил, собирается при переопределении методов addChild() / removeChild()

Старый 04.12.2015, 12:12
zCHESNOKz вне форума Посмотреть профиль Отправить личное сообщение для zCHESNOKz Посетить домашнюю страницу zCHESNOKz Найти все сообщения от zCHESNOKz
  № 18  
Ответить с цитированием
zCHESNOKz
 
Аватар для zCHESNOKz

Регистрация: May 2013
Адрес: (0, 0)
Сообщений: 176
Цитата:
Сообщение от caseyryan Посмотреть сообщение
и 30 и 100 объектов - это ничто.

Только хотел спросить, может лучше писать:
Код AS3:
_container.setChildIndex(children[i], i);
вместо
Код AS3:
 addChild(clips[i]);
?

Вот еще нашел в сети называется - Z-последовательность

Код AS3:
 
function sortZ(){
    var arrayOfStuff:Vector<DisplayObject> = new Vector<DisplayObject>();
 
    var i:int;
    for(i=0;i<foreground.numChildren;i++){
        arrayOfStuff.push(foreground.getChildAt(i));
    }
 
    arrayOfStuff.sort(sortArrayByY);
 
    for(i=0;i<arrayOfStuff.length;i++){
        foreground.setChildIndex(arrayOfStuff[i],i);
    }
}
 
function sortArrayByY(valA:DisplayObject, valB:DisplayObject):int {
    if(valA.y == valB.y) return 0;
    if(valA.y > valB.y) return 1;
    return -1;
}
Как насчет использовать вектор? Он же быстрее чем Array?

Старый 04.12.2015, 17:29
Bletraut вне форума Посмотреть профиль Отправить личное сообщение для Bletraut Найти все сообщения от Bletraut
  № 19  
Ответить с цитированием
Bletraut
 
Аватар для Bletraut

Регистрация: Mar 2013
Адрес: Вне пространства.
Сообщений: 566
Отправить сообщение для Bletraut с помощью ICQ Отправить сообщение для Bletraut с помощью Skype™
Цитата:
и 30 и 100 объектов - это ничто.
Согласен, на таких объемах париться не стоит.
__________________
Я заклинаю вас действовать иначе.

Создать новую тему Ответ Часовой пояс GMT +4, время: 19:18.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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