iPhoneの加速度センサを活用
2008年に発売されたiPhone 3Gから、iPhoneには加速度センサが搭載されています。これを使うことで、iPhoneがどれくらいの速さでどの向きに移動しているかというデータを取得することが可能です。また、加速度センサは人の手の動きに加えて地球の重力も常に検出しているので、手の動きが止まっているときでも、iPhoneがどの方向に傾いているかを計算できます。
というわけで、今回は物理エンジンに加えて、この加速度センサを使って、画面を傾けて図形を動かすアプリを作ってみましょう。私たちの住む現実世界の動きを物理エンジンに反映させてみたいと思います。
物理エンジンは、画面内のどの方向に重力がかかるかを自由に設定できます。前回も上下の重力を切り替える機能をつけましたよね。今回は加速度センサの左右方向と上下方向の値を物理エンジンの重力方向に反映させることで、ユーザが自分の手でアプリを操っているように感じられるものになります!
【STEP 1】アプリの基本部分を作ろう
Xcodeで新しいプロジェクトを作ります。メニューから[File]→[New]→[Project]と選択して、「Single View Application」を選び[Next]ボタンをクリックします。
[Product Name]には、今回は「Gravity Control」と入力しておきます。[Organization Name]には自分の名前を、[Organization Identifier]には「mytest」と入力して、[Language]には[Swift]を選択します。最後に[Next]ボタンを押し、その次の画面で[Create]ボタンを押して、プロジェクトの作成を完了させましょう。
ウインドウ左のプロジェクトナビゲータから[ViewController.swift]を選択して、このファイルを編集していきます。
【STEP 2】変数の準備
「import UIKit」と書かれている下の行に「import CoreMotion」と書くことで、加速度センサが利用できるようになります。そして「class ViewController」と書かれている行のすぐ下に、4行の変数宣言を追加しましょう。前回同様、物理エンジン全体を管理するための「アニメ管理」、重力をサポートするための「重力管理」、重力を受けた物体を画面端でストップさせるための「衝突管理」の3つの変数を用意し、さらに「加速度管理」の変数も追加します。
これらの変数は、viewDidLoad()メソッドの中で初期化します。アニメ管理、重力管理、衝突管理の3つの変数を初期化したあと、12回繰り返す「for文(繰り返し処理)」を書いて、12個のラベルを作成します。
【STEP 3】ラベルの作成と加速度の取得
ラベル作成のためのメソッドを、viewDidLoad()メソッドの下に追加します。このメソッドは、乱数を使ってバラバラな位置に青いラベルを作成します。ここまで書いたら一度実行してみましょう。
アプリを実行するには、ライトニングケーブルでiPhoneをMacに接続して、タイトルバーの左側にある「Gravity Control」と書かれたボタンを押して、iPhoneの実機を選択します。そしてタイトルバー左端の三角形の実行ボタンを押してください。
実行ボタンを押すと、iPhone上でアプリの実行が始まります。iPhoneのロックは事前に解除しておいてください。前回のアプリ同様に下方向の重力がかかりますので、起動直後に画面下側にラベルが落ちていきます。
最後に加速度を取得して物理エンジンの重力管理部分に反映させるコードを追加しましょう。viewDidLoad()メソッドの最後のfor文の下に、加速度管理を使うコードを追加します。追加したらもう一度iPhone上で実行してみましょう。
実機を水平な状態から上下左右に傾けると、傾けた方向に図形が動くようになりました。背景色と図形の色やサイズを調整すれば、簡単なスノードームのようなアプリが出来上がります。
【まとめ】
今回も8行のコードを書くだけで、iPhone本体の傾きを物理エンジンに反映させることができました。物理エンジンと加速度センサを組み合わせることで、ゲームや観賞用のアプリなどが簡単に作れます。ぜひお試しを!
次回のテーマ
Macソフトを作ってみよう
今回のサンプルデータは以下よりダウンロードください。
●サンプルコードURL●
http://goo.gl/6c67Dl
【冒険記】
iPhone 6sシリーズには、加速度センサ以外にも、ジャイロ、GPS、電子コンパス、近接センサといった多数の計測機器が搭載されていて、今回のように簡単なコードを書くだけで利用できるようになっています。「007」の秘密兵器もびっくりの充実ぶりですね。
【冒険記】
場所や方角が計測できるGPSや電子コンパスを使うと、移動しながら身体を動かして遊ぶ鬼ごっこのようなゲームも作れます。こうしたセンサ類の使い方はアイデア次第で無限に広がりますので、皆さんもぜひいろんな遊び方を考えてみてください!
Dr.さざめき(aka.沼田哲史)
1978年1月生まれ。某大学でプログラミングを教えつつ、ふらっとヨーロッパ旅行に出かけて美味しいものを食べ歩いたり、時折、iOSプログラミングの本を出したり。Mac歴16年。いつかアメリカ西海岸でお昼から美味しいIPAビールを飲みながらプログラミングするのが夢です。Twitter @sazameki