Swift Playgroundsで学ぶiOSプログラミング 第49回
SpriteKitにCoreMotionを組み合わせてみる
iPadの加速度センサーを使ってボールを動かすプログラミング
2017年07月31日 17時00分更新
今回で、SpriteKitも3回目になります。簡単に復習すると、最初の回では、文字列から作ったラベルノードや、画像から作ったスプライトノードをアクションによって強制的に動かすことでアニメーションを実現しました。2回目は、物理体というものを導入し、重力場の中に看板(スプライトノード)や、絵文字から作ったボール(ラベルノード)を放置して、落ちたり弾んだりする様子を観察する物理シミュレーションを実現しました。
そして今回ですが、SpriteKitにCoreMotionを組み合わせてみることにします。CoreMotionは、iOSのフレームワークの大きなくくりの1つで、加速度センサーやジャイロスコープなど、iOSデバイスの動きを検出するための機能、APIを提供しています。ここでは、その中の加速度センサーを利用して、iPad本体の傾きによって、SpriteKitの物理体の重力を変更することにします。これによって、いわば地球の重力をそのまま物理体の中のノードにかけることになります。それがどんな動きを生むか、想像してみてください。
CoreMotionは、もともとかなり簡単に利用できるように工夫されていますが、それがSpriteKitと組み合わせることにより、さらに簡単に使えます。実際にゲームを作成するような場合を考えても、驚くほど少ないコードで絶大な効果を発揮できるでしょう。
モーションマネージャを初期化する
今回は、前回に作成した、画面にタッチした位置にボールを出現させ、重力を設定したシーンの中に置くというプログラムを基に話を進めます。あとで述べるように、前回の最後のものより少し単純にしていますが、基本的には前回のものにCoreMotion関連の機能を加えていくようにします。
まずは、CoreMotionに含まれる加速度センサーを使うための準備から始めます。そのために必要なのは、いずれもたった1行で書ける、3つステップだけです。
最初にプログラムの先頭部分でCoreMotionをインポートしておきます。これは1つのステップとしてカウントするまでもないかもしれません。
import CoreMotion
次に、CoreMotionに含まれているモーションマネージャ(CMMotionManager)のオブジェクトを作成します。これは、SpriteKitのシーン(SKScene)を作成するクラス(この例ではPGScene)の先頭に書いておけばいいのです。
let motionMgr = CMMotionManager()
そしてそののちに、しかるべきタイミングで加速度センサーの計測を開始するための命令を発行します。これはシーンを初期化するdidMoveメソッドの中に書いておけばいいでしょう。その命令は、モーションマネージャのオブジェクトに対して、加速度計のアップデートを開始してね、という意味のものです。
motionMgr.startAccelerometerUpdates()
たったこれだけで準備は完了です。
あとは定期的に加速度計のデータを読み込んで利用すればいいだけです。
この連載の記事
- 第100回 SceneKitの物理現象シミュレーションとアニメーションをARKitに持ち込む
- 第99回 「物理学体」と「物理学場」を設定して物理現象をシミュレーション
- 第98回 SceneKitのノードに動きを加えるプログラム
- 第97回 いろいろな形のノードをシーンの中に配置する
- 第96回 SceneKitの基礎シーンビュー、シーン、ノードを理解する
- 第95回 現実世界の床にボールや自動車のモデルを配置する
- 第94回 ARKitを使って非現実世界との融合に備える
- 第93回 ARKitが使えるiPadを識別するプログラム
- 第92回 Swift Playgrounds 2.1での問題点をまとめて解消する
- 第91回 iPadの内蔵カメラで撮影した写真を認識するプログラム
- この連載の一覧へ