[CHAPTER 8] 自機を動かそう

ここでは「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() {
        // ここにシーンを更新するためのコードを記述
    }
}
スポンサーリンク
スポンサーリンク
Swift Life
タイトルとURLをコピーしました