Actionscript 3 闪存AS3键盘事件未触发
我有一门课是这样的:Actionscript 3 闪存AS3键盘事件未触发,actionscript-3,flash,events,keylistener,dismiss,Actionscript 3,Flash,Events,Keylistener,Dismiss,我有一门课是这样的: public class GameOverScreen extends MovieClip { public function GameOverScreen(useMouseControl:Boolean) { if(useMouseControl){ Mouse.show(); restartButton.addEventListener(MouseEvent.CLICK, onClickRestar
public class GameOverScreen extends MovieClip {
public function GameOverScreen(useMouseControl:Boolean) {
if(useMouseControl){
Mouse.show();
restartButton.addEventListener(MouseEvent.CLICK, onClickRestart);
}
else{
this.addEventListener(KeyboardEvent.KEY_DOWN, onPushSpace);
}
}
public function onClickRestart(mouseEvent:MouseEvent):void{
dispatchEvent(new NavigationEvent(NavigationEvent.RESTART));
}
public function onPushSpace(keyboardEvent:KeyboardEvent):void{
trace(keyboardEvent);
dispatchEvent(new NavigationEvent(NavigationEvent.RESTART));
}...
这是一个游戏的结束画面。(惊喜!)如果我按下空格键,或者点击屏幕上的重启按钮,我希望它能重启我的游戏。正如您所看到的,屏幕在构造函数中得到一个布尔值,它决定我们使用键盘或鼠标来控制游戏。它与鼠标配合得很好,但使用键时,我必须单击重新启动按钮(屏幕上的图标),直到它什么也不做,然后单击它,我按下一个按钮,我就可以看到游戏屏幕,但我的keylistener仍然在工作,如果我按下任何键,它就会重新启动游戏
我的主要课程的要点是:如果玩家死亡,他将获得一个游戏屏幕,游戏屏幕将被解除,游戏屏幕也将获得一个侦听器,它侦听一个称为重新启动的事件,如果事件被调度,将创建一个新的游戏屏幕,游戏将被解除
public class Avoider extends MovieClip { ....
public function onAvatarDeath(avatarEvent:AvatarEvent):void {
var finalScore:Number = playScreen.getFinalScore();
var finalTime:Number = playScreen.getFinalTime();
gameOverScreen = new GameOverScreen(useMouseControl);
gameOverScreen.addEventListener(NavigationEvent.RESTART, onRequestRestart);
gameOverScreen.setFinalScore(finalScore);
gameOverScreen.setFinalTime(finalTime);
addChild(gameOverScreen);
playScreen = null;
}
public function restartGame():void {
playScreen = new PlayScreen(useMouseControl);
playScreen.addEventListener(AvatarEvent.DEAD, onAvatarDeath);
addChild(playScreen);
gameOverScreen = null;
}
public function onRequestRestart(navigationEvent:NavigationEvent):void {
restartGame();
}
我希望这是可以理解的,如果没有请注意什么是不干净的。
谢谢
更新
我的onAddToStage函数
public function onAddToStage(event: Event):void{
stage.focus = this;
this.addEventListener(KeyboardEvent.KEY_DOWN, onPushSpace);
}
尝试将密钥侦听器添加到阶段:
stage.addEventListener(KeyboardEvent.KEY_DOWN, onPushSpace);
否则,您当前的类需要处于焦点位置,这就是为什么只有在单击它之后才能工作。当你的游戏在屏幕上完成时,一定要删除这个侦听器
或者,您可以在加载(在构造函数中)时通过代码将游戏置于屏幕上:
还有一个小提示——我注意到你没有在游戏结束后从显示列表中删除屏幕上的游戏。您将希望这样做以使它真正消失(并删除重启事件侦听器)
因此,重点仍然放在舞台上,舞台是回避者(主要职业),这就是为什么如果我放下游戏屏幕,听众仍然留在那里?没错,尽管从技术上讲,舞台是主要职业的父职业。你这样做是因为只要swf/应用程序有焦点,你就会得到你的关键事件。但是如果我写这个,它应该是指我写它的类,所以在我的例子中是游戏屏幕,不是吗?是的,但是为了让你的游戏屏幕发送键盘事件,它必须有焦点(或者它的一个孩子有)。您可以通过代码(我将更新答案以显示如何)来关注它,然后它可能在不将侦听器附加到舞台的情况下工作。当你第一次在屏幕上显示游戏时,焦点仍然是你上次点击的好主意,但是舞台指向空,但是我能弄清楚,如何将它传递到游戏屏幕上。我认为保持键盘在游戏屏幕上听东西是很重要的,我认为它属于那里,就像鼠标听东西也属于那里一样。一个建议(与你的问题无关),为什么不同时启用鼠标和键盘,而不是一个或另一个呢?似乎即使启用了空格键快捷方式,您也总是希望“重新启动”按钮具有“单击”处理程序。不幸的是,事实并非如此。我希望它只与鼠标一起工作,或者只与键盘一起工作,因为我希望它是这样的:d。说真的,这是我目前正在学习的教程的目标,所以我需要这样做。你有满意的解决方案吗?如果我的回答能引导你达到目的,请接受它。如果没有,请更新您的问题。
public function GameOverScreen(useMouseControl:Boolean) {
this.addEventListener(Event.ADDED_TO_STAGE,addedToStage,false,0,true);
if(useMouseControl){
Mouse.show();
restartButton.addEventListener(MouseEvent.CLICK, onClickRestart, false, 0, true);
}
else{
this.addEventListener(KeyboardEvent.KEY_DOWN, onPushSpace, false, 0, true);
}
}
private function addedToStage(e:Event):void {
stage.focus = this;
stage.stageFocusRect = false; //make sure there's no dumb yellow rectangle
}
public function restartGame():void {
playScreen = new PlayScreen(useMouseControl);
playScreen.addEventListener(AvatarEvent.DEAD, onAvatarDeath);
addChild(playScreen);
gameOverScreen.removeEventListener(NavigationEvent.RESTART, onRequestRestart);
removeChild(gameOverScreen);
gameOverScreen = null;
}