如何在每个帧不运行一次的ENTER_FRAME侦听器的事件函数中运行代码?

时间:2014-01-07 10:34:30

标签: actionscript-3 flash events enterframeevent

所以,我有类似的代码(这是出于演示目的):

addEventListener(Event.ENTER_FRAME, enterFrameFunction);  

    function enterFrameFunction(e:Event):void{ 

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

    }

问题是为了测试sampleMovieClip2是否与sampleMovieClip1发生冲突,我需要使用enterFrameFunction对每一帧进行测试,因此我放入该函数的任何代码都会在测试返回true的每一帧运行,但我想要runAFunctionIDontWantToBeRunOnEveryFrame( );功能只运行一次。

我成功地通过添加一个变量来确定条件之前是否为真,但我现在遇到了并发症,并且想知道是否有一个不同的,不那么繁琐的方式来获得结果。像一个事件监听器来测试布尔值返回true?

2 个答案:

答案 0 :(得分:0)

一旦发生命中,您应该删除事件监听器。

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;
    }
    }

这确实有一个问题,将其重新设置为虚假,不会在没有被击中时停止,但这会产生问题吗?

答案 1 :(得分:0)

只需将您的方法放在事件侦听器的处理程序之外:

这将在IF语句返回true的每个帧上调用第二个方法 如果你想让它调用一次使用这个例子只允许一次...如果你想再次运行它将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
}