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

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

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

Регистрация: Aug 2012
Сообщений: 77
По умолчанию Проблема работы с TimerEvent, Tweener'ом

Кому не лень, подскажите как дописать код или ссылку на решение проблемы в форуме, дабы реализовать задуманное...

В общем тренируюсь создавать объекты, передвигать их с помощью Tweener'а ну и так далее... создаю N-е количество шариков, размещаю их в цепочку, наводя хаотически мышку шарики разлетаются в разные стороны - это я реализовал без проблем.. теперь после разлета хочу вернуть их на место с помощью таймера.. по окончанию движения шарика, создаю и запускаю таймер для каждого шарика, но столкнулся с проблемой как передать в слушателя какой именно шарик возвращать и теперь, просто все созданные таймера срабатывают на последний шарик... в общем ниже привожу код.. возврат сделал топорным способом, нехочу так с самого начала учиться, подскажите пожалуйста как правильно сделать?)

Код AS3:
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{}
     }
}

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

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

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

Регистрация: Aug 2012
Сообщений: 77
Извините, но там нет ответа на мою проблему... перефразирую: как заменить код, приведенный ниже, слушателя события онТ, так чтобы каждый отдельно созданный таймер адекватно реагировал на каждый шарик и возвращал их на место не одновременно, а по истечении времени запуска (см. код выше):

Код AS3:
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);
       }
Спасибо.

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
каждый отдельно созданный таймер
Имелось в виду "твинер"?
Цитата:
возвращал их на место не одновременно, а по истечении времени запуска
У Вас для всех шариков ОДНОВРЕМЕННО запускаются твинеры с ОДИНАКОВЫМ временем 2.5. У Вас один таймер, который дает команду "назад". Все шарики перебираются в цикле и для каждого создается твинер с временем 2.5. Цикл занимает доли миллисекунды, все шарики стартуют одновременно и приходят одновременно.
Переформулируйте вопрос. В первом посте Вы утверждали, что двигается только один шарик, последний. Теперь говорите, что проблема в том что они заканчивают движение одновременно.
Так в чем все-таки проблема?
__________________
Reality.getBounds(this);

Старый 14.08.2012, 12:16
SpetZ_Naz вне форума Посмотреть профиль Отправить личное сообщение для SpetZ_Naz Найти все сообщения от SpetZ_Naz
  № 5  
Ответить с цитированием
SpetZ_Naz

Регистрация: Aug 2012
Сообщений: 77
Спасибо за поддержку))

Цитата:
У Вас один таймер, который дает команду "назад"
Извините, но это не так.. если бы я записал вот эту строчку:

Код AS3:
var timer:Timer = new Timer(3000,1);
... в глобальной переменной, тоесть до метода-конструктора "FirstExperiment", то да, был бы один таймер, но так как я создаю таймер по наведении мыши, то для каждого шарика у меня свой персональный таймер должен быть, со своим TIMER_COMPLETE... по идее..

Цитата:
В первом посте Вы утверждали, что двигается только один шарик, последний
Да, один, последний, так как первоначально код выглядел так (упущу лишнее ):

Код AS3:
   // код создания шариков и срабатывания 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{}
     }
}
Далее я измучил в кровь свои мозги, но так и не смог заставить шарики вернуться обратно по очередности их разлета и реализовал "топорный" способ, просто прогнав циклом Твинер с перебором всех шариков, но это тупо:

Код AS3:
 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);
       }
А должно быть так - навел мышку на шарик, он улете, таймер для него создался, запустился, прошло 3 секунды, он бац и сам вернулся... это для одного шарика, а у меня их туча и для каждого должен создаться свой таймер и эти таймера должны запоминать первоначальную позицию потревоженного шарика и вернуть его на место...

