![]() |
|
||||||||||
|
|||||
|
Регистрация: Sep 2011
Адрес: Россия
Сообщений: 8
|
Всем привет. Прошу помочь мне разобраться с проблемой. У меня есть массив движущихся в одном направлении объектов.
[IMG]http://higgs.**********/38186309/image.png[/IMG] Когда один из объектов достигает некой точки (обозначенной стрелкой), то он останавливается на произвольный промежуток времени (1-2 секунды), а затем продолжает движение. Объекты независимы друг от друга. У меня всё никак не выходит реализовать параллельную задержку каждого отдельного объекта. Ведь если я буду связывать каждый объект с очередным экземпляром таймера - то это может очень сильно повлиять на производительность. Да и получается, что одним таймером для одного объекта не обойтись, ведь остановить его мало - нужно ещё продолжить "плавание". Есть вариант попробовать написать класс с методом, который и будет проводить смещение. И вызывать этот метод у всех объектов пробегаясь по ним в цикле одного единственного таймера. Это выглядит грамотно, но каким образом я буду делать задержку при достижении необходимой позиции? "Вешать циклом"? А если приложение будет выполняется на мощной машине и он прогонит его намного быстрее чем нужно или наоборот? Я думаю, что кто-то уже сталкивался с подобным, но к сожалению, я ничего не нашёл. Последний раз редактировалось Cross AssembleR; 20.05.2012 в 20:38. |
|
|||||
|
Banned
[+1 05.11.11]
[+1 09.08.11] Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
Цитата:
|
|
|||||
|
Регистрация: Sep 2011
Адрес: Россия
Сообщений: 8
|
Вот продолжаю биться над вопросом. Сделал по совету goodguy переменную-счётчик. Но у меня останавливаются всё объекты разом, опять никакой параллельности не вышло.
Вот сам метод, который и производит смещение объекта (вызывается в таймере). 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;//и движение возобновляется. } } } } Выходит, что вызов метода движения происходит вроде бы как и для каждого экземпляра класса, но на деле получается совсем другой эффект. Подскажите, что я делаю не так? Последний раз редактировалось Cross AssembleR; 13.01.2012 в 19:22. |
|
|||||
|
счетчик не рулит.
Фишка в том что функция не вернет управление наружу пока счетчик не досчитает. Нужно сделать в каждом объекте некий чекер который будет указывать на то что объект в данный момент на паузе. public function ObjectMove ():void { if(!this.paused) { if (this.x == 150) { this.paused = true;//Пока объект не достиг контрол. точки он двигается. } this.x ++; } else { index++; if (index == 1500) {//Когда счётчик достигает конечно значения - смещаем объект this.paused = false;//и движение возобновляется. } } } Ну вернее сам то счетчик рулит только организован был неверно))
__________________
Кто к нам с чем для чего - тот у нас того от того. |
|
|||||
|
Регистрация: Nov 2010
Сообщений: 150
|
Зачем вообще счетчик то...
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); } } |
|
|||||
|
Регистрация: Sep 2011
Адрес: Россия
Сообщений: 8
|
Dukobpa3, Stitch512 спасибо вам ребята, оба примера взлетели. А за такую вот конструкцию
я и не знал. |
|
|||||
|
ты с этой конструкцией аккуратнее.
В данном конкретном примере норм, но вообще это анонимная функция и использование анонимных функций зачастую себя не оправдывает ибо влечет за собой пачку потенциальных глюков сложно вылавливаемых, если не понимаешь механизма.
__________________
Кто к нам с чем для чего - тот у нас того от того. |
|
|||||
|
Banned
[+1 05.11.11]
[+1 09.08.11] Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
Цитата:
|
|
|||||
|
Регистрация: Nov 2010
Сообщений: 150
|
Уху, я их обычно и не использую, только в простых случаях, как здесь собственно. По хорошему вместо setTimeout надо использовать таймер и соответственно подписываться на событие.
Добавлено через 3 минуты На производительность он особо не повлияет, сколько таймера не использовал - не заметил визуального падения производительности, тем более что они срабатывают только один раз и на пару секунд и в один момент времени будет работать 2-3 таймера т.к. объекты движутся с интервалом. И вместо движения по таймеру лучше использовать расчет позиции на основе прошедшего времени - тогда движение будет более плавным, не зависит от фпс и опять же мы избавимся от лишнего таймера. |
|
|||||
|
Banned
[+1 05.11.11]
[+1 09.08.11] Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
Цитата:
|
![]() |
![]() |
Часовой пояс GMT +4, время: 13:39. |
|
|
« Предыдущая тема | Следующая тема » |
| Теги |
| движение объектов |
|
|