最終回の今回は、
マウスボタンを放す操作はTouchPhase.ENDED 
前回の第62回
 
まず、
| TouchPhaseクラスの定数 | 操作 | |
|---|---|---|
| タッチスクリーン | マウス | |
| BEGAN | 画面に触れる | マウスボタンを押す | 
| ENDED | 画面から指を離す | マウスボタンを放す | 
| HOVER | - | マウスポインタを重ねる | 
| MOVED | 画面に触れた指を動かす | ボタンは押したままマウスを動かす | 
| STATIONARY | 画面に触れたまま動かさない | ボタンを押したままマウスは動かさない | 
インスタンスをクリックしたら、
private var angle:Number = 15 * Math.PI / 180;
private function mouseOperated(eventObject:TouchEvent):void {
  // var myTouch:Touch = eventObject.getTouch(instance, TouchPhase.MOVED);
  var myTouch:Touch = eventObject.getTouch(instance, TouchPhase.ENDED);
  if (myTouch) {
    /*
    var nMoveX:Number = myTouch.globalX - myTouch.previousGlobalX;
    var nMoveY:Number = myTouch.globalY - myTouch.previousGlobalY;
    instance.x += nMoveX;
    instance.y += nMoveY;
    */
    instance.rotation += angle;
  }
}試してみると、
 
 
マウスボタンがインスタンス上で放されたのかを調べる
マウスボタンをどこで放しても、
DisplayObjectオブジェクト.hitTest(Pointオブジェクト, マウス操作対象に限定)第1引数には、
そこで、
// ActionScript 3.0クラス定義ファイル: MySprite.as
package {
  import flash.display.BitmapData;
  import starling.display.Sprite;
  import starling.display.Image;
  import starling.textures.Texture;
  import starling.events.Event;
  import starling.events.TouchEvent;
  import starling.events.Touch;
  import starling.events.TouchPhase;
  import flash.geom.Point;
  public class MySprite extends Sprite{
    private var instance:Image;
    private var angle:Number = 15 * Math.PI / 180;
    public function MySprite() {
      addEventListener(Event.ADDED_TO_STAGE, initialize);
    }
    private function initialize(eventObject:Event):void {
      var myBitmapData:BitmapData = new Pen();
      var myTexture:Texture = Texture.fromBitmapData(myBitmapData);
      instance = new Image(myTexture);
      addChild(instance);
      instance.addEventListener(TouchEvent.TOUCH, mouseOperated);
      instance.x = stage.stageWidth / 2;
      instance.y = stage.stageHeight / 2;
      instance.pivotX = instance.width / 2;
      instance.pivotY = instance.height / 2;
    }
    private function mouseOperated(eventObject:TouchEvent):void {
      var myTouch:Touch = eventObject.getTouch(instance, TouchPhase.ENDED);
      if (myTouch) {
        var mousePoint:Point = myTouch.getLocation(instance);
        if (instance.hitTest(mousePoint, true)) {
          instance.rotation += angle;
        }
      }
    }
  }
}これで、
矩形でないビットマップのクリックを捉える
Starlingフレームワークでは、
![図3 [ライブラリ]の矩形でないビットマップにクラスを定める 図3 [ライブラリ]の矩形でないビットマップにクラスを定める](/assets/images/dev/serial/01/as3/0063/003.png) 
もちろん、
 
しかし、
BitmapDataオブジェクト.hitTest(左上角Pointオブジェクト, アルファしきい値, 対象Pointオブジェクト)第1引数はインスタンスの左上角座標を、
前掲スクリプト1に手を加えて、
private var myBitmapData:BitmapData;
private var zeroPoint:Point = new Point(0, 0);private function initialize(eventObject:Event):void {
  // var myBitmapData:BitmapData = new Pen();
  myBitmapData = new Pen();
  // ...[中略]...
}private function mouseOperated(eventObject:TouchEvent):void {
  var myTouch:Touch = eventObject.getTouch(instance, TouchPhase.ENDED);
  if (myTouch) {
    var mousePoint:Point = myTouch.getLocation(instance);
    // if (instance.hitTest(mousePoint, true)) {
    if (myBitmapData.hitTest(zeroPoint, 0x0, mousePoint)) {
      instance.rotation += angle;
    }
  }
}これで、
 
つまり、
// ActionScript 3.0クラス定義ファイル: MySprite.as
package {
  import flash.display.BitmapData;
  import starling.display.Sprite;
  import starling.display.Image;
  import starling.textures.Texture;
  import starling.events.Event;
  import starling.events.TouchEvent;
  import starling.events.Touch;
  import starling.events.TouchPhase;
  import flash.geom.Point;
  public class MySprite extends Sprite{
    private var instance:Image;
    private var angle:Number = 15 * Math.PI / 180;
    private var myBitmapData:BitmapData;
    private var zeroPoint:Point = new Point(0, 0);
    private var pressed:Boolean = false;
    public function MySprite() {
      addEventListener(Event.ADDED_TO_STAGE, initialize);
    }
    private function initialize(eventObject:Event):void {
      myBitmapData = new Pen();
      var myTexture:Texture = Texture.fromBitmapData(myBitmapData);
      instance = new Image(myTexture);
      addChild(instance);
      instance.addEventListener(TouchEvent.TOUCH, mouseOperated);
      instance.x = stage.stageWidth / 2;
      instance.y = stage.stageHeight / 2;
      instance.pivotX = instance.width / 2;
      instance.pivotY = instance.height / 2;
    }
    private function mouseOperated(eventObject:TouchEvent):void {
      var myTouch:Touch = eventObject.getTouch(instance);
      if (myTouch) {
        switch (myTouch.phase) {
          case TouchPhase.BEGAN:
            if (instanceIsTouched(myTouch)) {
              pressed = true;
            }
            break;
          case TouchPhase.ENDED:
            if (pressed && instanceIsTouched(myTouch)) {
              instance.rotation += angle;
            }
            pressed = false;
            break;
        }
      }
    }
    private function instanceIsTouched(myTouch:Touch):Boolean {
      var mousePoint:Point = myTouch.getLocation(instance);
      var touched:Boolean = myBitmapData.hitTest(zeroPoint, 0x0, mousePoint);
      return touched;
    }
  }
}座標がアルファを識別したビットマップイメージ上かどうかは、
これで、
最後に
Flash Player 9から始まった5年を超える本連載は今回で閉じことになる。5年間でFlashの技術も取り巻く状況も、
