iPhoneの加速度センサを利用する - CoreMotion
iPhoneには加速度センサが搭載されていますが、その加速度センサは重力加速も感知してくれます。(加速度センサというのそういうものですか?よく分かりません...
その重力加速度を利用してiPhoneの傾き具合を測定して、バランスゲームみたいなのを土台を作ってみましょう 。
iPhoneの加速度センサ
詳しくはiOSイベント処理ガイドの第4章を見てもらえば分かると思いますが
こんな感じでどの方向に力がかかっているかを指定した感覚で測定してくれます。
図の様に、地面に対して垂直だとx,zは0でyは-1.0になります。重力加速度の最大はおよそ1.0のようです。
時計回りに倒すとxが1.0、yは0.0になります。これを利用して画面上の物体を傾きで動かしてみましょう。
CoreMotionの利用
iPhoneの加速度センサを利用するには、「UIAccelerometer」もしくは「CoreMotion」を用います。但し、UIAccelerometerは今後廃止が検討されているそうなのでCoreMotionを利用しましょう。
まず、CoreMotionを利用する為に<CoreMotion/CoreMotion.h>をインポートする必要があります。
見ての通り、やってることは簡単です。マネージャーを作って、加速度を測定する間隔をsetAccelerometerUpdateInterval:で設定します。次にsetAccelerometerUpdatesToQueue: withHandler:でハンドラーを設定します。
ここで設定したハンドラはCMAccelerometerDataを受け取って、その中に加速度の情報が入ってるという訳です。
dispatch_syncを行なっているのは、どうやらメインスレッドでないと物体(UIView)の表示位置を変更できないようなので利用しているだけです。そのようなことを行わないでしたらdispatch_sync,asyncは必要ないと思います。
傾きで円を動かしてみる
円を描画するUIViewを作成し、傾けた方向に移動し端に当たると跳ね返るようにしてみましょう。
ここで注意しないと行けないのがy軸の加速度。下方向がマイナスなのでそのままiPhoneの座標系に当てはめると上下逆さまになってしまいます。
これ使って何か作ってみたいな...