SwiftでProcessingみたいにスケッチやりたかったのですが、やり方かがまったく
わからなかったので、簡易なものですが作ってみました。
(そもそも、みなさんSwiftでどうやってるんですか?)
ちなみに
OpenGLESはSwiftではまだ対応しきれてないようです。orz(これつかえればそもそも問題ないはず)
Metalは情報なさすぎて挫折。
CoreAnimationとか全然わからないし、Tween系?の実装ばかりなのでこれも外す。
SpriteKitもCAとおなじで使いづらかったので却下
コードはこちらにあります。
https://github.com/SuguruSasaki/SwiftProcessing
仕組み
CoreGraphicsにBezierPathというクラスがあったので、これを利用しています。
CALayerの存在がまだよくわからなかったので、UIViewの中にBezierPathで描画しています。
使い方
フレーム処理を実装する
ProcessingやOpenFrameworksのupdate/drawのように一定間隔で呼び出しをして欲しいので、
ViewController内に"EnterFrameBeacon"インスタンスを作ります。
self._beacon = EnterFrameBeacon()
self._beacon.initialize(fps: 60.0) // FPS設定
self._beacon.addEventListener(self) // Delegate設定
EnterFrameBeaconはinitializeで設定したフレームレートで通知してきます。
通知を受け取るために、addEventListenerでリスナー登録します。
通知を受け取るためには、ViewControllerにEnterFrameDelegateプロトコルを設定します。
class ViewController: UIViewController, EnterFrameDelegate{
次にupdateメソッドを実装します。
func update {
}
これで通知を受け取ることができます。
Canvasを作る
描画エリアを作成します。CanvasAppクラスを継承したサブクラスを作成します。
今回はMyCanvasとします。init、update、drawを追加します。
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override init(frame: CGRect, clearColor: UIColor) {
super.init(frame: frame, clearColor: clearColor)
}
override update(){
}
override draw(){
}
update/draw内にあれこれコードを書いて試すことができます。
ドットを表示する。
とりあえず、何か動かしてみたいので、ドットを作って表示します。
MyCanvasのinit内でParticleを作ります。 Particleは座標管理をするだけです。
for var i = 0; i < 200; ++i {
var px: CGFloat = Math.randomBetweenNumbers(0.0, secondNum: self.frame.width)
var py: CGFloat = Math.randomBetweenNumbers(0.0, secondNum: self.frame.height)
var p: Particle = Particle(center: CGPointMake(px, py))
var vx: CGFloat = Math.randomBetweenNumbers(-5.0, secondNum: 5.0)
var vy: CGFloat = Math.randomBetweenNumbers(-5.0, secondNum: 5.0)
p.setVelocity(vx, y: vy)
self._particles.append(p)
}
draw内でドットを描きます。
var max = self._particles.count
for var i = 0; i < max; ++i {
var p: Particle = self._particles[i] as Particle
DrawCircle.draw(p, radius: CGFloat(3.0), strokeColor: UIColor.redColor(), fillColor: UIColor.redColor())
}
これで完了です。
あとは、githubのコードを参考にしてください。
他に良いやり方知ってる人いたら教えてください!