我正在Flex / AS3中编写一个Flash应用程序,我似乎无法为其分配键盘焦点。我在开发早期就注意到了这个问题,并添加了一个带有“立即播放”按钮的启动画面,以吸引用户点击。但是,用户必须再次单击应用程序才能使键盘正常工作!
更糟糕的是,我有一个游戏中的快捷方式,可以返回主菜单。如果您返回主菜单然后单击“立即播放”按钮,SWF将再次失去焦点!
我可能搞乱儿童物品或意外摧毁捕获键盘焦点的物体,但我不太确定它是如何工作的。你能指点我正确的方向吗?
我的应用程序是单个.SWF文件,我直接在浏览器中运行它(不是通过网页调用它,但我最终会这样做)。这是有问题的文件:
http://www.space-squid.com/game/Main.swf 当您单击“正常”时,您必须再次单击以实际获取键盘焦点。 :(随意提问!
编辑:以下是我正在使用的一些代码。
在我的主要类中执行的第一个代码:
empty_sprite = new Sprite();
addChild(empty_sprite);
empty_sprite.stage.addEventListener(keyboard hooks...);
我也试过这个以防万一我应该在我的根对象上设置钩子:
this.stage.addEventListener(keyboard hooks...);
如果其他空的精灵导致问题:
background_image = new BackgroundImage();
background_image.x = etc etc alignment data;
addChild(background_image);
background_image.stage.addEventListener(keyboard hooks...)
在所有这些例子中,我的键盘挂钩工作正常,只要我第二次点击..但绝不是第一次。 :(
第二次编辑:我把问题缩小了。也许有人可以帮助我理顺这一点,这可能是一个结构问题:
public function Main {
Some stuff...
empty_sprite = new Sprite(); // Create a new stage sprite
addChild(empty_sprite);
empty_sprite.stage.addEventListener(keyboard hooks...);
addChild(BackgroundImage); // I lay down my background image which is persistant
addChild(PlayNowButton); // I display my PlayNow button to the screen
More stuff...
}
public function StartGame() {
removeChild(PlayNowButton); // This is the point of failure; this removes focus.
removeChild(otherMenuOptions);
...
addChild(gameComponents);
}
正如你所看到的,我创建了现在播放按钮 - 它似乎成为了焦点的对象。我的键盘事件没有被捕获,因为它是寻找焦点的背景。不确定这是否有意义,希望有人可以用这个来理顺我!
如果我注释掉那一行(removeChild(PlayNowButton))游戏工作得很好并且保持键盘焦点 - 在屏幕上永久覆盖“playnow”按钮的缺点。
说实话,我甚至不确定游戏本身是否能够专注于第一次点击,但我不确定如何测试。
答案 0 :(得分:13)
您正在寻找的代码是:
gameWorldObject.stage.focus = this;
由于Flash已获得焦点,因此您的键盘事件处理程序根本不会集中在Flash应用程序本身中。您可以使用上面的代码切换当前焦点在应用程序中的位置。
或者,不是破坏PlayNow按钮,而是让它不可见将会起作用。然后在需要时再次将其显示出来。如果它是MovieClip或Sprite对象,则非常简单:
PlayNowButton.visible = false; // or true obviously, as the case may be
(用这种方式写给自己很难)
答案 1 :(得分:2)
我假设这是一个浏览器项目?
我是这样做的:
package com.whatever.utilities {
import flash.external.ExternalInterface;
public class Browsers {
public static function FocusThisSwf():void {
if(!ExternalInterface.available)
return;
ExternalInterface.call("eval", "document.getElementById('" +
ExternalInterface.objectID + "').focus()");
}
// ...
}
//...
}
任何打嗝,请确保您的嵌入/对象标记具有ID和名称属性!