带有actionscript的键盘输入

时间:2010-08-14 17:33:58

标签: actionscript-3 actionscript

我用flex作为编译器在记事本中编写纯动作脚本。这是我的代码

package 
{
 import flash.display.*;  
 import mx.core.*;  
    import flash.events.*;   
 import mx.collections.*;
 import flash.geom.*;  
 import mx.controls.*;
 import flash.text.*;  
 import mx.events.*;       
 import mx.styles.*;      
 import mx.containers.*;

 public class MAIN extends Sprite
 {
  public var APPLICATION:Application = Application(Application.application);
  public var FRAME:int = 0;
  public function MAIN()
  {
   addEventListener(KeyboardEvent.KEY_DOWN,keyDownHandler);
   STEP();
  }
  public function STEP():void
  {
   FRAME ++;
   STEP();
  }
  public function keyDownHandler(event:KeyboardEvent):void 
  {
   var keyDownText:TextField = new TextField();
   keyDownText.text = "Key code: " + event.keyCode;
   this.addChild(keyDownText);
  }
 }
}

我想要的是我碰巧在屏幕上画出的任何键(虽然实际上我认为它只是它对应的ascii数字,但无关紧要)。现在虽然一切都只是空白。另一件事是因为我没有使用任何mxml我不知道我是否已正确建立游戏循环所以让我知道是否需要修复。

1 个答案:

答案 0 :(得分:1)

尝试

stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDownHandler);

而不是

addEventListener(KeyboardEvent.KEY_DOWN,keyDownHandler);

由于您的Sprite没有可见区域,因此不会接收键盘或鼠标输入。

STEP()函数也会导致堆栈溢出,因为它是无限递归的。

如果您想要定期调用主循环,请尝试使用ENTER_FRAME处理程序或Timer。

这样的事情:

public function MAIN()
{
    addEventListener(KeyboardEvent.KEY_DOWN,keyDownHandler);
    addEventListener(Event.ENTER_FRAME,STEP);
}

private function STEP(e:Event):void {
    FRAME++;
}

要停止它,请执行以下操作:

removeEventListener(Event.ENTER_FRAME,STEP);

不确定为什么使用ALL CAPS来获取某些方法和变量。虽然它不是语言要求,但所有上限通常都是为常量保留的。方法名称使用camelCase。类型使用PascalCase(如camelCase,但首字母大写)。因此,你的课程将是Main,FRAME将是fram,STEP将是步骤等等。我认为你最好坚持这些常见的命名方案。

另一件事。每次要输出一些文本时,您可能不应该创建新的TextField实例。我想,一个文本域会在你的情况下做到。因此,在启动类时调用某种init方法创建和addChild文本字段,然后只使用此textfield的text属性来编写消息。