未在 Flex AS3 中注册的关键事件

Key Events not registering in Flex AS3

我目前正在开发一个在 Flex 4.6 中使用 ActionScript 3 的项目。我在我的脚本中注册任何键事件时遇到了问题(尽管鼠标事件很好),并且调试导致了一些非常奇怪的结果。

首先,这是我的测试代码:

KET.mxml 的内容:

<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    name="Key Events Test"
    backgroundColor="#000000"
    horizontalAlign="center"
    creationComplete="setup();"
    enterFrame="updateFrame();"
    paddingLeft="0"
    paddingTop="0"
    paddingBottom="0"
    paddingRight="0"
    frameRate="60"
    width="960" height="720">

  <mx:Script>
  <![CDATA[
      include "KET.as";
  ]]>
  </mx:Script>

  <mx:Canvas id="gamePanel" x="0" y="0" width="100%" height="100%" click="mouseClicked(event)" keyDown="keyDown(event)"/>
</mx:Application>

KET.as 的内容:

import flash.display.*; 
import flash.events.*;
import mx.events.*;
import mx.controls.*;

public static const SCREEN_WIDTH:int = 960;
public static const SCREEN_HEIGHT:int = 720;
private var initializationCompleted:Boolean = false;
public var screenBuffer:BitmapData;
private var trigger:int = 0;

public function setup():void {
    screenBuffer = new BitmapData(SCREEN_WIDTH, SCREEN_HEIGHT, false, 0x00000000);
    initializationCompleted = true;
}

private function updateFrame():void {
    if (!initializationCompleted) {
        return;
    }

    gamePanel.graphics.clear();
    gamePanel.graphics.beginBitmapFill(screenBuffer, null, false, false);
    gamePanel.graphics.drawRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
    gamePanel.graphics.endFill();

    if (trigger == 0) {
        screenBuffer.fillRect(new Rectangle(480, 360, 200, 200), 0xFF000000);
    } else if (trigger == 1) {
        screenBuffer.fillRect(new Rectangle(480, 360, 200, 200), 0xFFFF0000);
    } else if (trigger == 2) {
        screenBuffer.fillRect(new Rectangle(480, 360, 200, 200), 0xFF0000FF);
    }
}

private function mouseClicked(event:MouseEvent):void {
    trigger = 1;
}

private function keyDown(event:KeyboardEvent):void {
    trigger = 2;
}

上面的代码,当 运行 时,应该在开始时给出一个黑屏,一旦用户点击它就会出现一个红色矩形,一旦用户按下一个键就会出现一个蓝色矩形。但是,按键完全被忽略了。

调试时,我开始得到一些非常难得的结果运行。我一直在松散地遵循的教程 found here 展示了如何检查键盘事件。现在,按照相同的说明进行操作,甚至下载并编译教程中给出的代码,我得到了一个可以正常工作的项目,但没有键盘控件。现在无论我如何 运行 生成的 SWF,无论是在 Flash 解释器中、通过本地浏览器还是从服务器,都会发生这种情况。起初我以为这是由于教程中给出的 SWF 是由某些旧版本的 Flex 编译的,但是直接从网站下载 SWF 后我得到了相同的结果。 唯一的地方在原来的网站上。

那么我在这里做错了什么?我当前的解决方案中是否存在错误,或者我只是采取了一个令人难以置信的错误方法?

提前致谢!!

我没有测试过您的项目,但如果没记错的话,组件需要接收焦点才能处理键盘事件。

只需在 updateFrame() 函数的末尾添加 gamePanel.setFocus();,我认为它会起作用。

像这样:

private function updateFrame():void {
    if (!initializationCompleted) {
        return;
    }

    gamePanel.graphics.clear();
    gamePanel.graphics.beginBitmapFill(screenBuffer, null, false, false);
    gamePanel.graphics.drawRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
    gamePanel.graphics.endFill();

    if (trigger == 0) {
        screenBuffer.fillRect(new Rectangle(480, 360, 200, 200), 0xFF000000);
    } else if (trigger == 1) {
        screenBuffer.fillRect(new Rectangle(480, 360, 200, 200), 0xFFFF0000);
    } else if (trigger == 2) {
        screenBuffer.fillRect(new Rectangle(480, 360, 200, 200), 0xFF0000FF);
    }

    gamePanel.setFocus();
}

另一种选择是为整个应用程序添加一个 EventListener(注意,如果您使用文本字段,此 EventListener 将在文本输入期间触发)。

public function setup():void {
    screenBuffer = new BitmapData(SCREEN_WIDTH, SCREEN_HEIGHT, false, 0x00000000);
    systemManager.stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
    initializationCompleted = true;
}

希望对您有所帮助。