![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Aug 2012
Сообщений: 77
|
Кому не лень, подскажите как дописать код или ссылку на решение проблемы в форуме, дабы реализовать задуманное...
В общем тренируюсь создавать объекты, передвигать их с помощью Tweener'а ну и так далее... создаю N-е количество шариков, размещаю их в цепочку, наводя хаотически мышку шарики разлетаются в разные стороны - это я реализовал без проблем.. теперь после разлета хочу вернуть их на место с помощью таймера.. по окончанию движения шарика, создаю и запускаю таймер для каждого шарика, но столкнулся с проблемой как передать в слушателя какой именно шарик возвращать и теперь, просто все созданные таймера срабатывают на последний шарик... в общем ниже привожу код.. возврат сделал топорным способом, нехочу так с самого начала учиться, подскажите пожалуйста как правильно сделать?) package { import caurina.transitions.Tweener; import flash.display.MovieClip; import flash.display.Stage; import flash.events.Event; import flash.events.MouseEvent; import flash.events.TimerEvent; import flash.utils.Timer; public class FirstExperiment extends MovieClip { private var masXY:Array; public function FirstExperiment() { masXY = new Array(); for (var i:uint=0; i<10; i++){ var sb:SuperBall = new SuperBall(0x00ff00, 4); sb.x = 100+(sb.width*i); sb.y = 100; sb.name = i; masXY.push([sb.y, sb.x]); addChild(sb); } this.addEventListener(MouseEvent.MOUSE_OVER, onMO); } private function onMO(e:MouseEvent):void{ var target:MovieClip = new MovieClip; Tweener.addTween(e.target,{ y:Math.random()*(stage.stageHeight-30), x:Math.random()*(stage.stageWidth-30), time:2, transition:"easeInOutQuad", onComplete:Pauser()}); var timer:Timer = new Timer(3000,1); timer.start(); timer.addEventListener(TimerEvent.TIMER_COMPLETE,onT); } private function onT(t:TimerEvent):void{ var i:uint=0; do { Tweener.addTween(this.getChildAt(i),{ y:masXY[i][0], x:masXY[i][1], time:2.5, transition:"easeOutInQuad", onComplete:Pauser}); i++; } while (i<this.numChildren); } private function Pauser():void{} } } |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
__________________
Reality.getBounds(this); |
|
|||||
|
Регистрация: Aug 2012
Сообщений: 77
|
Извините, но там нет ответа на мою проблему... перефразирую: как заменить код, приведенный ниже, слушателя события онТ, так чтобы каждый отдельно созданный таймер адекватно реагировал на каждый шарик и возвращал их на место не одновременно, а по истечении времени запуска (см. код выше):
Спасибо. |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Цитата:
Цитата:
Переформулируйте вопрос. В первом посте Вы утверждали, что двигается только один шарик, последний. Теперь говорите, что проблема в том что они заканчивают движение одновременно. Так в чем все-таки проблема?
__________________
Reality.getBounds(this); |
|
|||||
|
Регистрация: Aug 2012
Сообщений: 77
|
Спасибо за поддержку))
Цитата:
... в глобальной переменной, тоесть до метода-конструктора "FirstExperiment", то да, был бы один таймер, но так как я создаю таймер по наведении мыши, то для каждого шарика у меня свой персональный таймер должен быть, со своим TIMER_COMPLETE... по идее.. Цитата:
): // код создания шариков и срабатывания MouseEvent упущу, см.выше private function onMO(e:MouseEvent):void{ var target:MovieClip = new MovieClip; Tweener.addTween(e.target,{ y:Math.random()*(stage.stageHeight-30), x:Math.random()*(stage.stageWidth-30), time:2, transition:"easeInOutQuad", onComplete:Pauser()}); var timer:Timer = new Timer(3000,1); timer.start(); timer.addEventListener(TimerEvent.TIMER_COMPLETE,onT); } private function onT(t:TimerEvent):void{ // sb - это возвращаемый на место шарик // X, Y - это соответственно первоначальные координаты, // их как-то нужно сюда еще передать при создании таймера Tweener.addTween(sb,{ y:X, x:Y, time:2.5, transition:"easeOutInQuad", onComplete:Pauser}); } private function Pauser():void{} } } private function onT(t:TimerEvent):void{ var i:uint=0; do { Tweener.addTween(this.getChildAt(i),{ y:masXY[i][0], x:masXY[i][1], time:2.5, transition:"easeOutInQuad", onComplete:Pauser}); i++; } while (i<this.numChildren); } Фух, ну вроде доходчиво попытался изложить проблему)) жду советов, спасибо |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
У нас с Вами очень интересный диалог получился. Вы отрицаете все, что я говорю.
У Вас ОДИН таймер запускает движение назад для всех шариков. Я не понимаю, как Вы с этим спорите, если в коде хендлера таймера, созданного при нажатии на шарик, в ЦИКЛЕ перебираются ВСЕ шарики, и каждый отправляется назад. Вам не понравилась ссылка на блог -De-, хотя там приведено несколько вариантов решения именно Вашей проблемы. Ваша проблема — связать шарик, на который нажали, с таймером, который при этом создается. Чтобы на событие таймера в хендлере этого события понять, какой именно шарик должен возвращаться, а не возвращать их все. Это именно то, что описано в блоге. Наиболее подходящее решение в данном случае (по моему мнению) — Dictionary. В хендлере клика Вам известны и шарик и только что созданный таймер. Занесите шарик в Dictionary по ключу-таймеру. Когда таймер сработает, в хендлере этого события заберите из Dictionary ссылку на шарик по ключу event.target (сработавший таймер). И вешайте на шарик твин домой. Вместо массива с начальными координатами при создании шариков заносите их позиции в Dictionary по ключу-шарику. private var _dictionary:Dictionary = new Dictionary(); private function onMO(event:MouseEvent):void { Tweener.addTween(event.target, { y:Math.random()*(stage.stageHeight-30), x:Math.random()*(stage.stageWidth-30), time:2, transition:"easeInOutQuad", onComplete:Pauser }); var timer:Timer = new Timer(3000, 1); _dictionary[timer] = event.target; timer.addEventListener(TimerEvent.TIMER_COMPLETE, onT); timer.start(); } private function onT(event:TimerEvent):void { var ball:SuperBall = _dictionary[(event.target)]; delete _dictionary[(event.target)]; Tweener.addTween(ball, { x:_dictionary[ball][0], y:_dictionary[ball][1], time:2.5, transition:"easeOutInQuad", onComplete:Pauser }); }
__________________
Reality.getBounds(this); Последний раз редактировалось Wolsh; 14.08.2012 в 16:19. |
|
|||||
|
Хм... А как насчет создать отдельный класс с шариком. Там уже на ROLL_OVER делать "улет в другое место", а по таймеру, созданному внутри класса, возвращать. Нет?
Удобно же. |
|
|||||
|
Вам нужно примерно такое?
|
|
|||||
|
Регистрация: Aug 2012
Сообщений: 77
|
Цитата:
Цитата:
хочется видеть код прикрепленной флешки, если можно) |
|
|||||
|
Минутку, вы хотите, чтобы их можно было вообще раскидывать, не 1 раз? И они бы все равно, к примеру, собирались в полоску шариков, да?
Странно, не вижу в этом особой красоты. Вот класс RandomBall, вы можете в нем добавить тогда перезапуск таймера при новом наведении на мышь. Если мышку не наводить, они начнут возвращаться. Вообще будет просто в этом классе все доделать, как вы сказали, там все логически понятно и названия функций написал понятно ![]() В главном классе достаточно создать RandomBall и добавить его на сцену. |
![]() |
![]() |
Часовой пояс GMT +4, время: 20:00. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|