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

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

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

Регистрация: May 2008
Сообщений: 161
По умолчанию Избавиться от прохождения по все экземплярам..

В игре по уровню лазит много монстров и каждый монстр проверяет на столкновение всех остальных, как можно избавиться от проверки всех?
сейчас ето выглядит так:
Код:
for each (target in slug_array) {
				for each (other in slug_array) {
					if (other!=target) {
						bbn=1;
						var tmp_x:int=target.x;
						var tmp_y:int=target.y;
						var tmp2_x:int=other.x;
						var tmp2_y:int=other.y;
						var d:Number = Math.point_distance(tmp2_x,tmp2_y, tmp_x, tmp_y);
						
						if (d < 40) {
						...................
						}
}
}
так как монстры быстро кучкуються и фактически столкновения происходит с одними и теми же екземплярами есть идея для каждого монстра хранить список апример из 6 ближайшых мостров и проверять только их на столкновение, и обновлять его например каждые 10 шагов.
Мож есть какието идеи?


Последний раз редактировалось Tfp; 30.08.2008 в 23:14.
Старый 30.08.2008, 23:10
ramshteks вне форума Посмотреть профиль Отправить личное сообщение для ramshteks Найти все сообщения от ramshteks
  № 2  
Ответить с цитированием
ramshteks
 
Аватар для ramshteks

Регистрация: Jul 2007
Сообщений: 805
Отправить сообщение для ramshteks с помощью ICQ Отправить сообщение для ramshteks с помощью Skype™
да твой предложенный самы верный.
можно например разделить экран на какое то вколичество кусков и когда твой монстр переходит из одного в лругой записывать в один из его параметро его положение(если усков 6 то это число от 1 -6 ну или от 0-5 как удобнее) и потом проходясь по массиву с монстрами проверять этот параметр и только если они совпали только тогда делать ресурсоемкие проверки на столкновение.

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

Регистрация: Jul 2008
Адрес: Украина, Херсон
Сообщений: 635
Отправить сообщение для Division с помощью ICQ
Есть много алгоритмов оптимизации проверки столкновений на плоскости. Самый простой на мой взгляд - хеширование. То есть делим наше пространство на "клетки". Знаем, кто живёт в какой клетке. То есть при движении врагов записываем его в ту клетку, в которой он находится. Столкновения проверяются только для юнитов, которые находятся в одной или в соседних клетках. Всё очень просто. Более сложный алгоритм - quadtree, его я описывать не буду, в гугле масса информации. Также где-то здесь на форуме была статья про программирование игрушки на AS3. Там объясняется алгоритм хеширования. Плюс исходники (:
__________________
while(1) {}

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

Регистрация: May 2008
Сообщений: 161
на счет деления зоны на квадраты - с таким знаком сам такое делал, он очень хорошо подходит для статических и не особо шустрых обьектов, тут же из за того что монстры постоянно вносят - удаляют себя и соответствуюших масивов в ячейках становиться еще хуже))

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

Регистрация: Jul 2008
Адрес: Украина, Херсон
Сообщений: 635
Отправить сообщение для Division с помощью ICQ
Цитата:
на счет деления зоны на квадраты - с таким знаком сам такое делал, он очень хорошо подходит для статических и не особо шустрых обьектов, тут же из за того что монстры постоянно вносят - удаляют себя и соответствуюших масивов в ячейках становиться еще хуже))
Если правильно сделать, будет работать шустрее.
__________________
while(1) {}

Старый 31.08.2008, 01:28
BlooDHounD вне форума Посмотреть профиль Отправить личное сообщение для BlooDHounD Посетить домашнюю страницу BlooDHounD Найти все сообщения от BlooDHounD
  № 6  
Ответить с цитированием
BlooDHounD
стервочка (я мужик)
 
Аватар для BlooDHounD

блогер
Регистрация: Mar 2004
Адрес: Борисов
Сообщений: 3,161
Записей в блоге: 22
http://noregret.org/tutor/n/

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

Регистрация: May 2008
Сообщений: 161
BlooDHounD, енто я прочитал первым делом))

Старый 31.08.2008, 05:59
VovkaMorkovka вне форума Посмотреть профиль Отправить личное сообщение для VovkaMorkovka Найти все сообщения от VovkaMorkovka
  № 8  
Ответить с цитированием
VovkaMorkovka
[+3 13.02.08]

Регистрация: Apr 2006
Сообщений: 421
На счет разбития игрового поля, делать это надо так: есть масив локаций (в самом простом случае это квадраты, но могут быть и другие фигуры, главное, что они односвязные) При движении каждый бот проверяет в какой локации он находится и если перешел из одной локации в другую перезаписывает себя. Если бот находится в двух и более локациях одновременно, то соотвктственно вписвает себя в две и более локаций. При проверке столкновений идем циклом не по ботам, а по локациям, соответственно, если в локации ботов нет, то проверять ее не надо. Ну вот, как - то так

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

Регистрация: Jul 2008
Адрес: Украина, Херсон
Сообщений: 635
Отправить сообщение для Division с помощью ICQ
И ещё кое-что.
Цитата:
Math.point_distance
Я так понял, это расстояние между точками?
В таких случаях лучше использовать для проверки не расстояние, а квадрат расстояния - тем самым избавляемся от квадратного корня. Ну и естественно будет
Код:
	if (d < 1600) {
	...................
	}
__________________
while(1) {}

Старый 31.08.2008, 13:13
BlooDHounD вне форума Посмотреть профиль Отправить личное сообщение для BlooDHounD Посетить домашнюю страницу BlooDHounD Найти все сообщения от BlooDHounD
  № 10  
Ответить с цитированием
BlooDHounD
стервочка (я мужик)
 
Аватар для BlooDHounD

блогер
Регистрация: Mar 2004
Адрес: Борисов
Сообщений: 3,161
Записей в блоге: 22
Tfp, ну если прочитали, тогда почему сделали наоборот?

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

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

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


 


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


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