关键事件未在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的内容:

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;
}

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

在调试此问题时,我开始得到一些非常奇怪的结果。我在此处发现的一个教程显示了如何检查键盘事件。现在,按照相同的说明,甚至下载和编译教程中给出的代码,我将获得一个完全有效的项目,但没有键盘控件。现在,无论我如何运行所得的SWF,无论是在闪存解释器中,通过本地还是从服务器中的浏览器中,都会发生这种情况。起初,我认为这是由于某些旧版本的Flex编制了教程中给出的SWF,但是在直接从网站下载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;
}

我希望这对您有帮助。

最新更新