Событие отправки в каждом кадре для MovieClip - PullRequest
1 голос
/ 26 марта 2012

У меня есть мувиклип, и мне нужно остановить фильм, когда он достигает определенного кадра. Для этого мне нужно добавить прослушиватель событий, который будет отправлять, когда этот конкретный фрагмент ролика входит в новый кадр (в отличие от всей анимации ENTER_FRAME).

bar.addEventListener(Event.ENTER_FRAME, function(e:Event) {
    var b:MovieClip = MovieClip(e.currentTarget);
    if(b.currentFrame == mp.getPopularity())
        b.stop();
});

Есть идеи?

Спасибо.

Ответы [ 2 ]

1 голос
/ 26 марта 2012

Вы должны удалить прослушиватель событий, когда он больше не нужен, иначе вы рискуете утечки памяти.Анонимная функция может сделать это трудным, хотя вы можете сделать это с arguments.callee.

bar.addEventListener(Event.ENTER_FRAME, function(e:Event) {
    var b:MovieClip = MovieClip(e.currentTarget);
    if(b.currentFrame == mp.getPopularity()){
        b.stop();
        b.removeEventListener(e.type, arguments.callee); 
            // ^^ this may work to remove your anonymous listener.
    }
});

Однако есть и другой способ сделать это.Часто ли mp.getPopularity () меняется?Если он не изменяется после того, как bar сказал play (), вы можете использовать addFrameScript.Просто помните, что addFrameScript индексируется 0, поэтому добавление скрипта в кадр 1 означает, что вы должны передать 0 ... поэтому, если какое-либо действие должно произойти в mp.getPopularity (), вам придется передать mp.getPopularity ()- 1.

var framescript:Function = function():void{
  bar.stop();
  bar.addFrameScript(bar.currentFrame-1, null); 
         // ^^ nulling the framescript after 
         // ^^ it is no longer needed.
}

bar.stop();  // Generally a good idea to call stop before calling addFrameScript

bar.addFrameScript(mp.getPopularity() - 1, framescript);

bar.gotoAndPlay(1); // or wherever it needs to start from.

Это более точное решение, но вы должны помнить о том, чтобы очистить ваш рамочный скрипт после того, как вы закончите, если вы планируете позже использовать этот же экземпляр bar с другим mpЗначение .getPopularity ().

1 голос
/ 26 марта 2012

Попробуйте;

Простая функция:

function playUntil(target:MovieClip, frame:int):void
{
    target.stopFrame = frame; // Works because MovieClip is dynamic.
    target.addEventListener(Event.ENTER_FRAME, _checkFrame);
}

С функцией прослушивания:

function _checkFrame(e:Event):void
{
    var m:MovieClip = e.target as MovieClip;

    if(m.currentFrame == m.stopFrame)
    {
        m.stop();
        m.removeEventListener(Event.ENTER_FRAME, _checkFrame);
    }
}

Примените ее ко всем своим экземплярам:

playUntil(instance1, 15);
playUntil(instance2, 27);
playUntil(instance3, 113);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...