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