代码之家  ›  专栏  ›  技术社区  ›  Vladimir Shevyakov

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

  •  1
  • Vladimir Shevyakov  · 技术社区  · 8 年前

    我目前正在使用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;
    }
    

    上面的代码在运行时,应该在开始时显示一个黑屏,用户单击它时会显示一个红色矩形,用户按键时会显示一个蓝色矩形。但是,按键被完全忽略。

    在调试时,我开始得到一些非常奇怪的结果。我大致遵循的教程 here 显示如何检查键盘事件。现在,在遵循相同的说明,甚至下载和编译教程中给出的代码后,我得到了一个完全可以工作的项目,但没有键盘控件。现在,无论我如何运行生成的SWF,无论是在flash解释器中、通过本地浏览器还是从服务器运行,都会发生这种情况。起初,我认为这是由于教程中给出的SWF是由某些旧版本的Flex编译的,但在直接从网站下载SWF后,我得到了相同的结果。这个 只有 它的工作地点是在原来的网站上。

    那么,我到底做错了什么?我当前的解决方案中是否存在缺陷,或者我只是采取了一种极其错误的方法?

    提前谢谢!!

    1 回复  |  直到 8 年前
        1
  •  2
  •   Vladimir Shevyakov    8 年前

    我尚未测试您的项目,但如果内存可用,则组件需要接收焦点以处理键盘事件。

    只需添加 gamePanel.setFocus(); 在 updateFrame() 功能,我认为它会起作用。

    像这样:

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

    我希望这对你有帮助。

    推荐文章