9
10

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.

Swiftでビジュアルプログラミング

Last updated at Posted at 2015-09-11

SwiftでProcessingみたいにスケッチやりたかったのですが、やり方かがまったく
わからなかったので、簡易なものですが作ってみました。
(そもそも、みなさんSwiftでどうやってるんですか?)

ちなみに
OpenGLESはSwiftではまだ対応しきれてないようです。orz(これつかえればそもそも問題ないはず)
Metalは情報なさすぎて挫折。
CoreAnimationとか全然わからないし、Tween系?の実装ばかりなのでこれも外す。
SpriteKitもCAとおなじで使いづらかったので却下

コードはこちらにあります。
https://github.com/SuguruSasaki/SwiftProcessing

仕組み

CoreGraphicsにBezierPathというクラスがあったので、これを利用しています。
CALayerの存在がまだよくわからなかったので、UIViewの中にBezierPathで描画しています。

使い方

今回は、下記の画像のようにドットを描画して動かしてみます。
スクリーンショット-2015-09-11-16.47.16.png

フレーム処理を実装する

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のコードを参考にしてください。
他に良いやり方知ってる人いたら教えてください!

9
10
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
9
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?