所以,我有类似的代码(这是出于演示目的):
addEventListener(Event.ENTER_FRAME, enterFrameFunction);
function enterFrameFunction(e:Event):void{
if(sampleMovieClip1.hitTestObject(sampleMovieClip2)){
runAFunctionIDontWantToBeRunOnEveryFrame();
}
}
问题是为了测试sampleMovieClip2是否与sampleMovieClip1发生冲突,我需要使用enterFrameFunction对每一帧进行测试,因此我放入该函数的任何代码都会在测试返回true的每一帧运行,但我想要runAFunctionIDontWantToBeRunOnEveryFrame( );功能只运行一次。
我成功地通过添加一个变量来确定条件之前是否为真,但我现在遇到了并发症,并且想知道是否有一个不同的,不那么繁琐的方式来获得结果。像一个事件监听器来测试布尔值返回true?
答案 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
}