AS3 - AIR 项目中的键盘事件.KEY_DOWN 在删除显示对象后不触发处理程序,并且 stage.focus 不



我正在开发一个类似信息亭的应用程序(游戏),需要一直全屏锁定。我正在使用as3/flash/AIR为它。起初事情开始得很好,在大多数情况下一切正常。但是在某个地方酝酿着一个谜团,我一直无法弄清楚......这就是您的帮助将不胜感激的地方!

我处理这个问题的方法是在应用程序的最开头添加:

stage.addEventListener(KeyboardEvent.KEY_DOWN, playerOnKeyDown);

然后,在我的播放器OnKeyDown函数上:

function playerOnKeyDown(event:KeyboardEvent):void
{
    if (event.keyCode == Keyboard.ESCAPE)
    {
        event.preventDefault();
        //More code here opening out menus, etc, etc.)
    }
}

所以,所有这些都工作得很好,但当然我还需要带上:

stage.focus = stage;

否则,在移除对象时 - 如在 removeChild() 中 - 事件触发不会按照我想要的方式运行,因为 Flash 改变了显示列表中其他地方的焦点。

每次删除"子项"时,我都小心翼翼地将焦点添加到舞台上,它在所有地方都很好用,除了整个运行中的一次,就在我从外部加载的 swf 中删除对象之后。

我仍然添加这些行,因为它应该可以正常工作:

removeChild(childFromLoadedSWF);
stage.focus = stage;

除了当我按 Any 键时,该事件不会触发我的函数,如果我按 ESC 键,它会再次使我退出全屏(其默认行为),完全绕过我的侦听器函数播放器 OnKeyDown。

奇怪的是,就在这样做之前,有一句话:

stage.hasEventListener(KeyboardEvent.KEY_DOWN))

痕迹是真的!

焦点在舞台上,听众在,但是当按下 ESC 键时,默认行为完全忽略了我的函数......

可能是什么原因造成的?

谢谢!!

看起来我只需要删除我拥有的ENTER_FRAME侦听器。这在对舞台焦点造成严重破坏。现在一切正常!

stage.removeEventListener(Event.ENTER_FRAME, onEnterFrame)

对于任何希望使用 AS3 为 mac 或 PC 开发桌面游戏(如在 Steam 中)的人来说,这都很棒。

游戏Machinarium一定做了这样的事情,因为ESC键永远不会引起这种效果,尽管它是在Flash中制作的。

最新更新