Swift

Swift用アニメーションエンジンを作り始める

Quadアドベントカレンダー3日目の記事です。

今年は7本記事を書く必要があるので連載ものにしたいと思います。
最近はSwiftのプログラミングばかりなので、Swiftでアニメーションを作る場合の方法を探って見たいと思います。昔の記事でTimerを使ったゲームループもどきを作りましたが、もっと良いやり方がありました。

CADisplayLinkを利用する

iOSではCADisplayLinkを利用してループが作れるます。Timerと比較すると、こちらの方がディスプレイのリフレッシュレートと同期するのでiOSもこちらの利用を想定しているようです。(簡単に考えるとこちらの方が無駄がないぐらいの認識で良いです。)

CADisplayLinkの詳細はこちらで

試してみる。

今回のコードは全てViewContorller.swiftに記述しています。viewDidLoad()に追加しています。

CADisplayLinkインスタンスを作成

/// 引数にコールバックのメソッドを指定するようです
self.updater = CADisplayLink(target: self, selector: #selector(self.loop(_:)))

loopメソッドも定義しておきます。

@objc func onLoop(_ sender:AnyObject) -> Void {
    print("loop") // コンソールにloop文字列を表示しづづける。     
}

フレームレートの設定

60FPSに設定して見ます。

updater!.preferredFramesPerSecond = 60

スレッドに登録

ここまでではまだ動きません、スレッドに登録することで動き始めます。RunLoopのことはまだあまりわかっていませんが、RunLoop.currentはおそらくメインスレッドかと思います。

updater?.add(to: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode)

これで実行すると、コンソールに「loop」という文字列が表示され続けますね。FPSを変更することで、表示回数が変わることが確認できます。

もう少しだけ面白くしましょう。
矩形でも動かして見ましょう。

let v:UIView = UIView(frame: CGRect(x: 50, y: 0, width: 10, height: 10))

背景色赤にしておきます。

v.backgroundColor = UIColor.red
@objc func onLoop(_ sender:AnyObject) -> Void {
    print("loop") // コンソールにloop文字列を表示しづづける。
    self.v.frame.origin.y += 2     
}

これで縦に移動する矩形が表示されました。簡単にアニメーション作れることはわかったので、ここから応用していきたいと思います。
続きは次回へ