今作っているアプリで、ボタンを押してメニューを実行するのではなくて、オブジェクトをスライドして、コードを実行出来るようになるクラスを作成しました。こんな感じの動作です。
GitHub にソースを公開したので、良かったら見てみてください。
gitHub プロジェクトリンクはこちら。
tomohisa/CCSliderMenu – GitHub
ポイントはこんな感じです。
- タッチが始まった時、終わったときの画像を表示出来る
- タッチされていないとき、されているときの cocos2d のアクションを登録できる
- 背景、またタッチする画像を設定出来る
- tagと組み合わせる事で、複数のsliderを、一つの関数で処理出来る
- CCSlider オリジナルの、タッチの位置によって、thumb が変な位置に表示されるバグがなおっている
というところでしょうか?使い方はこんな感じです。
[cc lang=”ObjC”]
CGSize wins = [[CCDirector sharedDirector] winSize];
//一つ目 全機能入り
CCSliderMenu* sliderMenu = [CCSliderMenu sliderMenuWithBackgroundFile:@”menuFrame_racing.png” thumbFile:@”n_cf_001_mini.png” blockWhenButtonFire:
^(id sender){[self menuFired:sender];}];
sliderMenu.tag = kTagSliderRace;
sliderMenu.position = ccp(wins.width*1/2.0,wins.height*0.5/2);
//触っていないときのアクション
sliderMenu.regularAction = [CCRepeatForever actionWithAction:[CCSequence actions:[CCScaleTo actionWithDuration:.5 scale:.9],[CCScaleTo actionWithDuration:.5 scale:1.0], nil ]];
//触っているときのアクション
sliderMenu.selectedAction = [CCRepeatForever actionWithAction:[CCSequence actions:[CCFadeTo actionWithDuration:.5 opacity:0x80],[CCFadeTo actionWithDuration:.5 opacity:0xff], nil ]];
//タッチされたときのアクション(音とかを鳴らせる)
sliderMenu.blockTouched = ^(id sender){[self menuStartTouched:sender];};
[self addChild:sliderMenu];
//一番シンプルな作成方法
sliderMenu = [CCSliderMenu sliderMenuWithBackgroundFile:@”menuFrame_racing.png” thumbFile:@”n_cf_001_mini.png” blockWhenButtonFire:
^(id sender){[self menuFired:sender];}];
sliderMenu.tag = kTagSliderRace2;
sliderMenu.position = ccp(wins.width*1/2.0,wins.height*1.5/2);
[self addChild:sliderMenu];
[/cc]
技術的に行った点も列挙しときます。
- Blocks を使って、コールバックを行っている(iOS4以降必須)
- blockをプロパティに定義している
- CCSlider は、背景のどこをタッチしてもいいけれども、これは、ノブ(Thumb)だけがタッチ出来るように。
- Kobold2Dでの開発
- ライブラリ用と実開発用のファイルをリンクさせる方法
delegate モデルを使わずに、blocksで関数を登録して、メニューを実行するときの処理を記述。これによって、使用するクラスで、自由度が増している。blocks便利です。
最初に、 typedef しているのと、copy でプロパティ定義しているのがポイントです。
[cc lang=”ObjC”]
typedef void (^BlockTypeFire)(id sender);
@interface CCSliderMenu : CCSlider
@property (nonatomic, copy) BlockTypeFire blockFire;
@property (nonatomic, copy) BlockTypeFire blockTouched;
[/cc]
isTouchForMe: をオーバーライド
[cc lang=”ObjC”]
-(BOOL) isTouchForMe:(CGPoint)touchLocation
{
// Only use thumb for this purpose.
if (CGRectContainsPoint([_thumb boundingBox], touchLocation))
return YES;
return NO;
}
[/cc]
Kobold2D プレビュー4 で開発してみました。Cocos2dを知っている人だったら、使い方は問題ないですね。実際、ライブラリは cocos2d で書き直しましたが、すぐに移行出来ました。Kobold2D は、AppDelegateとか、RootViewControllerなどがKobold2d により定義されているため、実際自分で書かないといけない事が非常に少ないのがいいです。
明日には出るという、Preview5版では、AdMob と iAd の表示も、config.lua ファイルの変更だけで出来るようなので、楽しみですね。
実際に開発中のアプリのためにクラスを作成して、gitHubに登録するために、シンボリックリンクを張ったのですが、それだと、張られた側のファイルをgitに正しく登録出来ない問題が発生しました。これは、Hardlink というリンクの方法で解決する事が分かりました。それについては、一つ前のブログポストをご覧下さい。
git に、シンボリックリンクされたファイルを追加出来ない場合の対処方法 « Zero4Racer PRO Developer’s Blog
こんな感じのライブラリなので、良かったら見ていただければ嬉しいです。何か改善案があれば、是非教えてください。