Как запустить код внутри функции события для прослушивателя ENTER_FRAME, который не запускается один раз в каждом кадре?

Итак, у меня есть код, похожий на этот (это для демонстрационных целей):

addEventListener(Event.ENTER_FRAME, enterFrameFunction);  

    function enterFrameFunction(e:Event):void{ 

    if(sampleMovieClip1.hitTestObject(sampleMovieClip2)){  
    runAFunctionIDontWantToBeRunOnEveryFrame();
    }

    }

Проблема в том, что для проверки того, что sampleMovieClip2 сталкивается с sampleMovieClip1, мне нужно проверять его каждый кадр с помощью enterFrameFunction, поэтому любой код, который я помещаю внутри этой функции, запускает каждый кадр, который тест возвращает true, но я хочу, чтобы runAFunctionIDontWantToBeRunOnEveryFrame (); функция, чтобы запустить ее только один раз.

Мне удалось это сделать, добавив переменную, чтобы определить, было ли условие истинным раньше, но сейчас у меня проблемы с этим, и я хотел бы знать, есть ли другой, менее утомительный способ получить результат. Что-то вроде прослушивателя событий для проверки логического значения, возвращающего истину?


person user3168412    schedule 07.01.2014    source источник


Ответы (2)


Как только произойдет попадание, вы должны удалить прослушиватель событий.

removeEventListener(Event.ENTER_FRAME, enterFrameFunction);

В противном случае ваше единственное другое решение было бы

addEventListener(Event.ENTER_FRAME, enterFrameFunction);  

    function enterFrameFunction(e:Event):void{ 

    if(sampleMovieClip1.hitTestObject(sampleMovieClip2)&&!alreadyHit){
      alreadyHit=true;
      runAFunctionIDontWantToBeRunOnEveryFrame();
    } else {
      alreadyHit=false;
    }
    }

У этого есть проблема с возвратом его обратно в состояние false, без остановки, когда он не срабатывает, но будет ли это проблемой?

person SSpoke    schedule 07.01.2014
comment
Это хорошее решение, но оно не особо помогает мне в моем контексте (хотя в целом все еще полезно для меня). Мне нужно проверить каждый кадр, соприкасаются ли 2 фрагмента ролика, а затем запустить функцию. Будет несколько случаев, когда они не касаются друг друга, а касаются друг друга (в зависимости от игрока в игре), поэтому мне нужно держать слушателя событий в тактическом состоянии. - person user3168412; 07.01.2014

просто поместите свой метод вне обработчика прослушивателя событий:

это вызовет второй метод в каждом кадре, где оператор IF возвращает истину, если вы хотите, чтобы он вызывал один раз, используйте этот пример, где он разрешен только один раз ... если вы хотите, чтобы он запускался снова, измените allowMethodCall на true;

var allowMethodCall:Boolean = true;
addEventListener(Event.ENTER_FRAME, enterFrameFunction);  

/** method runs on enter frame */
function enterFrameFunction(e:Event):void{ 
    if(sampleMovieClip1.hitTestObject(sampleMovieClip2)){  
        if (allowMehodCall) {
            runAFunctionIDontWantToBeRunOnEveryFrame();
        }
    }
}

/** method runs only when called once */
function runAFunctionIDontWantToBeRunOnEveryFrame():void{
    //this runs only once when called
}
person mihai    schedule 09.01.2014