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

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

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

Регистрация: Sep 2011
Адрес: Россия
Сообщений: 8
По умолчанию Задержка движения объектов.

Всем привет. Прошу помочь мне разобраться с проблемой. У меня есть массив движущихся в одном направлении объектов.
[IMG]http://higgs.**********/38186309/image.png[/IMG]
Когда один из объектов достигает некой точки (обозначенной стрелкой), то он останавливается на произвольный промежуток времени (1-2 секунды), а затем продолжает движение. Объекты независимы друг от друга. У меня всё никак не выходит реализовать параллельную задержку каждого отдельного объекта. Ведь если я буду связывать каждый объект с очередным экземпляром таймера - то это может очень сильно повлиять на производительность. Да и получается, что одним таймером для одного объекта не обойтись, ведь остановить его мало - нужно ещё продолжить "плавание".
Есть вариант попробовать написать класс с методом, который и будет проводить смещение. И вызывать этот метод у всех объектов пробегаясь по ним в цикле одного единственного таймера. Это выглядит грамотно, но каким образом я буду делать задержку при достижении необходимой позиции? "Вешать циклом"? А если приложение будет выполняется на мощной машине и он прогонит его намного быстрее чем нужно или наоборот?
Я думаю, что кто-то уже сталкивался с подобным, но к сожалению, я ничего не нашёл.


Последний раз редактировалось Cross AssembleR; 20.05.2012 в 20:38.
Старый 11.01.2012, 19:29
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 2  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Цитата:
"Вешать циклом"?
Плохая идея. В АС3 это не прокатит. Лучше создать переменную счетчик. Если объект останавливается, ее значение начинает приростать, и по достижении определенной величины значения этой переменной, объект снова начинает двигаться.

Старый 13.01.2012, 18:51
Cross AssembleR вне форума Посмотреть профиль Отправить личное сообщение для Cross AssembleR Найти все сообщения от Cross AssembleR
  № 3  
Ответить с цитированием
Cross AssembleR

Регистрация: Sep 2011
Адрес: Россия
Сообщений: 8
Вот продолжаю биться над вопросом. Сделал по совету goodguy переменную-счётчик. Но у меня останавливаются всё объекты разом, опять никакой параллельности не вышло.
Вот сам метод, который и производит смещение объекта (вызывается в таймере).
Код AS3:
public function ObjectMove ():void {
 if (this.x != 150) //Пока объект не достиг контрол. точки он двигается. 
  this.x ++;
 if (this.x == 150) {//Если достиг, то запускается счётчик
   for (var i = 0; i < 1500; i++) {
    index++;
 if (index == 1500) {//Когда счётчик достигает конечно значения - смещаем объект
  this.x = this.x + 1;//и движение возобновляется. 
      } 
    }
  }
 }
А вот вызов метода с "пробежкой" по всем объектам:
Код AS3:
public function MainTime (event:TimerEvent) :void {
for (var i = 0; i < 5; i++) 
ArrayObject[i].ObjectMove();
 }
Выходит, что вызов метода движения происходит вроде бы как и для каждого экземпляра класса, но на деле получается совсем другой эффект. Подскажите, что я делаю не так?


Последний раз редактировалось Cross AssembleR; 13.01.2012 в 19:22.
Старый 13.01.2012, 19:10
Dukobpa3 вне форума Посмотреть профиль Отправить личное сообщение для Dukobpa3 Найти все сообщения от Dukobpa3
  № 4  
Ответить с цитированием
Dukobpa3
 
Аватар для Dukobpa3

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
счетчик не рулит.

Фишка в том что функция не вернет управление наружу пока счетчик не досчитает.

Нужно сделать в каждом объекте некий чекер который будет указывать на то что объект в данный момент на паузе.

Код AS3:
public function ObjectMove ():void 
{
 
	if(!this.paused)
	{
		if (this.x == 150) 
		{
			this.paused = true;//Пока объект не достиг контрол. точки он двигается. 
		}
		this.x ++;
	}
	else
	{
		index++;
		if (index == 1500) 
		{//Когда счётчик достигает конечно значения - смещаем объект
			this.paused = false;//и движение возобновляется. 
		} 
	}
 
 }
Добавлено через 4 минуты
Ну вернее сам то счетчик рулит только организован был неверно))
__________________
Кто к нам с чем для чего - тот у нас того от того.

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

Регистрация: Nov 2010
Сообщений: 150
Зачем вообще счетчик то...
Код AS3:
 
private var _paused:Boolean = false;
 
public function ObjectMove():void
{
    if (_paused)
        return;
   this.x ++;
   if (x == 150)//здесь условие остановки, маг цифру 150 лучше вынести
   {    
       _paused = true;
        var time:Number = 2;//время задержки в секундах
        setTimeout(function():void { _paused = false; }, time * 1000);
    }
}
Вместо setTimeout адобе обычно рекомендует использовать класс Timer, но для простоты и так сойдет.

Старый 13.01.2012, 19:37
Cross AssembleR вне форума Посмотреть профиль Отправить личное сообщение для Cross AssembleR Найти все сообщения от Cross AssembleR
  № 6  
Ответить с цитированием
Cross AssembleR

Регистрация: Sep 2011
Адрес: Россия
Сообщений: 8
Dukobpa3, Stitch512 спасибо вам ребята, оба примера взлетели. А за такую вот конструкцию
Код AS3:
 setTimeout(function():void { _paused = false; }, time * 1000);
я и не знал.

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

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
ты с этой конструкцией аккуратнее.
В данном конкретном примере норм, но вообще это анонимная функция и использование анонимных функций зачастую себя не оправдывает ибо влечет за собой пачку потенциальных глюков сложно вылавливаемых, если не понимаешь механизма.
__________________
Кто к нам с чем для чего - тот у нас того от того.

Старый 13.01.2012, 19:45
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 8  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Цитата:
Зачем вообще счетчик то...
Затем, что чем больше таймеров и слушателей их событий, тем хуже это влияет на производительность. Автор темы правильно решил все выполнять с помощью одного таймера

Старый 13.01.2012, 19:46
Stitch512 вне форума Посмотреть профиль Отправить личное сообщение для Stitch512 Найти все сообщения от Stitch512
  № 9  
Ответить с цитированием
Stitch512

Регистрация: Nov 2010
Сообщений: 150
Уху, я их обычно и не использую, только в простых случаях, как здесь собственно. По хорошему вместо setTimeout надо использовать таймер и соответственно подписываться на событие.

Добавлено через 3 минуты
На производительность он особо не повлияет, сколько таймера не использовал - не заметил визуального падения производительности, тем более что они срабатывают только один раз и на пару секунд и в один момент времени будет работать 2-3 таймера т.к. объекты движутся с интервалом. И вместо движения по таймеру лучше использовать расчет позиции на основе прошедшего времени - тогда движение будет более плавным, не зависит от фпс и опять же мы избавимся от лишнего таймера.

Старый 13.01.2012, 19:55
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 10  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Цитата:
На производительность он особо не повлияет, сколько таймера не использовал - не заметил визуального падения производительности
Согласен. Конкретно в этом случае можно и таймер использовать. Но все-таки таких конструкций лучше избегать

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

Теги
движение объектов

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

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


 


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


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