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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 06.05.2012, 02:03
XimiKDeniS вне форума Посмотреть профиль Отправить личное сообщение для XimiKDeniS Найти все сообщения от XimiKDeniS
  № 1  
Ответить с цитированием
XimiKDeniS

Регистрация: Mar 2012
Сообщений: 58
По умолчанию Алгоритм нахождения соседних объектов

Здравствуйте.
Суть вопроса. Есть несколько объектов на сцене, каждый объект имеет имя. Надо узнать наиболее быстрым способом имена объектов которые находятся в определенном радиусе от определенной точки.
Код AS3:
for (I=0; I<n; I++)
{
trace(getChildByName(I).x)
}
Насколько помню было примерно так, только вместо trace происходила проверка на близость. Извините если будут ошибки, но ни компилятора, ни банальной проверки на синтаксис нет. По сути приходилось перебирать все элементы на сцене. Кажется, что это немного не рационально. И еще, желательно не использовать отправки событий, писать почему-нудно и бестолково, можете рассценивать как прихоть)))
Заранее спасибо.

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

Регистрация: Aug 2008
Адрес: Рязань
Сообщений: 723
сколько объектов может быть максимально?
статичные ли они или движутся?
__________________
low +

Старый 06.05.2012, 02:33
alexxus вне форума Посмотреть профиль Отправить личное сообщение для alexxus Найти все сообщения от alexxus
  № 3  
Ответить с цитированием
alexxus

Регистрация: Dec 2010
Сообщений: 16
Если объектов много, а их положение дискретно (по клеткам), тогда м.б. завести массив-карту "поля", в элементы оного записывать "id" объектов. А потом производить мониторинг массива в необходимом радиусе клеток вокруг искомого объекта.

Старый 06.05.2012, 10:28
XimiKDeniS вне форума Посмотреть профиль Отправить личное сообщение для XimiKDeniS Найти все сообщения от XimiKDeniS
  № 4  
Ответить с цитированием
XimiKDeniS

Регистрация: Mar 2012
Сообщений: 58
Максимальное число не оговаривалось, но думаю в пределах тысячи и да, они движутся.
alexxus, спасибо, вариант понравился, но движение персонажей происходит по 5 пикселей, к карта может быть ну очень большая, гдет до 10 тысяч и хранить 2000 координат не улыбается. Хотя все равно спасибо, приму на заметку.

Старый 06.05.2012, 11:06
alexxus вне форума Посмотреть профиль Отправить личное сообщение для alexxus Найти все сообщения от alexxus
  № 5  
Ответить с цитированием
alexxus

Регистрация: Dec 2010
Сообщений: 16
Любопытная задача. Это какая-то модель броуновского движения получается.
Каковы размеры объектов?

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

Старый 06.05.2012, 22:05
XimiKDeniS вне форума Посмотреть профиль Отправить личное сообщение для XimiKDeniS Найти все сообщения от XimiKDeniS
  № 6  
Ответить с цитированием
XimiKDeniS

Регистрация: Mar 2012
Сообщений: 58
Думал обойдется без подробностей, ну да ладно.
Есть несколько персонажей на экране. Они управляются с разных компьютеров т е с клиентов, а этот обсчет происходит на сервере(Поэтому невидимую часть упрощать не получится) (не переносил в серверную часть форума ибо подобная задача и в actionscript решение иметь должна, а у флешеров имхо под это дело больше мозг заточен). Ну так вот, на этих персонажей проходит некоторый массовый удар. И нужно узнать на какого персонажа попадет удар, на какого нет. Тут собственно и понятно, что это должно быть наиболее быстродейственным способом и наверняка мой способ не пойдет, т к для каждого персонажа просчитывать слишком медлительно. Надеюсь все более-менее понятно объяснил.

Старый 06.05.2012, 23:34
ramshteks вне форума Посмотреть профиль Отправить личное сообщение для ramshteks Найти все сообщения от ramshteks
  № 7  
Ответить с цитированием
ramshteks
 
Аватар для ramshteks

