未在 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;
}
希望对您有所帮助。
我目前正在开发一个在 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;
}
希望对您有所帮助。