在DartFlash上​​处理KeyboardEvents的问题

Fer*_*ndo 3 dart

我在DartFlash上​​处理KeyboardEvents时遇到了麻烦.我不知道我在这里做错了什么.有人能帮助我吗?我的本意是只创建一个非常简单的步行字符每次我打了一个关键时期,它的动作在x和y,才开始了解DartFlash API.这是完整的源代码:

 class Character extends Sprite
 {
   TextureAtlas _atlas;
   Bitmap _currentBitmap;
   int _direction;

   String _name;

   Character(this._name, this._atlas)
   {
     this._direction=Direction.down;
     this._currentBitmap=this.getBitmap("stand", this._direction);
     addChild(this._currentBitmap);
   }

   String get name => this._name;

   Bitmap getBitmap(String name, [int direction, int number])
   {
     if(direction == null)
     {
       return new Bitmap(this._atlas.getBitmapData(name));
     } else if (number == null) 
     {
       return new Bitmap(this._atlas.getBitmapData("${name}-${Direction.getDirectionName(direction)}"));
     }
     return new Bitmap(this._atlas.getBitmapData("${name}-${Direction.getDirectionName(direction)}-${number}"));
   }
 }

 Character dk;

 void keyboardListener(KeyboardEvent ke) {
   print("Key code: ${ke.keyCode}");
   dk.x+=1;
   dk.y+=1;
 }

 void main()
 {
   Stage mainStage = new Stage("mainStage", html.document.query("#mainStage"));
   RenderLoop renderLoop = new RenderLoop();
   renderLoop.addStage(mainStage);
   Resource resource=new Resource();
   resource.addTextureAtlas("DarkKnight", "resources/DarkKnight.json", TextureAtlasFormat.JSONARRAY);
   resource.load().then((res)
   {
     print(resource.toString());
     dk=new Character("DarkKnight", resource.getTextureAtlas("DarkKnight"));
     dk.x=10;
     dk.y=10;
     mainStage.addChild(dk);
     dk.addEventListener(KeyboardEvent.KEY_DOWN, keyboardListener, false);
     mainStage.focus=dk;
     print("${mainStage.focus.name}");
   });
 }
Run Code Online (Sandbox Code Playgroud)

小智 5

有一个简单的解决方法.只需在canvas元素中添加"tabindex"属性,然后就会收到KeyboardEvents.如果未设置"tabindex",则画布不会接收键盘事件.

<canvas id="stage" width="800" height="600" tabindex="1"></canvas>
Run Code Online (Sandbox Code Playgroud)

画布也需要关注.您可以通过单击画布或有问题地设置焦点来获得焦点:

query('#stage').focus();
Run Code Online (Sandbox Code Playgroud)