Rubyでどう書く?:RubyCocoa+Core Animationでお手軽アニメーション

佐藤伸吾(KBMJ)
2008-08-14 08:00:00
  • このエントリーをはてなブックマークに追加

解説

共通部分

 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ブログなどで是非教えていただきたいと思います。

このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]