Flash AS3 получает ссылку на родительский кадр внутри функции - PullRequest
1 голос
/ 05 января 2012

Это мой код во Flash / AS3, в действии фрейма:

import flash.events.Event;

stop();

this.addEventListener(Event.ENTER_FRAME, loading);

function loading(e:Event):void{

    var total:Number = this.stage.loaderInfo.bytesTotal;
    var loaded:Number = this.stage.loaderInfo.bytesLoaded;

    if (total == loaded){

       var splashTimer:Timer = new Timer(3000,1);
       splashTimer.addEventListener(TimerEvent.TIMER_COMPLETE, splashTimer1);
       splashTimer.start();
       function splashTimer1(evt:TimerEvent):void
       {
          //remove the enter frame event listener here
          this.removeEventListener(Event.ENTER_FRAME, loading);
          gotoAndPlay("3");
       }

    }

}

Я хочу удалить прослушиватель события enter frame (loading ()) внутри обработчика события splashTimer перед перенаправлением накадр 3. Как видите, я использовал:

this.removeEventListener(Event.ENTER_FRAME, loading);

Но это выдает ошибку времени выполнения:

TypeError: Error #1006: removeEventListener is not a function.
    at Function/<anonymous>()
    at flash.events::EventDispatcher/dispatchEventFunction()
    at flash.events::EventDispatcher/dispatchEvent()
    at flash.utils::Timer/tick()

Это потому, что я считаю, что это относится к функции splashTimer1"this".

Как я могу ссылаться на родительский фрейм, чтобы я мог удалить его прослушиватель событий.

Пожалуйста, помогите мне.

Спасибо

Ответы [ 2 ]

1 голос
/ 05 января 2012

Я бы вытащил функцию и поместил бы ее на тот же уровень, что и loading:

this.addEventListener(Event.ENTER_FRAME, loading); 

function splashTimer1(evt:TimerEvent):void
{
   //remove the enter frame event listener here
   this.removeEventListener(Event.ENTER_FRAME, loading);
   gotoAndPlay("3");
}

function loading(e:Event):void{

var total:Number = this.stage.loaderInfo.bytesTotal;
var loaded:Number = this.stage.loaderInfo.bytesLoaded;

if (total == loaded){

   var splashTimer:Timer = new Timer(3000,1);
   splashTimer.addEventListener(TimerEvent.TIMER_COMPLETE, splashTimer1);
   splashTimer.start();

и т.д ...

, тогда this будет ссылаться на мувиклип вместо вложенной функции.

Вы также можете добавить переменную-посредник, например:

if (total == loaded){

  var splashTimer:Timer = new Timer(3000,1);
  splashTimer.addEventListener(TimerEvent.TIMER_COMPLETE, splashTimer1);
  splashTimer.start();

  var theMC:MovieClip = this;

  function splashTimer1(evt:TimerEvent):void
  {
     //remove the enter frame event listener here
     theMC.removeEventListener(Event.ENTER_FRAME, theMC.loading);
     theMC.gotoAndPlay("3");
  }

и т.д ...

но мне больше нравится первый подход.

0 голосов
/ 05 января 2012

Позвольте мне объяснить, что происходит в вашем коде.

Когда мы объявляем функцию в addEventListener , как показано ниже (или так, как вы это сделали)

object.addEventListener(event, function(){


});

функция будет создана в глобальном пространстве имен и внутри функции this будет ссылаться на глобальный объект. Обычно мы используем прокси-переменную для хранения экземпляра объекта в похожих ситуациях. Так что это можно исправить, выполнив следующее

var _this = this;
var splashTimer:Timer = new Timer(3000,1);
splashTimer.addEventListener(TimerEvent.TIMER_COMPLETE, splashTimer1);
splashTimer.start();

function splashTimer1(evt:TimerEvent):void
{
    //remove the enter frame event listener here
    _this.removeEventListener(Event.ENTER_FRAME, loading);
    gotoAndPlay("3");
}

Но обычно мы делаем это в Javascript.

Структура вашего кода должна быть изменена. Пожалуйста, ознакомьтесь с ответом @WiseOldDuck. Это способ сделать это в Actionscript

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...