flash.sensors は Flash Player 10.1 から追加された新しいパッケージです。
名前の通り、このパッケージには、デバイスのセンサーから情報を取得するためのクラスが定義されています。今のところ用意されているのは以下の 2 つです。
- Accelerometer : 加速度
- Geolocation : 測位情報
これで、デバイスの動きや位置に反応するアプリケーションが作れます。なお、Geolocation は AIR アプリからのみ利用可能です。(Flash Player では未サポート)
以下に、それぞれのクラスの使い方をまとめてみます。まずは、Accelerometer クラスから。
Accelerometer を利用する前に
Accelerometer クラスは、加速度センサーにより検知されたデバイスの傾きや動きの情報をイベントとして通知する機能を持っています。
Accelerometer の機能は全てのデバイス上で使えるとは限りません。加速度センサーが搭載されていない環境で実行されることもあり得るからです。実行時に Accelerometer が利用できるかどうかは、Accelerometer.isSupported 属性を使って調べることができます。
if (Accelerometer.isSupported) { // Accelerometerの機能が利用できる }
Flash アプリケーションからは、実際に実行されるまで、実行環境に加速度センサーが搭載されているかは分かりません。Accelerometer を利用する場合は、とりあえず Accelerometer.isSupported の値を確認するのがよさそうです。
さて、上でも書いたように、Accelerometer からの情報はイベントとして渡されます。その際に発生するイベントは AccelerometerEvent.UPDATE です。
ということで、Accelerometer のサポート状況が確認できたら、次のステップは Accelerometer のインスタンスを作成して AccelerometerEvent.UPDATE イベントのリスナーメソッドを追加、というのが Accelerometer を使うときのお約束となりそうです。下はそのサンプルです。
var accl:Accelerometer; if (Accelerometer.isSupported) { accl = new Accelerometer(); accl.addEventListener(AccelerometerEvent.UPDATE, onUpdate); }
AccelerometerEvent.UPDATE の利用
AccelerometerEvent.UPDATE イベントは加速度センサーからの更新情報に応じて発行されます。
その際に渡されるイベントオブジェクトは AccelerometerEvent です。AccelerometerEvent クラスには、以下の 4 つの属性が定義されています。
- accelerationX -- x 軸方向の加速度。単位はG (約 9.8 メートル毎秒毎秒)
- accelerationY -- y 軸方向の加速度。単位はG (約 9.8 メートル毎秒毎秒)
- accelerationZ -- z 軸方向の加速度。単位はG (約 9.8 メートル毎秒毎秒)
- timestamp -- 実行環境が初期化されてからの時間。単位はミリ秒
このとき、3 つの軸の定義は、それぞれ以下のようになります。
デバイスのディスプレイを自分の正面に向けてまっすぐ立たせた状態 (上下は正しく) において、
- x 軸は、左右に引いた線になり、右向きに加速した時に正の値になる
- y 軸は、上下に引いた線になり、上向きに加速した時に正の値になる
- z 軸は、前後に引いた線になり、前向きに加速した時に正の値になる
重力加速度も加速度なので、AccelerometerEvent からの値はデバイスの傾き検知にも使えます。
- デバイスの右側を上にして垂直に持った → (x:1.0, y:0.0, z:0.0)
- デバイスの上側を上にして垂直に持った → (x:0.0, y:1.0, z:0.0)
- デバイスの画面が水平になるよう置いた → (x:0.0, y:0.0, z:1.0)
このように、加速度センサーが測定する値は傾きと動きの変化とがミックスされたもののため、「回転しながら動いた」 という状況を正しく取得することは難しそうです。(なので Wii モーションプラスが登場したりしているわけで) AS3 でもジャイロセンサーのサポートが追加されることを期待しましょう。
最後に、"ごくごく" 簡単な AccelerometerEvent ハンドラのサンプルです。
function onUpdate(evt:AccelerometerEvent):void { trace( "acceleration X: " + evt.accelerationX.toString() + "\n" + "acceleration Y: " + evt.accelerationY.toString() + "\n" + "acceleration Z: " + evt.accelerationZ.toString() ); }
続きは、また次回以降に。
コメントする