Каков наилучший способ расчета ограничивающего прямоугольника вокруг группы объектов DisplayObject? - PullRequest
0 голосов
/ 27 января 2010

У меня есть массив спрайтов на сцене, и я хочу теперь прямоугольник, который их ограничивает. Я мог бы сделать цикл и проверить getBounds () каждого элемента, но это может быть вычислительно дорого. Есть ли лучший способ сделать это?

Ответы [ 3 ]

1 голос
/ 27 января 2010

Вы можете поместить их всех внутри Спрайта и получить ограничительную рамку этого спрайта.

0 голосов
/ 10 сентября 2014
var child:DisplayObject = ...
var parent:DisplayObject = new Sprite();  // should be the parent object.
var bounds:Rectangle = child.getBounds(parent)

См .: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/DisplayObject.html#getBounds()

0 голосов
/ 13 сентября 2013

Вы можете распределить нагрузку для этой операции по времени, сохранив еще два массива, один для строк пикселей и один для столбцов пикселей, поэтому для этапа 800x600 у вас будет массив xBounds из 800 элементов и массив yBounds из 600 элементов.

Каждый элемент каждого массива будет массивом ссылок на все спрайты, у которых есть граница, попадающая на этот пиксель (или ноль, если ни один не использует этот столбец / строку). Таким образом, каждый спрайт будет иметь две записи в каждом массиве; один для минимального х связанного, один для макс.

Каждый раз, когда вы перемещаете, изменяете размер, поворачиваете или иным образом изменяете границы спрайта, вам придется обновлять эти списки, удаляя старые значения min и max из каждого из ваших двух списков и добавляя их в на новых позициях.

Таким образом, ваши общие границы для всех спрайтов на экране - это просто самые низкие и самые высокие используемые индексы в каждом из этих двух массивов.

Для дополнительной скорости вы, скорее всего, также захотите сохранить минимальное и максимальное значения для x и y и изменять их только в том случае, если действие спрайта изменит их. Таким образом, если спрайт помещен ниже минимума или выше максимума, вы можете обновить значение простым присваиванием нового минимума или максимума; и если спрайт был единственным элементом в массиве для текущего минимального столбца и был перемещен выше, то вы должны выполнить цикл от старого минимума до новой позиции спрайта и установить новый минимум для первого занятого элемента массива (и то же самое, но напротив столбца max).

Используя массивы, это решение будет использовать пару килобайт памяти, и иногда требуется зацикливание на части массива. Более оптимально, вы можете заменить массивы классом «отсортированный список»: вероятно, не стоит времени разработчика / сопровождающего для дополнительной сложности, но использование некоторой формы самобалансирующегося двоичного дерева может добавить небольшую скорость и сэкономить немного памяти, что может иметь значение, если у вас много спрайтов, часто перемещающихся, с большим экраном, медленным процессором и небольшим объемом памяти.

В любом случае, обязательно обработайте случай, когда массивы пусты, потому что спрайты не отображаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...