Фух, ну вроде доходчиво попытался изложить проблему)) жду советов, спасибо

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
У нас с Вами очень интересный диалог получился. Вы отрицаете все, что я говорю.
У Вас ОДИН таймер запускает движение назад для всех шариков. Я не понимаю, как Вы с этим спорите, если в коде хендлера таймера, созданного при нажатии на шарик, в ЦИКЛЕ перебираются ВСЕ шарики, и каждый отправляется назад.
Вам не понравилась ссылка на блог -De-, хотя там приведено несколько вариантов решения именно Вашей проблемы. Ваша проблема — связать шарик, на который нажали, с таймером, который при этом создается. Чтобы на событие таймера в хендлере этого события понять, какой именно шарик должен возвращаться, а не возвращать их все. Это именно то, что описано в блоге. Наиболее подходящее решение в данном случае (по моему мнению) — Dictionary. В хендлере клика Вам известны и шарик и только что созданный таймер. Занесите шарик в Dictionary по ключу-таймеру. Когда таймер сработает, в хендлере этого события заберите из Dictionary ссылку на шарик по ключу event.target (сработавший таймер). И вешайте на шарик твин домой. Вместо массива с начальными координатами при создании шариков заносите их позиции в Dictionary по ключу-шарику.
Код AS3:
_dictionary[ball] = [ball.x, ball.y];
Код AS3:
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.
Старый 14.08.2012, 16:57
MINASTIS вне форума Посмотреть профиль Отправить личное сообщение для MINASTIS Посетить домашнюю страницу MINASTIS Найти все сообщения от MINASTIS
  № 7  
Ответить с цитированием
MINASTIS
 
Аватар для MINASTIS

Регистрация: Jan 2006
Адрес: Сургут
Сообщений: 897
Отправить сообщение для MINASTIS с помощью Skype™
Хм... А как насчет создать отдельный класс с шариком. Там уже на ROLL_OVER делать "улет в другое место", а по таймеру, созданному внутри класса, возвращать. Нет?
Удобно же.

Старый 14.08.2012, 17:45
MINASTIS вне форума Посмотреть профиль Отправить личное сообщение для MINASTIS Посетить домашнюю страницу MINASTIS Найти все сообщения от MINASTIS
  № 8  
Ответить с цитированием
MINASTIS
 
Аватар для MINASTIS

Регистрация: Jan 2006
Адрес: Сургут
Сообщений: 897
Отправить сообщение для MINASTIS с помощью Skype™
Вам нужно примерно такое?
Вложения
Тип файла: zip balls.zip (5.9 Кб, 33 просмотров)

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

Регистрация: Aug 2012
Сообщений: 77
Цитата:
У нас с Вами очень интересный диалог получился
Да, возможно, я не опытный пока что, не судите строго) спасибо за разъяснения, попробую применить данный вид массивов..)

Цитата:
Вам нужно примерно такое?
Да, именно это хочу реализовать, но еще сложней - после разлета они тоже должны быть активны и на мышь реагировать также, разлетаться, но возвращаться в первоначальное положение) так сказать, первая часть задуманного)

хочется видеть код прикрепленной флешки, если можно)

Старый 14.08.2012, 19:42
MINASTIS вне форума Посмотреть профиль Отправить личное сообщение для MINASTIS Посетить домашнюю страницу MINASTIS Найти все сообщения от MINASTIS
  № 10  
Ответить с цитированием
MINASTIS
 
Аватар для MINASTIS

Регистрация: Jan 2006
Адрес: Сургут
Сообщений: 897
Отправить сообщение для MINASTIS с помощью Skype™
Минутку, вы хотите, чтобы их можно было вообще раскидывать, не 1 раз? И они бы все равно, к примеру, собирались в полоску шариков, да?
Странно, не вижу в этом особой красоты.
Вот класс RandomBall, вы можете в нем добавить тогда перезапуск таймера при новом наведении на мышь. Если мышку не наводить, они начнут возвращаться. Вообще будет просто в этом классе все доделать, как вы сказали, там все логически понятно и названия функций написал понятно

В главном классе достаточно создать RandomBall и добавить его на сцену.
Вложения
Тип файла: zip RandomBall.zip (728 байт, 35 просмотров)

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

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

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


 


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


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