サイトトップ

Director Flash 書籍 業務内容 プロフィール

Macromedia Flash非公式テクニカルノート

starling.events.Touchクラスと座標の変換

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■インスタンスをドラッグする
図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日


Copyright © 2001-2012 Fumio Nonaka.  All rights reserved.