search
LoginSignup
3

More than 5 years have passed since last update.

posted at

updated at

Organization

SwiftでEnterFrameBeaconを作る

EnterFrameBeaconとは?

EnterFrameBeaconは指定されてFPSで処理を実行する、アニメーションフレームを管理クラスです。
Swiftでは、CAnimationとかあるようですが、非常に使いづらいので簡単に動きが付けれるエンジンを用意します。

EnterFrameBeaconは今は亡きActionScriptの技術でした...アーメン。
今回は簡易版です。

仕組み

仕組みは簡単です。管理クラスを用意し、リスナーを保持するプロパティを持たせます。

EnterFrameBeacon.swift

class EnterFrameBeacon: NSObject {

    private var _listeners:[EnterFrameDelegate] = []
}

リスナーにはEnterFrameDelegate(プロトコル)を関連させます。この型をもつオブジェクトを
_listenersで管理します。_listenersは静的プロパティのほうが扱いやすいです。

EnterFrameDelegate.swift
import Foundation
import UIKit

protocol EnterFrameDelegate {
    func update()
}

毎フレーム処理を実行するためにはNSTimerクラスを利用します。
プロパティとして_timerを用意します。

EnterFrameBeacon.swift
private var _timer: NSTimer!

EnterFrameBeaconは3つのメソッドを持ちます。

  • initialize 初期化
  • addEventListener リスナー登録
  • update 毎フレーム実行される処理

順番に見ていきます。
まずは初期化、引数でFPSを渡します。デフォルトで60が設定されます。

EnterFrameBeacon.swift
func initialize(fps: NSTimeInterval = 60.0){
    self._timer = NSTimer.scheduledTimerWithTimeInterval(1.0 / fps, target: self, selector: "update", userInfo: nil, repeats: true)
}

次にリスナー登録、EnterFrameDelegateプロトコルを持つインスタンスを登録します。

EnterFrameBeacon.swift

func addEventListener(listener: EnterFrameDelegate) {
    self._listeners.append(listener)
}

最後に毎フレーム呼び出される処理です。

EnterFrameBeacon.swift
func update(){
   let max = self._listeners.count
   for var i = 0; i < max; ++i {
      let obj: EnterFrameDelegate =  self._listeners[i] as EnterFrameDelegate
      obj.update()
   }
}

これで完了です。
実際に使う場合は、以下のようになります。

ViewController.swift
self._beacon = EnterFrameBeacon()
self._beacon.initialize(60.0)
self._beacon.addEventListener(self)

func update(){
    // 具体的な処理
}

以上です。

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
What you can do with signing up
3