最終回の今回は、
マウスボタンを放す操作は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の技術も取り巻く状況も、