【问题标题】:Sprite not receiving Keyboard events雪碧没有收到键盘事件
【发布时间】:2011-01-14 12:15:15
【问题描述】:

我有一个Sprite,它是 Flex 对象的子对象,充当主“游戏窗口”。所以在游戏过程中它应该得到键盘输入,但在其他时候没有。当我向它添加键盘侦听器时,它永远不会触发。

我是否需要阻止父对象以某种方式“吃掉”事件,或者类似的东西?我用鼠标滚轮事件得到了同样的结果,但是鼠标单击事件很好。 Sprite 好像没有焦点的概念,除非我错过了。

在这种方法中更一般地,有什么最好的方法建议吗?例如,在进入游戏窗口之前,可能仍需要截取某些键,例如 ESC 或 F1 之类的……目的是游戏窗口不知道其他 UI。

【问题讨论】:

    标签: apache-flex flash actionscript-3


    【解决方案1】:

    您的精灵需要具有输入焦点才能接收键盘事件。

    至于最佳实践:如果您的整个应用程序都基于键盘输入,并且您不必经常切换上下文(如果选择了另一个对象,则相同的键意味着不同的东西),您可以添加舞台上的听众。

    否则,您可以使用stage.focus 将焦点设置到所需的对象。

    【讨论】:

    • 可悲的上下文变化是预期的......就像一个弹出对话框或一些菜单。 sprite 如何get 输入焦点,也许是我的问题。
    • @weltraumpirat:它可以工作,但如果我单击或按错键,它会一直失去焦点。也许经过反思,“应用程序”应该监听事件并过滤它想要的事件,如果它处于活动状态,则分派到游戏窗口。不过让我有点不安。
    • 哦,好吧,FocusEvent.KEY_FOCUS_CHANGE 就是这样处理失去焦点的。不知道为什么鼠标按下会丢失它。此外,即使 使用 焦点,我也没有鼠标滚轮事件...这是焦点问题还是鼠标滚轮问题?
    • 这是鼠标滚轮的问题。你听说过 SWFMacMouseWheel 吗? blog.pixelbreaker.com/flash/swfmacmousewheel
    • @weltraumpirat - 不,谢谢......虽然它没有解释它解决了什么问题。顺便说一句,我直接在 Flash 应用程序中运行 SWF,而不是在 HTML 窗口中。我正在运行 Windows (Flash 10.1)
    【解决方案2】:

    为了让你的精灵可聚焦,你需要实现接口mx.managers.IFocusManagerComponent。否则 tab 键将无法在精灵上工作。根据 adobe 文档:

    IFocusManagerComponent 接口定义了可聚焦组件必须实现的接口,以便从 FocusManager 接收焦点。

    您可以查看 UIComponent 中的代码,了解它们是如何实现 IFocusManagerComponent 中定义的功能的。

    【讨论】:

      【解决方案3】:

      您应该真正在根应用程序或舞台上监听键盘事件。由于 actionscript 具有适当的事件冒泡,您始终可以确保事件会到达那里(如果它们没有被文本框或其他输入消耗)。您可以通过在精灵需要事件监听器时将它们添加到舞台上来模拟它们直接在精灵上,并在不需要时将它们从舞台上移除。

      或者您可以将关键侦听器保留在舞台上,并在应用程序的上下文更改时更改context 变量。然后,在应用程序的context 上设置事件侦听器的操作。这样做的一个主要优点是所有关键事件逻辑都在同一个地方,并且可以更容易地调试。

      至于鼠标滚轮,如果您打算将游戏嵌入到其他网站上,不妨不必担心。他们可能不会让你安装一些 js hack 来让它在 mac 上运行。否则,是的,获取 SWFObject 插件:Mac OS 上的 MouseWheel。

      【讨论】:

      • 从架构的角度来看,这对我来说似乎很糟糕——尽管在实践中它可能更容易!
      猜你喜欢
      • 1970-01-01
      • 2012-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多