Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Аргументы функции при запуске таймера (http://www.flasher.ru/forum/showthread.php?t=191424)

TurboDizel 04.01.2013 02:20

Аргументы функции при запуске таймера
 
В общем есть таймер timerForParts, после определенного времени выполняется функция deletePart.
Чтобы понятнее было, есть например у меня переменная temp. Я хочу чтобы эта переменная передалась той функции, которая выполнится после определенного времени пройденного таймером. Если кто все равно не понял, то вот набросал код
Код AS3:

private function some():void { //какая-то функция в классе, в которой я включаю таймер свой
  var temp:int = 0;
  var timerForParts:Timer = new Timer(5000, 1);
  timerForParts.addEventListener(TimerEvent.TIMER, deletePart);
  if (что-то) {temp = 1;} else {temp = 2;}
  timerForParts.start();
 
  function deletePart():void {
        //вот тут я хочу использовать переменную temp. Просто напрямую написать temp не получится, так как функция some успевает ещё несколько раз выполнится и изменить temp до того момента, как включится таймер.
  }


spirit2 04.01.2013 06:30

Объявите переменную на уровне класса, а не метода. И не используйте вложенные функции.

am_devcorp 04.01.2013 12:59

Кстати, в приведенном коде если внутри deletePart обратиться к temp, то все получится как хочет автор. Другое дело, компилятор ругнется на количество параметров означенной функции.

Добавлено через 3 минуты
И да- хоть оно и будет работать, вложенные функции- это в 99,9% плохая идея.

iNils 04.01.2013 13:09

Цитата:

Сообщение от am_devcorp (Сообщение 1113514)
И да- хоть оно и будет работать, вложенные функции- это в 99,9% плохая идея.

На 100%

Astraport 04.01.2013 13:19

В Старлинге сам основатель Даниэль вложенные функции использует сплошь и рядом и в примерах и в советах на форуме. Даже не знаю как к этому относиться.

strangedk 04.01.2013 14:05

Но только не путайте TIMER_COMPLETE и TIMER. Первая срабатывает на завершение работы таймера, а вторая на каждую итерацию. Учитывая что у вас количество повторений равно единице, есть резон слушать просто TIMER_COMPLETE

Код AS3:

package  
{
        import flash.display.Sprite;
        import flash.events.TimerEvent;
        import flash.utils.Timer;
 
        public class SomeClass {
                private var _timer:Timer = new Timer(5000, 1);
                private var _temp:int = 0;
 
                public function SomeClass():void {
                        _timer.addEventListener(TimerEvent.TIMER_COMPLETE, timerCompleteHandler);
                        _timer.start();
 
                        if (Math.random() > 0.5)
                                _temp = 1;
                        else
                                _temp = 2;
                }
 
                private function timerCompleteHandler(e:TimerEvent):void {
                        _timer.removeEventListener(TimerEvent.TIMER_COMPLETE, timerCompleteHandler);
 
                        trace(_temp);
                }
        }
}


iNils 04.01.2013 15:48

Цитата:

Сообщение от Astraport (Сообщение 1113518)
В Старлинге сам основатель Даниэль вложенные функции использует сплошь и рядом и в примерах и в советах на форуме. Даже не знаю как к этому относиться.

Как к тому, что все ошибаются.

TurboDizel 04.01.2013 16:13

Так если я в функции deletePart напишу напрямую temp, он же возьмет значение, которое есть в момент вызова функции deletePart. А мне нужно значение temp именно с того раза, когда я запустил таймер. Функция some несколько раз ещё может вызваться пока идет таймер.

f.g.programmer 04.01.2013 17:00

по сути вам нужен слушатель с параметром
http://www.flasher.ru/forum/blog.php?b=239
http://www.flasher.ru/forum/blog.php?b=291

strangedk 04.01.2013 17:09

Просто наследовать таймер, со своими аргументами

Код AS3:

        public class TimerPayload extends Timer
        {
                private var _payload:int;
 
                public function TimerPayload(delay:int, repeatCount:int, payload:int) {
                        super(delay, repeatCount);
 
                        _payload = payload;
                }
 
                public function get payload():int  {
                        return _payload;
                }
        }

И потом использовать так:

Код AS3:

package  
{
        import flash.display.Sprite;
        import flash.events.TimerEvent;
        import flash.utils.Timer;
 
        public class SomeClass {
                private var _timer:TimerPayload = new TimerPayload(5000, 1, 5); // Устанавливаем значение
 
                public function SomeClass() {
                        _timer.addEventListener(TimerEvent.TIMER_COMPLETE, timerCompleteHandler);
                        _timer.start();
                }
 
                private function timerCompleteHandler(e:TimerEvent):void {
                        _timer.removeEventListener(TimerEvent.TIMER_COMPLETE, timerCompleteHandler);
 
                        trace(_timer.payload); // Получаем значение
                }
        }
}



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

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