我正在制作一个平台游戏。
我有一个目标类(包含目标精灵代码的类,当你点击它时,它会继续下一部分游戏)。
在目标构造函数中,添加了2个事件侦听器,它们如下:
addEventListener(Event.ADDED, beginClass);
addEventListener(Event.ENTER_FRAME, eFrame);
beginClass函数很好,只运行一次,但是eFrame会检查玩家是否达到目标,因此它会一直运行。问题是,一旦玩家击中目标,eFrame将继续运行,同时在菜单中向玩家描述下一个场景。我的eFrame功能如下。
private function eFrame(event:Event):void{
if(hitTestObject(_root.mcMain)){
var lastScore:int = _root.mainScore;
_root.mainScore = lastScore;
while (_root.lvlHolder.numChildren > 0) {
_root.lvlHolder.removeChildAt(0);
}
_root.mcMain.removeChildAt(0);
_root.isInCut = true;
if (_root.lvlCurrent == 1) {
_root.gotoAndStop(2);
} else if (_root.lvlCurrent == 2) {
_root.gotoAndStop(3);
} else if (_root.lvlCurrent == 3) {
_root.gotoAndStop(4);
}
}
}
第2,3,4帧是仅包含文字的框架和向玩家显示消息的按钮,然后玩家继续点击。我的问题是eFrame仍在尝试运行,但该类尚未实例化,并且该方法在玩家继续时会导致极大的延迟。
答案 0 :(得分:2)
内幕目标,_root的重点是什么?
无论如何,这就是我所做的:
将事件ADDED
更改为ADDED_TO_STAGE
,这样,当事件被触发时,我们知道此Sprite具有stage
属性。
addEventListener(Event.ADDED_TO_STAGE, beginClass);
从构造函数中删除eFrame
事件。使用beginClass
将其添加到stage
,如下所示:
stage.addEventListener(Event.ENTER_FRAME, eFrame);
现在在eFrame
中,您可以通过舞台参考来删除该事件。它之前没有用,因为引用是错误的(无论_root
变量是什么)。
stage.removeEventListener(Event.ENTER_FRAME, eFrame);
但是 - 记得在代码的这一部分之前完成:
while (_root.lvlHolder.numChildren > 0) {
_root.lvlHolder.removeChildAt(0);
}
因为当精灵被移除时,它将不再具有stage
属性。请记住在所有可能的情况下清理事件。我不完全确定stage
是放置输入框架事件的正确位置,我只是假设因为你之前称之为_root。
答案 1 :(得分:0)
在eFrame()内部停止事件监听器:
removeEventListener(Event.ENTER_FRAME,eFrame);
答案 2 :(得分:0)
你要将eventListener添加到舞台上,所以试试这个:
stage.removeEventListener(Event.ENTER_FRAME, eFrame);
或
parent.removeEventListener(Event.ENTER_FRAME, eFrame);
或
event.target.removeEventListener(Event.ENTER_FRAME, eFrame);