Rubyでどう書く?:RubyCocoa+Core Animationでお手軽アニメーション
解説
共通部分
Core Animationを使用するためにフレームワークを設定します。
OSX.require_framework 'QuartzCore'
AppControllerからviewにアクセスするためのアウトレットを宣言します。
ib_outlet :view
ib_action :pressPosition ib_action :pressRotation ib_action :pressSepia ib_action :pressBloom ib_action :pressHole ib_action :pressZoom ib_action :pressHalftone
pressPosition部分
アクションを宣言し、ボタンが押された時の処理として登録できるようにします。
layerオブジェクトを作成します。Core Animationではレイヤーを基本単位としてアニメーションを実行します。
layer = OSX::CALayer.layer()
backgroundLayerの下にlayerをぶら下げます。
backgroundLayer=OSX::CALayer.layer() backgroundLayer.addSublayer_(layer)
viewの描画内容としてbackgroundLayerを設定する。
@view.setLayer_(backgroundLayer) @view.setWantsLayer_(true)
アニメーション化するレイヤプロパティのキーパスを指定して、CABasicAnimationのインスタンスを作成します。
animation = OSX::CABasicAnimation.animationWithKeyPath_('position')
再生時間を1秒に設定します。
animation.duration = 1.0
アニメーションの開始位置を指定します。
animation.fromValue = OSX::NSValue.valueWithPoint_(OSX::NSPointFromCGPoint(position))
アニメーションの終了位置を指定します。
position.x += 256; position.y += 160; animation.toValue = OSX::NSValue.valueWithPoint_(OSX::NSPointFromCGPoint(position))
繰り返しアニメーションされるように設定します。
animation.autoreverses = true animation.repeatCount = 4
layerにアニメーションを設定します。
layer.addAnimation_forKey_(animation, 'positionAnimation')
pressRotation部分
単位行列を取得します。
transform = OSX::CATransform3DIdentity
アニメーション開始時の変換行列を設定します。
animation.fromValue = OSX::NSValue.valueWithCATransform3D(transform) animation.fromValue = OSX::NSValue.valueWithCATransform3D(transform)
回転行列を取得します。
transform = OSX::CATransform3DMakeRotation(Math::PI, 0, 1.0, 0)
pressSepia部分
セピア調フィルタを作成する。
filter = OSX::CIFilter.filterWithName_('CISepiaTone')
フィルタの入力値をデフォルト値に初期化する。
filter.setDefaults()
layerにfilterを設定する。
layer.setFilters_(OSX::NSArray.arrayWithObject_(filter))
pressBloom部分
Bloomフィルタを作成する。このフィルタはエッジをソフト化し、輝きを画像に適用します。
filter2 = OSX::CIFilter.filterWithName_('CIBloom')
フィルタ出力とオリジナル画像の線形のブレンドを指定するスカラー値であるinputIntensityを0.0に設定する。
filter2.setValue_forKey_(OSX::NSNumber.numberWithFloat_(0.0), 'inputIntensity')
フィルタ処理の対象となる領域の半径を指定する値であるinputRadiusを5.0に設定する。
filter2.setValue_forKey_(OSX::NSNumber.numberWithFloat_(5.0), 'inputRadius')
フィルタに名前を設定する。この名前は後でアニメーション設定する時に必要となる。
filter2.setName_('bloomFilter')
アニメーション化する属性を指定する。
pluseAnimation.keyPath = 'filters.bloomFilter.inputIntensity'
inputIntensityの開始値と終了値を指定する。
pluseAnimation.fromValue = OSX::NSNumber.numberWithFloat_(0.0) pluseAnimation.toValue = OSX::NSNumber.numberWithFloat_(1.5*2)
pressHole部分
穴歪みフィルタを作成する。
filter = OSX::CIFilter.filterWithName_('CIHoleDistortion')
pressZoom部分
カメラをズームしたようなエフェクトをシミュレートするズームブラーを作成する。
filter = OSX::CIFilter.filterWithName_('CIZoomBlur')
pressHalftone部分
ハーフトーン表現を行うフィルタを作成する。
filter = OSX::CIFilter.filterWithName_('CICMYKHalftone')
最後に
駆け足で説明しましたが、いかがだったでしょうか?RubyCocoaを使うと、RubyからMac OS Xのリッチなフレームワークを使うことができます。
もっと良い方法があれば、コメントやbuilderブログなどで是非教えていただきたいと思います。
- ホワイトペーパー



