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

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

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

Регистрация: Oct 2013
Сообщений: 126
По умолчанию определение ближайшей точки на оси

Из-за правого края экрана появляются объекты и движутся влево. Периодически скорость каждого из объектов произвольно меняется, таким образом объекты могут "обгонять" друг друга. Для обновления объектов у меня был такой вот код:
Код AS3:
// Обновление объектов, вызываемое enter_frame
private function update_ob(): void{
	var obL:uint = _obs.length - 1 // все объекты при появлении заносятся в массив _obs 
	// обновление каждого из объектов
	for (var i:int=obL;i>=0;i--){
		var ob:Ob=_obs[i]; // заносим текущий объект в переменную для дальнейшего упоминания
		// убиваем или двигаем объект при помощи соответствующей функции
		obMove(ob, i);
	};
};
Мне требовалось вычислить, какой из объектов находится левее всех. Для этого я заношу координаты всех объектов в отдельный массив и ищу в нём минимальное число. Получилось следующее:
Код AS3:
// Обновление объектов, вызываемое enter_frame
private function update_ob(): void{
	var obL:uint = _obs.length - 1 // все объекты при появлении заносятся в массив _obs 
	var obx:Array = []; // массив с координатами объектов
	// обновление каждого из объектов
	for (var i:int=obL;i>=0;i--){
		var ob:Ob=_obs[i]; // заносим текущий объект в переменную для дальнейшего упоминания
		// убиваем или двигаем объект при помощи соответствующей функции
		obMove(ob, i);
		obx.push(ob.x); // вносим в массив координаты врагов	
	};
 
	// определяем самого левого
	var minx:Number = Math.min.apply(null, enx); // в массиве с координатами находим наименьшее число
	// рисуем индикатор над ближайшим объектом (для проверки)
	_encl.x = minx; // _encl - объект класса Shape
};
Вопрос несоизмеримо короче, чем вступление к нему: является ли данный способ определения ближайшего к началу координат объекта из массива самым быстрым, или лучше сделать по-другому? (уж больно странным мне кажется занесение координат в отдельный массив с последующей их там проверкой)

Старый 05.12.2013, 17:43
Isfet вне форума Посмотреть профиль Отправить личное сообщение для Isfet Найти все сообщения от Isfet
  № 2  
Ответить с цитированием
Isfet

Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
ну как минимум нужно использовать вектор вместо массива, а дельше нужно исходить из максимального количества врагов

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Почему бы не делать проверку сразу на ходу?
Код AS3:
	var minx:Number = _obs[obL].x;
	// обновление каждого из объектов
	for (var i:int=obL;i>=0;i--){
		var ob:Ob=_obs[i]; // заносим текущий объект в переменную для дальнейшего упоминания
		// убиваем или двигаем объект при помощи соответствующей функции
		obMove(ob, i);
		if(ob.x < minx) minx = ob.x;	
	};
	_encl.x = minx; // _encl - объект класса Shape
__________________
Reality.getBounds(this);

Старый 05.12.2013, 19:04
a7s1h1 вне форума Посмотреть профиль Отправить личное сообщение для a7s1h1 Найти все сообщения от a7s1h1
  № 4  
Ответить с цитированием
a7s1h1

Регистрация: Oct 2013
Сообщений: 126
Цитата:
Сообщение от Isfet Посмотреть сообщение
ну как минимум нужно использовать вектор вместо массива, а дельше нужно исходить из максимального количества врагов
Максимальное количество врагов будет исчисляться десятками (но вряд ли больше 200 одновременно)
А насчёт векторов, я уже неоднократно встречал мнение, что они быстрее массивов. Правильно ли я понимаю, что отличие массивов от векторов только в том, что в последние можно вносить только данные одного типа? (Если так, то я у меня все массивы можно перевести в векторы, но это я оставил на потом, когда буду заниматься оптимизацией)

Цитата:
Сообщение от Wolsh Посмотреть сообщение
Почему бы не делать проверку сразу на ходу?
Спасибо за подсказку! Так действительно короче. Всё оказалось так лаконично - класс!
Только пришлось добавить проверку длины массива, чтобы не возникало ошибки из-за отсутствия в нём элементов, когда враги ещё не появились:
Код AS3:
// если в массиве есть элементы - делаем ближайшим последний объект в массиве, иначе помещаем маркер за правый край экрана
var minx:Number = (obL >= 0)?(_obs[obL].x):(W+100);

Старый 05.12.2013, 19:08
Isfet вне форума Посмотреть профиль Отправить личное сообщение для Isfet Найти все сообщения от Isfet
  № 5  
Ответить с цитированием
Isfet

Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
Цитата:
Сообщение от a7s1h1 Посмотреть сообщение
Правильно ли я понимаю, что отличие массивов от векторов только в том, что в последние можно вносить только данные одного типа?
Да, это так.

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
Только пришлось добавить проверку...
Код AS3:
var minx:Number = Number.POSITIVE_INFINITY;
__________________
Reality.getBounds(this);

Старый 06.12.2013, 11:52
a7s1h1 вне форума Посмотреть профиль Отправить личное сообщение для a7s1h1 Найти все сообщения от a7s1h1
  № 7  
Ответить с цитированием
a7s1h1

Регистрация: Oct 2013
Сообщений: 126
Цитата:
Сообщение от Wolsh Посмотреть сообщение
Код AS3:
var minx:Number = Number.POSITIVE_INFINITY;
Спасибо! Непонятно (даже после гугленья), но работает) Пошёл проверять, где ещё можно такое воткнуть, вместо того, чтобы проверять массив)

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
POSITIVE_INFINITY это константа класса Number, представляющая положительную бесконечность, то есть "число, больше которого не бывает" (на самом деле бесконечность не число конечно, но может сравниваться с числами). Соответственно первый же обрабатываемый циклом элемент запишет свой .х в minx.
Есть так же Number.NEGATIVE_INFINITY — "число, меньше которого не бывает", и MAX_VALUE и MIN_VALUE, самое большое и самое маленькое число, доступное для вычислений флэшплеера. "Больше" и "меньше" этих чисел только соответствующие бесконечности.
__________________
Reality.getBounds(this);

Старый 06.12.2013, 14:35
a7s1h1 вне форума Посмотреть профиль Отправить личное сообщение для a7s1h1 Найти все сообщения от a7s1h1
  № 9  
Ответить с цитированием
a7s1h1

Регистрация: Oct 2013
Сообщений: 126
это всё я понял, вот ключевая фраза, которая была мне нужна, чтобы разобраться в механизме действия этой константы в даннм случае:
Цитата:
Сообщение от Wolsh Посмотреть сообщение
первый же обрабатываемый циклом элемент запишет свой .х в minx
... а пока число, обозначающее длину массива, не станет положительным, minx будет равняться положительной бесконечности (проверял через trace).
Ещё раз спасибо!

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

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

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


 


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


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