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

neonoviiwolf 13.02.2015 05:20

Как найти слушателя?
 
В отрывке кода я создаю новый экземпляр класса, отправляю необходимые данные и создаю слушателя события. Нужно всё это, что бы разные элементы из массива (ссылки на экземпляры массива и есть "Spot") получили начальные координаты, конечные координаты и угол и начали свой движение. Но вот вопрос, а как я опосля смогу убить слушателя Энтер_фрейм, они будут появляться пачками, нужно убивать. Или придётся для каждого мувика наследовать этот класс и потом удалять (этот вариант я знаю как делать, но мороки много и добавляется ещё 7 классов).
Код AS3:

                public function fn_LocationSpot(i): void {
                        gl_variable.indexSpot = i -1;
                        var _t: int = 100;
                        var _timer: Timer = new Timer(_t, i);
                        _timer.addEventListener("timer", fn_TimerSpot);
                        _timer.start();
                }
                private function fn_TimerSpot(e: TimerEvent): void {
                        var Spot = VectorSpot[gl_variable.indexSpot];
//углы*********************************************************************************
                        var angl: Number =(Math.atan((man.y - Spot.y) / (man.x - Spot.x))) / Math.PI * 180;
                        if(angl > 0)
                                angl -= 180;
                        Spot.rotation = angl + 90;
//**************************************************************************************
                        Spot.x = man.x;
                        Spot.y = man.y;
                        _stage.addChild(Spot);
                        var j_x = (Math.random() * 1450) + 100;
                        var j_y = (Math.random() * 750) + 180;
                        playSpot = new PlaySpotClass (Spot, man.x,man.y, angl, j_x, j_y);
                        _stage.addEventListener(Event.ENTER_FRAME, playSpot.fn_play);
                        ++gl_variable.indexSpotInStage;
                        if  (gl_variable.indexSpot != 0)
                        --gl_variable.indexSpot;
                        if (gl_variable.indexSpot == 0)
                                _stage.removeEventListener("timer", fn_TimerSpot);
                                _stage.removeEventListener("timer", fn_TimerSpot);
                }
        }
}

Код AS3:

package SpotClass {
        import flash.events.Event;
        import flash.display.MovieClip;
 
        public class PlaySpotClass extends MovieClip{
                private var spot: MovieClip ;
                public var end_X: Number;
                public var end_Y: Number;
 
                public function PlaySpotClass(_spot, _x, _y, _rotation, _end_X, _end_Y) {
                        spot = _spot;
                        spot.x = _x;
                        spot.y = _y;
                        rotation = _rotation;
                        end_X = _end_X;
                        end_Y = _end_Y;
                }
                public function fn_play(e: Event):void{
                        //движение
                }
        }
}

п.с. А то мож не совсем понятно, я экземпляры playSpot создаю внутри функции, так же как и слушателя и создав ещё один, я не знаю, как мне обратиться к предыдущему

AleXXX 13.02.2015 15:41

Код AS1/AS2:

......
_stage.addChild(Spot);
......
playSpot = new PlaySpotClass (Spot, man.x,man.y, angl, j_x, j_y);
_stage.addEventListener(Event.ENTER_FRAME, playSpot.fn_play);
.....

Здесь действительно слушатели события будут создаваться пачками.Поэтому :
1) Если playSpot является наследником DisplayObject, то лучше
Код AS3:

playSpot.addEventListener(Event.ENTER_FRAME, playSpot.fn_play);

2) Если playSpot НЕ является наследником DisplayObject, то
Код AS3:

...
_stage.addEventListener(Event.ENTER_FRAME, onFrame); //единожды где-то
_callbackPool:Vector.<Function> = new Vector.<Function>()//единожды где-то
 
......
// В слушателе таймера:
........
playSpot = new PlaySpotClass (Spot, man.x,man.y, angl, j_x, j_y);
_callbackPool.push(playSpot.fn_play);
....
private function onFrame(e:Event){
  for each(var f:Function in _callbackPool){
        f();
  }
}

И главное не забывайте удалять из пула коллбэк при удалении инстанса PlaySpotClass

neonoviiwolf 13.02.2015 21:52

AleXXX спасибо!

dimarik 13.02.2015 22:36

Чтобы

neonoviiwolf 14.02.2015 02:36

Вопрос не в тему,
создаём любой слушатель, а потом можно хоть 10 раз написать removeEventListener(**) к нему, ругаться флеш не будет, с учётом того, что слушатель удалён уже с первого раза


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

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