5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Quad incAdvent Calendar 2017

Day 3

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

Last updated at Posted at 2017-12-03

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     
}

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

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?