AS3时间轴中移除KeyboardEvent监听器失效,需限制仅Enter键触发
解决AS3时间轴按键监听器无法移除的问题
问题根源
你只移除了KEY_DOWN事件的pressAnyKeyAdvanceButLeftGoBackward1监听器,但**KEY_UP事件的resetKeyListener监听器还在生效**——每次按键抬起时,这个函数会重新把pressAnyKeyAdvanceButLeftGoBackward1加回stage的KEY_DOWN事件里,导致原逻辑始终存在。
解决方案
切换监听器时,必须同时移除两个原监听,再添加新的监听逻辑:
修正后的切换代码
// 移除所有原监听:KEY_DOWN和KEY_UP的都要删除 stage.removeEventListener(KeyboardEvent.KEY_DOWN, pressAnyKeyAdvanceButLeftGoBackward1); stage.removeEventListener(KeyboardEvent.KEY_UP, resetKeyListener); // 添加新的Enter键监听 stage.addEventListener(KeyboardEvent.KEY_DOWN, enterkey1); function enterkey1(event:KeyboardEvent):void { if (event.keyCode == Keyboard.ENTER) { // 用Keyboard.ENTER代替硬编码13,可读性更高 gotoAndStop(26); stage.removeEventListener(KeyboardEvent.KEY_DOWN, enterkey1); } }
额外优化建议
- 避免硬编码键值:使用
Keyboard类的常量(比如Keyboard.ENTER)代替数字,代码更易维护 - 封装控制逻辑:把监听的初始化和切换写成独立函数,方便在不同帧调用:
// 初始化任意按键控制 function setupAnyKeyControls():void { // 先清理重复监听 stage.removeEventListener(KeyboardEvent.KEY_DOWN, pressAnyKeyAdvanceButLeftGoBackward1); stage.removeEventListener(KeyboardEvent.KEY_UP, resetKeyListener); stage.addEventListener(KeyboardEvent.KEY_DOWN, pressAnyKeyAdvanceButLeftGoBackward1); stage.addEventListener(KeyboardEvent.KEY_UP, resetKeyListener); } // 切换为仅Enter键控制 function setupEnterOnlyControls():void { // 移除所有原监听 stage.removeEventListener(KeyboardEvent.KEY_DOWN, pressAnyKeyAdvanceButLeftGoBackward1); stage.removeEventListener(KeyboardEvent.KEY_UP, resetKeyListener); // 添加Enter键监听 stage.addEventListener(KeyboardEvent.KEY_DOWN, enterkey1); } // 原任意按键逻辑保持不变 function pressAnyKeyAdvanceButLeftGoBackward1(event:KeyboardEvent):void { stage.removeEventListener(KeyboardEvent.KEY_DOWN, pressAnyKeyAdvanceButLeftGoBackward1); switch (event.keyCode) { case Keyboard.LEFT : prevFrame(); break; case Keyboard.UP : gotoAndStop(1); break; default : nextFrame(); break; } } function resetKeyListener(event:KeyboardEvent):void { stage.addEventListener(KeyboardEvent.KEY_DOWN, pressAnyKeyAdvanceButLeftGoBackward1); } function enterkey1(event:KeyboardEvent):void { if (event.keyCode == Keyboard.ENTER) { gotoAndStop(26); stage.removeEventListener(KeyboardEvent.KEY_DOWN, enterkey1); } }
之后在需要切换控制逻辑的帧上,直接调用setupEnterOnlyControls()即可,逻辑更清晰,也避免了遗漏监听移除的问题。
内容的提问来源于stack exchange,提问作者Ulo Greer
相关产品推荐
相关产品推荐

