ここでは「1日で基本が身に付く Swift アプリ開発超入門」の CHAPTER 8 P178〜182「自機を動かそう」について補足説明をします。
目次
iOSにおけるセンサーを使用するには?
本書でも説明しましたが、iOSでは加速度計やジャイロスコープ、歩数計、磁力計、気圧計といったハードウェアの動きや環境に関するデータを取得することができます。
これらのデータを取得するのに必要なのが CoreMotion と呼ばれるライブラリです。
GameScene クラスで CoreMotion を使用するには、以下のように「import CoreMotion」 を追加します。複数の import 文がありますが、import が書かれている場所であればどこでも構いません。
import SpriteKit import GameplayKit import CoreMotion // センサーを使用するために追加 class GameScene: SKScene { // 省略 }
加速度センサーを使用する準備をしよう
加速度センサーを使用するには、CMMotionManager の実体化(インスタンス化)して変数に入れて使用します。
コードで書くと以下のようになります。
let motionMgr = CMMotionMgr() // motionMgr に CMMotionManager の実体を代入
実はCMMotionManager を使用すると、加速度データ、ジャイロスコープデータ、磁力データを取得することができます。
本書で使用しているのは、加速度データだけです。
加速データを取得する間隔を指定する
加速度データを取得できるようにするために、はじめに何秒おきにデータを取得するかを設定する必要があります。
以下のようなコードで実現できます。この場合は 0.05秒おきにデータを取得します。
motionMgr.accelerometerUpdateInterval = 0.05
加速度データの取得
ここではP180の補足説明をします。
加速度データが 0.05秒おきに到達します。加速度データは startAccelerometerUpdates メソッドで取得します。
引数には加速度データが入ってくるキューの種類を指定します。
キューとは、取得したデータを入れる器のことだと思っていただいて構いません。キューの種類にはいくつかありますが、「OperationQueue.current」を指定してください。これは決まり文句だと思ってください。
本書の startAccelerometerUpdates メソッド使用部分をシンプルに書くと以下のようになります。
motionMgr.startAccelerometerUpdates(to: OperationQueue.current!, withHandler: { (data, err) in let acc = data?.acceleration // 加速度データの取得 print(acc?.x ?? 0) // x軸の値を表示 })
上記の withHandler というのは受け取ったデータを処理する部分になります。この部分は (data, err) となっています。data と err の2つの引数があることを示していて、data にはセンサーの値が、err にはエラーデータが入ってきます。本書では第2引数のerr の方は使用しないので「_」にしています。
さて、引数 data ですが、acceleration というプロパティを持っています。 acceleration は加速度を表し、そこから x の値を print で表示しています。
上記をまとめると、加速度データを取得するコードは以下のようになります。
import SpriteKit import GameplayKit import CoreMotion class GameScene: SKScene { //var timer : Timer? let motionMgr = CMMotionManager() override func didMove(to view: SKView) { // 以下のようにして何秒おきにセンサーの値を取得するか設定する // この場合は0.05秒おきに取得 motionMgr.accelerometerUpdateInterval = 0.05 // 0.05秒おきに加速度データを取得して Output エリアに表示する motionMgr.startAccelerometerUpdates(to: OperationQueue.current!, withHandler: { (data, err) in let acc = data?.acceleration // 加速度データの取得 print(acc?.x ?? 0) // x軸の値を表示 }) } }
上記の実行例を以下に示します。加速度センサーを使用しますので実機につないで確認しています。
シーンの更新
ここではP181の補足説明をします。
本書でも説明している通り、センサーの値が更新された時に自動で実行されるメソッドに didSimulatePhysics というのがあります。
このメソッドは、GameScene.swift に自分で書く必要があります。以下にdidSimulatePhysics を書き足しただけのコード例を示します。
あとは、didSimulatePhysics で自機の位置を設定してあげれば動くようになります。
位置の計算方法は本書を参考にしてください。
import SpriteKit import GameplayKit import CoreMotion class GameScene: SKScene { //var timer : Timer? let motionMgr = CMMotionManager() override func didMove(to view: SKView) { // 以下のようにして何秒おきにセンサーの値を取得するか設定する // この場合は0.05秒おきに取得 motionMgr.accelerometerUpdateInterval = 0.05 // 0.05秒おきに加速度データを取得して Output エリアに表示する motionMgr.startAccelerometerUpdates(to: OperationQueue.current!, withHandler: { (data, err) in let acc = data?.acceleration print(acc?.x ?? 0) }) } override func didSimulatePhysics() { // ここにシーンを更新するためのコードを記述 } }