2011年8月16日火曜日

ネコグラス時計のマルチタッチ対応

ネコグラス時計のマルチタッチ対応を行いました。
AIR でも、マルチタッチイベントを取得できるクラスが追加されています。
なので簡単に実装できると思っていたら、意外な落とし穴が…。

マルチタッチのイベントを扱うクラスは TouchEvent クラスです。
リファレンスを見ると、今まで使用していた MouseEvent クラスを TouchEvent クラスに置き換えるだけでなんとかなりそうです。

んが、この TouchEvent クラスが、Macに対応していないようなのです!!
コードを記述することはできますが、イベントを受け取ることができないのです。デバッグに不便です。

マウスではクリックイベントが同時に起きるという事はないので、Macが TouchEvent クラスに対応していないのも、当たり前なのでしょうか?
マウスクリックもマルチタッチの1回目のタッチと同じとして、TouchEvent クラスでハンドリングできても良かったのではないかと思います。

しかし、Adobeオフィシャル的には、MouseEvent 、TouchEvent を併用するのが、正しい作法であるみたいです。以下は、base_mcというSprite上のマウスイベントと、タッチイベントを受け取るコードです。

var base_mc:Sprite = new Sprite();
base_mc.addEventListener(MouseEvent.MOUSE_DOWN,baseMouseDown);
base_mc.addEventListener(TouchEvent.TOUCH_BEGIN,baseMultiTouchBegin);
addChild(base_mc);

// base_mcマウスダウンイベント
function baseMouseDown(e:MouseEvent):void {
	trace(e.stageX.toString()+","+e.stageY.toString());
}

// base_mcのマルチタッチイベント
function baseMultiTouchBegin(e:TouchEvent):void {
	if (!e.isPrimaryTouchPoint) {
		trace(e.stageX.toString()+","+e.stageY.toString());
	}
}

上記を実行すると、Mac上では、baseMouseDown()関数しか呼ばれません。

iOS上では、baseMouseDown()、baseMultiTouchBegin()の両関数が呼ばれます。
しかし、複数同時タッチした場合に、1つ目のタッチイベントが baseMouseDown()、baseMultiTouchBegin()の両方にやってくることになります。なので、一方をスキップしてやらなければいけません。
TouchEvent.isPrimaryTouchPointプロパティは、このイベントが MouseEvent にマップされているかどうかを表すBoolean値です。これが true であれば MouseEventでマップされているよ、という意味になります。なんて都合の良いプロパティでしょう(笑)
この isPrimaryTouchPoint プロパティこそが、僕が先に「Adobeオフィシャル的」と言った意味なのでした。

何はともあれ、ネコグラス時計でもマルチタッチに対応することができました。タッチした時のエフェクトが重い関係で、2つ同時までしかマルチタッチを許しておりませんが。(笑)
でも、だいぶ良い感じになりました。

0 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...