ID: FN1204002 |
Platform: All |
Version: CS5/ActionScript 3.0 |
Runtime: Flash Player 11/AIR 3.0 |
Touchクラス |
パッケージ
|
starling.events
|
継承
|
Touch → Object
|
getLocation()メソッド |
文法
|
public function getLocation(space:DisplayObject):Point
|
概要
|
Touchオブジェクトの今の座標を、指定されたDisplayObjectインスタンスの座標空間に変換してPointオブジェクトで返す。
|
引数
|
space:DisplayObject − 変換先の座標空間を定めるDisplayObjectインスタンス。
|
戻り値
|
変換された座標を納めたPointオブジェクト。
|
getPreviousLocation()メソッド |
文法
|
public function getPreviousLocation(space:DisplayObject):Point
|
概要
|
Touchオブジェクトのひとつ前の座標を、指定されたDisplayObjectインスタンスの座標空間に変換してPointオブジェクトで返す。
|
引数
|
space:DisplayObject − 変換先の座標空間を定めるDisplayObjectインスタンス。
|
戻り値
|
変換された座標を納めたPointオブジェクト。
|
globalXプロパティ
|
文法
|
globalX:Number
|
プロパティ値
|
[読取り専用] Touchオブジェクトのステージにおけるx座標値。
|
実装
|
public function get globalX():Number
|
globalYプロパティ
|
文法
|
globalY:Number
|
プロパティ値
|
[読取り専用] Touchオブジェクトのステージにおけるy座標値。
|
実装
|
public function get globalY():Number
|
previousGlobalXプロパティ
|
文法
|
previousGlobalX:Number
|
プロパティ値
|
[読取り専用] Touchオブジェクトのステージにおけるひとつ前のx座標値。
|
実装
|
public function get previousGlobalX():Number
|
previousGlobalYプロパティ
|
文法
|
previousGlobalY:Number
|
プロパティ値
|
[読取り専用] Touchオブジェクトのステージにおけるひとつ前のy座標値。
|
実装
|
public function get previousGlobalY():Number
|
説明
Touchクラスのオブジェクトには、タッチスクリーンやマウスの操作を示す情報が納められます。Touchオブジェクトは、TouchEventオブジェクトから取出せます。
イベントが起こったとき、行われたすべての操作のTouchオブジェクトが調べられます。ひとつの操作の情報は、ひとつのTouchオブジェクトがもちます。Touchオブジェクトは、操作が進むにしたがって、いくつかの段階を経ます。その段階は、TouchPhaseクラスに文字列の定数として決められています(表001)。
表001■TouchPhaseクラスの定数とタッチスクリーンおよびマウスの操作
TouchPhaseクラスの定数
|
操作
|
タッチスクリーン
|
マウス
|
BEGAN
|
画面に触れる
|
マウスボタンを押す
|
ENDED
|
画面から指を離す
|
マウスボタンを放す
|
HOVER
|
−
|
マウスポインタを重ねる
|
MOVED
|
画面に触れた指を動かす
|
ボタンは押したままマウスを動かす
|
STATIONARY
|
画面に触れたまま動かさない
|
ボタンを押したままマウスは動かさない
|
Touchオブジェクトからは、今とひとつ前の操作の行われたステージにおける座標がそれぞれ調べられます。今とひとつ前の操作のそれぞれのxy座標を示すプロパティです。
- globalXプロパティ
- globalYプロパティ
- previousGlobalXプロパティ
- previousGlobalYプロパティ
また、Touchクラスには、それらの座標をステージ以外のDisplayObjectインスタンスから見た座標に変換するメソッドも備わっています。それぞれのxy座標の組をPointオブジェクトで返すふたつのメソッドです。
- getLocation()メソッド
- getPreviousLocation()メソッド
実装
Touchクラスの前掲プロパティとメソッドの実装を簡単にご説明します。まず、4つのプロパティです。読取り専用ですので、getアクセサメソッドのみ定められています。それぞれのプロパティ値を内部的に納めるための4つのprivateプロパティには、すべてコンストラクタメソッドで初期値が与えられます。
public class Touch {
private var mGlobalX:Number;
private var mGlobalY:Number;
private var mPreviousGlobalX:Number;
private var mPreviousGlobalY:Number;
public function get globalX():Number { return mGlobalX; }
public function get globalY():Number { return mGlobalY; }
public function get previousGlobalX():Number { return mPreviousGlobalX; }
public function get previousGlobalY():Number { return mPreviousGlobalY; }
}
|
つぎは、前掲ふたつのメソッドです。どちらも、内部的にDisplayObject.getTransformationMatrix()メソッドを呼出しています。メソッドが参照するインスタンスから第1引数のインスタンスに座標を変換するMatrixオブジェクトが返されます。第2引数を与えるとそのMatrixオブジェクトが変換され、与えなければ戻り値となる変換行列のオブジェクトが新たにつくられます。
DisplayObjectオブジェクト.getTransformationMatrix(DisplayObjectオブジェクト, Matrixオブジェクト)
ふたつのメソッドは、ともに内部的なprivateプロパティ(mTarget)のDisplayObjectオブジェクトを参照し、そのDisplayObject.rootプロパティに対してDisplayObject.getTransformationMatrix()メソッドを呼出しています。
privateプロパティ(mTarget)のDisplayObjectインスタンスは、これもコンストラクタメソッドで初期値が与えられます。その表示リスト最上位のインスタンスは、多くの場合StarlingのStageオブジェクトでしょう。
つまり、両メソッドは表示リスト最上位のインスタンスから引数のDisplayObjectインスタンスに座標変換するMatrixオブジェクトをつくり[*1]、それぞれのxy座標のPointオブジェクトをそのMatrixオブジェクトで変換して(Matrix.transformPoint()メソッドを使用)返しているのです。
private var mTarget:DisplayObject;
private static var sHelperMatrix:Matrix = new Matrix();
public function getLocation(space:DisplayObject):Point {
var point:Point = new Point(mGlobalX, mGlobalY);
mTarget.root.getTransformationMatrix(space, sHelperMatrix);
return sHelperMatrix.transformPoint(point);
}
public function getPreviousLocation(space:DisplayObject):Point {
var point:Point = new Point(mPreviousGlobalX, mPreviousGlobalY);
mTarget.root.getTransformationMatrix(space, sHelperMatrix);
return sHelperMatrix.transformPoint(point);
}
|
[*1] DisplayObject.getTransformationMatrix()メソッドに渡す第2引数には、静的なprivateプロパティ(sHelperMatrix)のMatrixオブジェクトが与えられます。そして、DisplayObjectクラスでは、つぎに引用するようにDisplayObject.getTransformationMatrix()メソッドが、引数のMatrixオブジェクトを(Matrix.identity()メソッドにより)初期化します。
public class DisplayObject extends EventDispatcher {
public function getTransformationMatrix(targetSpace:DisplayObject, resultMatrix:Matrix = null):Matrix {
if (resultMatrix) resultMatrix.identity();
else resultMatrix = new Matrix();
|
つまり、処理の結果から見れば、Matrixオブジェクトは静的プロパティにとっておかなくても、新たにつくれば済みます。あるいは、第2引数を渡さずに、DisplayObject.getTransformationMatrix()メソッドが新たにつくって返すMatrixオブジェクトを用いてもよいはずです。
Matrixオブジェクトを静的プロパティに置いて使い回すのは、Matrixオブジェクトが毎回つくられる負荷を減らすためだと考えられます。実際、Touchクラスの中で静的プロパティのMatrixオブジェクトは、本文に説明したふたつのメソッドでしか使われていません。
|
例
ふたつのメソッドによりインスタンスをドラッグ&ドロップするスクリプトは、「Starlingフレームワークでインスタンスをドラッグ&ドロップする」でご紹介しました。そのクラス定義の中でドラッグを扱うのが、つぎに抜書きしたメソッド(onMouseMove)です。
private function onMouseMove(eventObject:TouchEvent):void {
var instance:DisplayObject = eventObject.currentTarget as DisplayObject;
var myTouch:Touch = eventObject.getTouch(stage);
var currentPoint:Point = myTouch.getLocation(instance);
var lastPoint:Point = myTouch.getPreviousLocation(instance);
var movePoint:Point = currentPoint.subtract(lastPoint);
instance.x += movePoint.x;
instance.y += movePoint.y;
}
|
ふたつのメソッドから得られた座標の差を(Point.subtract()メソッドにより)求めるとマウスがどれだけ動いたのかわかりますので、インスタンスにそのxy座標値を加えれば同じように動くことになります(図001)。スクリプトの中身について詳しくは前出ノートをお読みください。
図001■インスタンスをドラッグする
Touch.getLocation()およびTouch.getPreviousLocation()は、使い途の多いメソッドですので前出ノートでも用いました。けれど、座標の差を求めるのであれば、どのDisplayObjectインスタンスから見ても同じ(ベクトル)です。
つまり、4つのプロパティを使ってもスクリプトは書けます。しかも、内部的にMatrixオブジェクトを用いた座標変換が要らない分、最適化されることにもなるのです。4つのプロパティを使って書替えたメソッドはつぎのようになります。
private function onMouseMove(eventObject:TouchEvent):void {
var instance:DisplayObject = eventObject.currentTarget as DisplayObject;
var myTouch:Touch = eventObject.getTouch(stage);
/*
var currentPoint:Point = myTouch.getLocation(instance);
var lastPoint:Point = myTouch.getPreviousLocation(instance);
var movePoint:Point = currentPoint.subtract(lastPoint);
instance.x += movePoint.x;
instance.y += movePoint.y;
*/
instance.x += myTouch.globalX - myTouch.previousGlobalX;
instance.y += myTouch.globalY - myTouch.previousGlobalY;
}
|
参考
[Starling Framework Reference] > [Touch]
作成者: 野中文雄
作成日: 2012年4月2日