iOSプログラミング with Swift 2


2016.05.27: created by

Swift で加速度センサを使ってゲームを作る

  1. Xcode を起動して "Create a new Xcode project" で "iOS" -> "Application" -> "Single View Application" として新しいプロジェクトを開きます。 ここではプロジェクト名を SwiftGravity としています。



  2. プロジェクトの最初に表示される画面は、ウィンドウの左側に表示されている "Show the project navigator" アイコンをクリックしても表示されます。 "General" -> "Linked Frameworks and Libraries" ->"+"ボタン を押して CoreMotion.framework を追加します。









  3. iOSデバイスを傾けたときに画面が勝手に回転しないように、DEvice Orientation を Portrait だけが チェックされている状態にします。



  4. Main.storyboard上の ViewController に、右下の "Object library" から "Image View" をドラッグして適当な場所に配置します。



  5. 可能ならば画像ファイルをImage View のbackgroundに設定したいところですが、 ここでは簡単のため "Attribute Inspector" でBackgroundの色を 赤 (255,0,0,255) にしておきます。




    "Size Inspector" で大きさを 48x48 にします。




  6. Main.storyboardが表示されている状態で、 ウィンドウの右上の "Show the Assistant Editor" ボタン をクリックして、右側のウィンドウに ViewController.swift が表示されている 状態にします。



  7. Main.storyboard上の Image View について、 まず1回クリックして選択してから、 右マウスボタン(またはControllキー+左マウスボタン)でドラッグして、 右側の画面のViewController.swift の
    class ViewController: UIViewController {
    
    の下の行まで持っていきます。



  8. ConnectionはOutletで、 Name を myBall として Connect をクリックしましょう。

  9. ViewControllerクラスの中に、 Main.storyboard上の各Labelと結び付いた(= @IBOutlet のついた)変数定義ができます。



  10. ViewController.swift を変更します。
  11. ViewController.swiftに追加するコード(赤字部分)
    import UIKit
    import CoreMotion
    
    class ViewController: UIViewController {
        @IBOutlet weak var myBall: UIImageView!
        let cmManager = CMMotionManager()
        let scrSize: CGSize = UIScreen.mainScreen().bounds.size
        let mag: Double = 20.0
        var vx, vy: Double?
    
        override func viewDidLoad() {
            super.viewDidLoad()
            vx = 0.0
            vy = 0.0
            startGame()
        }
        
        func startGame() {
            cmManager.deviceMotionUpdateInterval = 0.1
            let handler: CMDeviceMotionHandler = {
                (motionData: CMDeviceMotion?, error: NSError?) -> Void in
                self.stepGame(motionData, error: error)
            }
            cmManager.startDeviceMotionUpdatesToQueue(NSOperationQueue.mainQueue(), withHandler: handler)
        }
        
        func stepGame(motionData: CMDeviceMotion?, error: NSError?) {
            var xMin, xMax, yMin, yMax: Int
            xMin = Int(myBall.frame.width / 2)
            xMax = Int(scrSize.width) - xMin
            yMin = Int(myBall.frame.height / 2)
            yMax = Int(scrSize.height) - yMin
            if let motion = motionData {
                let gravity = motion.gravity
                vx = vx! + gravity.x * mag
                vy = vy! - gravity.y * mag
                var x: Int = Int(Double(myBall.center.x) + vx!)
                var y: Int = Int(Double(myBall.center.y) + vy!)
                if (x < xMin) {
                    x = xMin; vx = 0.0
                } else if (x > xMax) {
                    x = xMax; vx = 0.0
                }
                if (y < yMin) {
                    y = yMin; vy = 0.0
                } else if (y > yMax) {
                    y = yMax; vy = 0.0
                }
                myBall.center = CGPoint(x: x,y: y)
            }
        }
    
        override func didReceiveMemoryWarning() {
    at can be recreated.
        }
    
    }
    
    
  12. Xcodeを起動中にiOSデバイスを Mac に接続すると、 Xcode のstatusに "Processing symbol files"

    と表示されて、しばらく待つと 左上の実行デバイスに 接続したiOSデバイスの名前が表示される。 これを選択して実行する。



  13. アプリが起動すると画面上の赤い四角がデバイスの傾きに応じて、重力方向に移動する。



  14. サンプルのプロジェクトはこちら。(Xcode 7.3.1版)


http://karel.tsuda.ac.jp