スプライトを動かす

キーイベントが取れたので、スプライトを動かしてみる。

package {
  import flash.display.*;
  import flash.text.*;
  import flash.events.*;
  import flash.ui.*;

  public class SpriteTest extends Sprite {

    private var field:Sprite;
    private var player:Sprite;

    private var size:uint = 320;
    private var cx:uint = 0;
    private var cy:uint = 0;
    public function SpriteTest() {
      field = new Sprite(); 
      player = new Sprite(); 
      addChild(field);
      field.addChild(player);
      this.stage.addEventListener(KeyboardEvent.KEY_DOWN, keydown);
      draw();
    }

    private function draw():void {
      field.graphics.beginFill(0x0);
      field.graphics.drawRect(0, 0, size, size);
      field.graphics.endFill();
      player.x = cx*32;
      player.y = cy*32;
      player.graphics.beginFill(0x00FF00);
      player.graphics.drawRect(0, 0, 32, 32);
      player.graphics.endFill();
    }

    public function keydown(e:KeyboardEvent):void {
      switch (e.keyCode){
         case Keyboard.UP:
           if(cy>0){
             cy--;
           }
         break;
         case Keyboard.DOWN:
           cy++;
           if(cy>9){
             cy = 9;
           }
         break;
         case Keyboard.LEFT:
           if(cx>0){
             cx--;
           }
         break;
         case Keyboard.RIGHT:
           cx++;
           if(cx>9){
             cx = 9;
           }
         break;
      }
      draw();
    }
  }
}

Spriteクラスはフィールドとして座標x, yがあるので、親スプライトにaddChildしたあとに座標を動かせば動いてくれる。

また、普通にaddEventListenerをするとフォーカスに左右されてしまうため、this.stageにイベントリスナを追加するのが定石っぽい。

あと、すごくどうでも良いハマりポイントとして、C時代の癖で

  cx--;
  if(cx<0){
    cx = 0;
  }

とやってたんだけれど、この場合cxはuintで宣言されているのでおかしくなる。

結構簡単にキャラが動いたな。ネイティブにスプライトを持っている言語はほんとうに楽だ。