2011-01-14 80 views
2

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

我是否需要停止父对象以某种方式“吃”事件或类似的东西?我用鼠标滚轮事件得到同样的结果,但鼠标点击事件没有问题。 Sprite似乎没有关注的概念,除非我错过了它。

更普遍的是,在这种方法中,有没有关于最佳方式的建议?例如,在进入游戏窗口(如ESC或F1之类的游戏窗口)之前,可能仍需要截取某些键......目标是游戏窗口不知道其他用户界面。

回答

3

你的精灵需要输入焦点来接收键盘事件。

至于最佳做法:如果你的整个应用程序是基于键盘输入的,如果你没有切换上下文(相同的密钥意味着,如果另一个对象选择不同的事情)了很多,你可以只添加听众的舞台。

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

+0

可悲的是,上下文的变化是可以预料的...就像一个弹出对话框或一些菜单。精灵_get_输入如何聚焦,也许我的问题应该是什么。 – 2011-01-14 12:27:27

+0

我编辑了我的答案。使用stage.focus :) – weltraumpirat 2011-01-14 12:29:17

0

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

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

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

1

为了让您的精灵集中精力,您需要实现界面mx.managers.IFocusManagerComponent。否则tab键在精灵上不起作用。根据adobe文档:

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

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