Показать сообщение отдельно
Старый 15.03.2012, 21:29
Monade 2 вне форума Посмотреть профиль Отправить личное сообщение для Monade 2 Найти все сообщения от Monade 2
  № 1  
Ответить с цитированием
Monade 2
 
Аватар для Monade 2

Регистрация: Apr 2011
Сообщений: 38
По умолчанию адекватный опрос объектов

здравствуйте! пишу игрушку-стрелялку с видом сверху. очень интересует ваш опыт.

при инициализации "раунда" в классе Game (создается новый экземпляр при каждом новом раунде) заполняется массив obj со ссылками на собственно человечков, снаряды и т.д. то есть перед началом раунда имеется массив:

Код AS3:
obj[0] = [ object Guy ];
obj[1] = [ object Guy ];
и т.д.
также есть вспомогательный массив free_obj, который хранит в себе булевы значения true/false, длина такая же, как и у obj. если free_obj[ n ] == false, этот объект опрашивается. если true, объекта как бы уже нет (погиб например), и опрос не производится.

функция ongoing класса Game вызывается через ENTER_FRAME 36 раз в секунду и вызывает соответствующую функцию main каждого человечка/снаряда, которой передаются нажатия клавиш (если человечек - главный герой, то есть управляемый игроком).

в ней изменяются координаты соответственно модели поведения и производится расчет пересечений/столкновений с другими объектами. то есть если у нас 10 объектов, опрос будет выглядеть так: 1 объект опрашивает 2,3,4...10й, потом второй объект опросит 1,3,4...10й и так далее.

расчет столкновений реализован так - если расстояние между двумя объектами больше определенного значения (как правило, двойной диаметр опрашиваемого плюс скорость по модулю), сравниваются значения координат/ширины/высоты и отправляется ответ от функции - было столкновение, или не было. то есть если первый объект в одном конце экрана, а второй в другом, они друг друга опрашивать не будут.

раз в 4-5 секунд производится оптимизация массива, например, если у нас было 4 объекта-человечка, которые постоянно стреляют, то при генерации нового снаряда само собой увеличивается длина массива. потом (после взрыва снарядов) эти элементы уже не нужны, потому что указывают на null, и массив перестраивается - остаются только не-null-значения.

производительность этого движка меня как-то не устраивает.

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


Последний раз редактировалось Monade 2; 15.03.2012 в 21:37.