我似乎无法在类中使键盘事件工作,我有一个工作正常的ENTER_FRAME事件,但键盘事件永远不会被调用。有任何想法吗?这是代码
package
{
import flash.display.MovieClip;
import flash.display.Stage;
import flash.events.*;
public class mainGame extends MovieClip
{
var myPlayer:player = new player();
function mainGame():void
{
trace("arg!");
addChild(myPlayer);
addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
addEventListener(Event.ENTER_FRAME, update);
}
function keyDown(evt:KeyboardEvent):void
{
trace("This never happens");
myPlayer.x++;
}
function update(evt:Event):void
{
trace("This happens fine");
}
}
}
提前感谢!
答案 0 :(得分:16)
与AS2不同,在AS3中,键盘事件不是全局的。它们被发布到舞台上,并且它们通过显示列表鼓泡到任何显示对象具有焦点。在您的代码中,您的事件侦听器被添加到mainGame
,因此只有当mainGame
在舞台上时才会触发,并且用户已经点击(或鼠标已经,我忘了) mainGame
电影剪辑。
当你想要全局获取键盘事件时,正如我所说,它们都是在冒泡前从舞台开始,所以如果你在舞台上注册事件,你将获得所有键盘事件。正如kekoav所说,做到这一点的方法是
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
但是,您的问题是该代码中的stage
不是全局变量。它是所有DisplayObject共有的属性,但在将对象添加到显示列表之前它是null。
因此,为了省略这些解释,如果您在将mainGame
添加到舞台后调用它,则上述代码将起作用。如果没有简单的方法可以做到这一点,你可以将键盘监听器添加到另一个知道何时触发的监听器中:
function mainGame():void {
//...
addEventListener(Event.ADDED_TO_STAGE, stageAddHandler);
//...
}
private function stageAddHandler(e:Event):void {
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
removeEventListener(Event.ADDED_TO_STAGE, stageAddHandler);
}
答案 1 :(得分:2)
将键盘事件监听器添加到舞台而不是您的班级。
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
答案 2 :(得分:2)
import flash.events.Event;
import flash.events.KeyboardEvent;
将您的键盘事件放在enterframe事件中,这样每次更新帧时它都会更新。
function update(evt:Event):void
{
trace("This happens fine");
function keyDown(evt:KeyboardEvent):void
{
trace("This never happens");
myPlayer.x++;
}
}