我正在用 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”按钮永远覆盖在屏幕上。
老实说,我什至不确定游戏本身是否会关注第一次点击,但我不确定如何测试。