我目前使用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;
}
我希望这对您有帮助。