0

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

addEventListener(Event.ENTER_FRAME, enterFrameFunction);  

    function enterFrameFunction(e:Event):void{ 

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

    }

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

我通过添加一个变量来确定以前条件是否为真,从而成功地做到了这一点,但我现在遇到了麻烦,想知道是否有一种不同的、不那么乏味的方法来获得结果。像一个事件监听器来测试一个返回 true 的布尔值?

4

2 回答 2

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

这确实有一个问题,将它重新设置为假,当它没有被击中时不间断,但这会产生问题吗?

于 2014-01-07T10:39:10.103 回答
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
}
于 2014-01-09T21:24:53.323 回答