ひととおりアニメーションやったことだし、そろそろインタラクティブなやつをひとつ...
この前の「クォーツの世界」で作ったのが、自分的に面白かったので、あれのコアアニメーション版やってみる。ウィンドウクリックしてしばらく待ってると突然棒が落ちてくるので、気づいた時点でクリック。これで反射時間を測定といきましょう。
名付けて「棒取りゲーム」
流れ的にはこんな感じ。
![](https://stat.ameba.jp/user_images/11/47/10089281874.jpg?caw=800)
で、問題はクリックをどう拾うか?
なんだけど「クォーツの世界」でやったビューに独自描画機能を付けた時と同じですな。ちゃんと Introduction to View Programming Guide for Cocoa読んでっか?(クォーツの世界の方、リンク間違ってるな...)
今回はdrwaRectではなく
- (void)mouseDown:(NSEvent *)theEvent
を使います。
でもって「クォーツの世界」の時みたいにNSViewをって、ねーよ。
めんどくさがってビューじゃなくウィンドウでダイレクトにアニメーションしたからNSWindowしかねーし。
ま、同じようなもんだろってことで今回はNSViewじゃなくNSWindowsをカスタム化~。
NSWindowsをカスタム化
今回は新しいXcodeなんで、ちょっとカスタム化の手順が変わる。「クォーツの世界」の時はInterface Buiderでサブクラス化してファイル書き出してってやってたわけだけど、「Cocoaアプリケーションチュートリアル:モデルの定義」から「モデルとビューのブリッジ:コントローラ」に渡って紹介されてる手順は
Xcodeでカスタムソース作成→InterfaceBuilder起動→カスタムクラスに変更
でした。
まずはファイル>新規ファイルメニューを選んでTestWin.h、TestWin.mを作成だ。
![Fig.1](https://stat.ameba.jp/user_images/c7/d5/10089284200.jpg?caw=800)
Objective-C NSView subclass なんてのもあるけど、Objective-C subclassで十分っす。
![Fig.2](https://stat.ameba.jp/user_images/76/f8/10089284635.jpg?caw=800)
こんな感じ。
そうするとプロジェクトにTestWin.h、TestWin.mが現れる。
![Fig.3](https://stat.ameba.jp/user_images/5c/06/10089284637.jpg?caw=800)
で、できたTestWin.hの中のNSObjectを下のようにNSWindowに変えてIBOutlet id animatorてのを追加しておく。IBOutletはInterface Builder用に用意されたキーワード。詳しく知りたい人はCocoaアプリケーションチュートリアルを読みましょう。
@interface TestWin : NSWindow {
IBOutlet id animator;
}
@end
後はMainMenu.xibをダブルクリック
![Fig.4](https://stat.ameba.jp/user_images/14/80/10089285181.jpg?caw=800)
Interface Builder起動するから、Windowアイコンを選択してWindow Identityを表示させClass選択メニューをクリック。
![Fig.5](https://stat.ameba.jp/user_images/a1/b9/10089285484.jpg?caw=800)
クラス情報のNSWindowからTestWinに選び直す(ちゃんと出てくるんだよね~)。
![Fig.6](https://stat.ameba.jp/user_images/cf/4f/10089285720.jpg?caw=800)
これでanimatorってOutletが出てきたはず。
![Fig.7](https://stat.ameba.jp/user_images/cd/6f/10089285928.jpg?caw=800)
あとはWindowからanimatorに向かってコントロールキー+ドラッグで線を結んでOutletにanimatorを指定。
![Fig.8](https://stat.ameba.jp/user_images/5a/78/10089286193.jpg?caw=800)
![Fig.9](https://stat.ameba.jp/user_images/68/fc/10089286196.jpg?caw=800)
これでInterfaceBuilderは用がなくなったので保存して終了。
あとはTestWin.mに
@implementation TestWin
- (void)mouseDown:(NSEvent *)theEvent
{
[animator test];
}
@end
て書き込み、animator.mのawakeFromNibをtestに書き換え
- (void)awakeFromNib
{
・
・
↓
-(void)test
{
・
・
これで実行!
今回はウィンドウが開いても何もおこなわれず、クリックして初めて、この前作ったアニメーションが実行されるはず。
これで頭のいいやつは、もう「棒取りゲーム」が作れちゃうよね。
おバカさんは、待て次号!
------------
サンプルプロジェクト:click.zip
Cocoaアプリケーションチュートリアル
Core Animation プログラミングガイド 日本語訳版
この前の「クォーツの世界」で作ったのが、自分的に面白かったので、あれのコアアニメーション版やってみる。ウィンドウクリックしてしばらく待ってると突然棒が落ちてくるので、気づいた時点でクリック。これで反射時間を測定といきましょう。
名付けて「棒取りゲーム」
流れ的にはこんな感じ。
![](https://stat.ameba.jp/user_images/11/47/10089281874.jpg?caw=800)
で、問題はクリックをどう拾うか?
なんだけど「クォーツの世界」でやったビューに独自描画機能を付けた時と同じですな。ちゃんと Introduction to View Programming Guide for Cocoa読んでっか?(クォーツの世界の方、リンク間違ってるな...)
今回はdrwaRectではなく
- (void)mouseDown:(NSEvent *)theEvent
を使います。
でもって「クォーツの世界」の時みたいにNSViewをって、ねーよ。
めんどくさがってビューじゃなくウィンドウでダイレクトにアニメーションしたからNSWindowしかねーし。
ま、同じようなもんだろってことで今回はNSViewじゃなくNSWindowsをカスタム化~。
NSWindowsをカスタム化
今回は新しいXcodeなんで、ちょっとカスタム化の手順が変わる。「クォーツの世界」の時はInterface Buiderでサブクラス化してファイル書き出してってやってたわけだけど、「Cocoaアプリケーションチュートリアル:モデルの定義」から「モデルとビューのブリッジ:コントローラ」に渡って紹介されてる手順は
Xcodeでカスタムソース作成→InterfaceBuilder起動→カスタムクラスに変更
でした。
まずはファイル>新規ファイルメニューを選んでTestWin.h、TestWin.mを作成だ。
![Fig.1](https://stat.ameba.jp/user_images/c7/d5/10089284200.jpg?caw=800)
Objective-C NSView subclass なんてのもあるけど、Objective-C subclassで十分っす。
![Fig.2](https://stat.ameba.jp/user_images/76/f8/10089284635.jpg?caw=800)
こんな感じ。
そうするとプロジェクトにTestWin.h、TestWin.mが現れる。
![Fig.3](https://stat.ameba.jp/user_images/5c/06/10089284637.jpg?caw=800)
で、できたTestWin.hの中のNSObjectを下のようにNSWindowに変えてIBOutlet id animatorてのを追加しておく。IBOutletはInterface Builder用に用意されたキーワード。詳しく知りたい人はCocoaアプリケーションチュートリアルを読みましょう。
@interface TestWin : NSWindow {
IBOutlet id animator;
}
@end
後はMainMenu.xibをダブルクリック
![Fig.4](https://stat.ameba.jp/user_images/14/80/10089285181.jpg?caw=800)
Interface Builder起動するから、Windowアイコンを選択してWindow Identityを表示させClass選択メニューをクリック。
![Fig.5](https://stat.ameba.jp/user_images/a1/b9/10089285484.jpg?caw=800)
クラス情報のNSWindowからTestWinに選び直す(ちゃんと出てくるんだよね~)。
![Fig.6](https://stat.ameba.jp/user_images/cf/4f/10089285720.jpg?caw=800)
これでanimatorってOutletが出てきたはず。
![Fig.7](https://stat.ameba.jp/user_images/cd/6f/10089285928.jpg?caw=800)
あとはWindowからanimatorに向かってコントロールキー+ドラッグで線を結んでOutletにanimatorを指定。
![Fig.8](https://stat.ameba.jp/user_images/5a/78/10089286193.jpg?caw=800)
![Fig.9](https://stat.ameba.jp/user_images/68/fc/10089286196.jpg?caw=800)
これでInterfaceBuilderは用がなくなったので保存して終了。
あとはTestWin.mに
@implementation TestWin
- (void)mouseDown:(NSEvent *)theEvent
{
[animator test];
}
@end
て書き込み、animator.mのawakeFromNibをtestに書き換え
- (void)awakeFromNib
{
・
・
↓
-(void)test
{
・
・
これで実行!
今回はウィンドウが開いても何もおこなわれず、クリックして初めて、この前作ったアニメーションが実行されるはず。
これで頭のいいやつは、もう「棒取りゲーム」が作れちゃうよね。
おバカさんは、待て次号!
------------
サンプルプロジェクト:click.zip
Cocoaアプリケーションチュートリアル
Core Animation プログラミングガイド 日本語訳版