我正在用 Flash 制作一个平台游戏。
我有一个目标类(该类包含目标精灵的代码,当你击中它时,它会继续游戏的下一部分)。
在目标构造函数内部,添加了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 仍在尝试运行,但该类尚未实例化,并且一旦播放器继续,该方法就会导致极大的滞后。
在 Goal 中,_root 有什么意义?
无论如何,这就是我所做的:
更改事件ADDED
to ADDED_TO_STAGE
,这样,当事件被触发时,我们知道这个 Sprite 有一个stage
财产。
addEventListener(Event.ADDED_TO_STAGE, beginClass);
去除eFrame
来自构造函数的事件。将其添加到beginClass
, with stage
,像这样:
stage.addEventListener(Event.ENTER_FRAME, eFrame);
Now in eFrame
,您可以通过舞台引用出色地删除事件。它之前不起作用,因为引用是错误的(无论它与_root
多变的)。
stage.removeEventListener(Event.ENTER_FRAME, eFrame);
但是 - 请记住在这部分代码之前执行此操作:
while (_root.lvlHolder.numChildren > 0) {
_root.lvlHolder.removeChildAt(0);
}
因为当精灵被移除时,它不会有stage
财产不再了。请记住清理所有可能情况下的事件。我不完全确定stage
是放置输入帧事件的正确位置,我只是这么认为,因为您之前称为 _root。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)