Sprite没有收到键盘事件

时间:2011-01-14 12:15:15

标签: flex flash actionscript-3

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

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

更一般地说,在这种方法中,有没有关于最佳方式的建议?例如,在进入游戏窗口之前,可能仍需要截取某些键,例如ESC或F1或其他......目标是游戏窗口不知道其他UI。

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

为了让您的精灵可以集中精力,您需要实现界面mx.managers.IFocusManagerComponent。否则tab键不能用于精灵。根据adobe doc:

  

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

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

答案 2 :(得分:0)

您应该真正在根应用程序或阶段上侦听键盘事件。由于actionscript具有正确的事件冒泡,因此您始终可以确保事件将到达那里(如果它们没有被文本框或其他输入使用)。你可以直接在sprite上模拟它们,方法是在你需要sprite时将eventlisteners添加到舞台上,当你不需要时将它们从舞台中删除。

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

至于鼠标滚轮,如果您计划将游戏嵌入其他网站,您可能不必担心它。他们可能不会让你安装一些js hack来让它在mac上工作。否则,在Mac OS上获取SWFObject附加组件:MouseWheel。