Регистрация: Jul 2007
Сообщений: 805
Отправить сообщение для ramshteks с помощью ICQ Отправить сообщение для ramshteks с помощью Skype™
Вам так или иначе придется пробегаться по какому-то массиву данных. Это априори известно и с этим придется смириться. Единственно это можно просто попытаться этот процесс оптимизировать. Как вариант самый пожалуй простой поделить поле на несколько под-полей. Объект сдвинулся - вы определили к какому полю он относится. При "ударе" вы определяете в какое под-поле он попал, из радиуса удара, выясняете дополнительные поля попадающие под проверку и проверяете только несколько полей.

Это хороший способ если ваши юниты равномерно распределены по экрану. И при делении этого экрана скажем на 9 частей, в каждой из которых будет где то по X = 2000/9 юнитов, то в худшем случае, вам придется просчитать 4*X юнитов, что гораздо лучше чем все 2000. Нельзя забывать про накладные расходы связанные с определением привязки юнита к конкретному под-полю. Так же такое решение имеет нюанс: размер подполя. Его нужно подбирать экспериментально и исходя из вашей задачи(вам все таки лучше знать). Слишком большие под-поля, просто не дадут прироста в скорости, маленькие увеличат накладные расходы на переопределение причастности юнита к под-полю.

Конечно нужно полагать что скорее всего распределение не будет равномерным и в каких то под-полях будет группироваться бОльшая часть юнитов, что может полностью свести на нет описанную оптимизацию.

И уж если по хорошему, то подобная вещь должна решаться все таки на сервере.

Старый 07.05.2012, 00:26
XimiKDeniS вне форума Посмотреть профиль Отправить личное сообщение для XimiKDeniS Найти все сообщения от XimiKDeniS
  № 8  
Ответить с цитированием
XimiKDeniS

Регистрация: Mar 2012
Сообщений: 58
Большое спасибо за разъяснение. Значит по сути ход мыслей у меня был верный. И кстати последнее предложение меня немного удивило, то что рассчет этого происходил на клиенте и речи быть не может. Вся, абсолютно вся механика должна лежать на сервере. Это должно быть ясно человеку который все таки занялся написанием сетевой игры. Так что это предложение я могу рассценивать только как совет начинающим игроделам которые забрели на этот форум.

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

Регистрация: Jul 2007
Сообщений: 805
Отправить сообщение для ramshteks с помощью ICQ Отправить сообщение для ramshteks с помощью Skype™
Цитата:
Сообщение от XimiKDeniS Посмотреть сообщение
И кстати последнее предложение меня немного удивило, то что рассчет этого происходил на клиенте и речи быть не может. Вся, абсолютно вся механика должна лежать на сервере. Это должно быть ясно человеку который все таки занялся написанием сетевой игры. Так что это предложение я могу рассценивать только как совет начинающим игроделам которые забрели на этот форум.
Возможно я просто неправильно вас понял или не вас, может просто что-то перепутал =)

Добавлено через 6 минут
Кстати есть небольшой хак, который поможет вам определять попадание юнита в область удара. Скорее всего вы будете дистанцию между эпицентром и самим юнитом, с помощью того же "пифагора" и сравнивать эту дистанцию с радиусом удара. Так вот вы можете сравнивать не реальные радиусы, а квадраты радиусов. Так вы сможете избежать вычисления квадратного корня при расчете гипотенузы(радиус вектора до юнита от эпицентра удара)

Старый 07.05.2012, 01:48
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 10  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Если объектов много, а двигаются они не часто - можно использовать рб-дерево, где за единицу измерения принять угол (синус угла, например) от верхнего правого края сцены до центра объекта. Таким образом можно будет легко выделить те объекты, которые потенциально находятся в нужном диапазоне.
Возможно даже два дерева было бы лучше (из двух углов сцены) - в таком случае искомые предметы были бы на пересечении множеств веток дерева.
Опять же, такая сложность может быть неоправданной, когда объектов мало, (до 1000 я бы не заморачивался, ну только если ради того, чтобы заморочиться ).

чтобы себе это нагляднее предсавить - так вроде в войну искали партизанские радиостанции - две антены на расстоянии друг от друга начинали двигаться, и если сигнал неравномерно усиливался / уменьшался для них - то меняли направление движения, пока сила сигнала не была одинаковой (после чего уже ничего не стоило обнаружить реальное расположение радиостанции).
__________________
Hell is the possibility of sanity


Последний раз редактировалось wvxvw; 07.05.2012 в 01:52.
Создать новую тему Ответ Часовой пояс GMT +4, время: 21:22.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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