Форум 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=206974)

Tetraeon 17.03.2014 13:35

Передача параметров в таймер
 
Здравствуйте, прошу помощи в такой ситуации:
Пишу функцию "пинка" в игре, которая заставляет объект-цель отлетать от объекта-источника на определенное расстояние в период действия таймера:
Код AS3:

                public static function knock(istochnik:Object, target:Object, knockPow:int, kockRight:Boolean):void
                {
                        target.fly = true;
                        if (target.x > istochnik.x)
                        {
                                if (target.sizeMob < knockPow)
                                {
                                        sk.timerKnockR.start();
                                }
                        }
                        if (target.x < istochnik.x)
                        {
                                if (target.sizeMob < knockPow)
                                {
                                        sk.timerKnockL.start();
                                }
                        }
                }

Все это сделанно универсально, чтобы передавать параметры из других классов, но возникает проблема с передачей этих же параметров исполняющему таймеру.
Код AS3:

                public static function knockRight(target:Object):void
                {
                        sk.timerKnockL.stop();    // sk - это статическая переменная (не обращайте внимания)
                        sk.timerKnockComp.start();
                        target.x +=  5 + Math.random() * 5;
                        target.gotoAndStop("knock_L");
                }

Ошибка: [TimerEvent type="timer" bubbles=false cancelable=false eventPhase=2]
ReferenceError: Error #1069: Не удалось найти свойство x в flash.events.TimerEvent; отсутствует значение по умолчанию.
Параметр target не передается, и я не знаю как нужно в таком случае его передать.

Можно было бы создать переменную в этом же классе которая бы принимала значение передаваемого параметра в статическую функцию knock(istochnik:Object, target:Object, knockPow:int, kockRight:Boolean), но в таком случае будит скопирован 1 объект, а так как под объектом-цель будит пониматься несколько объектов из массива объектов в цикле, то этот вариант не подойдет.

strangedk 17.03.2014 17:10

Наследуйтесь от Timer, и в класс-наследник добавьте переменные которые вам нужны

Tetraeon 17.03.2014 17:20

можно маленький примерчик, не совсем понял как это.

toFL 17.03.2014 17:46

Код AS3:

public static function knockRight(target:Object):void

Скорее всего это обработчик события таймера, а значит "target" это "flash.events.TimerEvent". У этого класса нет поля "x" и функции "gotoAndStop".

Tetraeon 17.03.2014 18:10

Цитата:

Сообщение от toFL (Сообщение 1161968)
Код AS3:

public static function knockRight(target:Object):void

Скорее всего это обработчик события таймера, а значит "target" это "flash.events.TimerEvent". У этого класса нет поля "x" и функции "gotoAndStop".

target:Object там конечно не в тему.. это попытка передать параметр из функции выше.

dimarik 19.03.2014 20:57

Форум Flasher.ru > Flash > ActionScript 3.0 > Статьи > Слушатель с параметром

Tetraeon 27.03.2014 14:34

Не однократно прочитал "Сушатель с параметром", либо я не понял, либо там не то, что мне нужно... Как бы параметры в простую функцию я могу без труда передать, а вот в таймер не получается. Не вижу другого способа проделать то что мне нужно без помощи таймера т.к. в определенный момент объект должен двигаться ("x" и "gotoAndStop"), а по истечению времени должен остановится.
Раньше таймер был в классе объекта (моб) и проблем небыло, но идея такая, что бы функция была универсальна для любого объекта (герой и любые мобы).
У меня мало опыта в программировании поэтому прощу прощения за непонятливость.

FlasherEgor 27.03.2014 14:50

Может быть, наследовать героя и любых мобов от какого-то класса Entity, содержащего этот метод?

Akopalipsis 27.03.2014 15:05

Вот с переопределением класса Timer -
Хотя я сейчас ещё раз перечитал и кажется не правильно Вас понял. У Вас есть один статический обработчик событий, который обрабатывает сразу много таргетов?
Код AS3:

package
{
        import flash.display.Sprite;
        import flash.events.TimerEvent;
 
        public class Main extends Sprite
        {
                private var _target:Sprite;
                public function Main()
                {
                        _target = new Sprite();
                        _target.graphics.beginFill(0xA83824);
                        _target.graphics.drawRect(0, 0, 50, 50);
                        _target.graphics.endFill();
                        _target.x = 200;
                        _target.y = 200;
                        this.addChild(_target);
 
                        var timer:SampleTimer = new SampleTimer(1000, 10, _target);
                        timer.addEventListener(TimerEvent.TIMER, timer_timerHandler);
                        timer.start();
                }
 
                private function timer_timerHandler(event:TimerEvent):void
                {
                        var object:Sprite = event.target.object as Sprite;
                        object.x += 50;
                }
        }
 
}

Код AS3:

package
{
        import flash.utils.Timer;
 
        public class SampleTimer extends Timer
        {
                private var _object:Object;
                public function SampleTimer(delay:Number, repeatCount:int=0, object:Object = null)
                {
                        _object = object;
                        super(delay, repeatCount);
                }
 
                public function get object():Object
                {
                        return _object;
                }
 
                public function set object(value:Object):void
                {
                        if (value == _object)
                        {
                                return;
                        }
                        _object = value;
                }
 
        }
 
}


Tetraeon 27.03.2014 17:19

Спасибо это вроде то что мне нужно, буду разбираться )


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

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