Cocos2dでAccelerometerを有効化
タッチと同じ感じでいけるかと思いきや詰まったので書いておく。
環境
Tool | Version |
---|---|
XCode | 4.6.1 |
Cocos2d | v2.1-rc1 |
コード
UIAccelerometerDelegateを実装する必要があるので宣言。
Sample : CCLayer <UIAccelerometerDelegate> {
}
タッチと同じようにCCLayerを継承したシーンでAccelerometerを有効化。
// initとかに self.accelerometerEnabled = YES;
メソッドをオーバーライド。
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { CCLOG(@"呼んだ?"); }
なんか読んでくれない。で調べたらiOSの方のメソッドを呼んで上げる必要があるようだ。
[[UIAccelerometer sharedAccelerometer] setUpdateInterval:1 / 60]; [[UIAccelerometer sharedAccelerometer] setDelegate:self]; // [[UIApplication sharedApplication] setIdleTimerDisabled:YES];
これで呼んでくれるようになった。setIdleTimerDisableはスリープを防ぐためのもの。今回は必要ないのでコメントアウトしてます。
画面遷移したら必要もないので外しておきます。
- (void)onExit { [[UIAccelerometer sharedAccelerometer] setDelegate:nil]; // [[UIApplication sharedApplication] setIdleTimerDisabled:NO]; [super onExit]; }
そんな感じで。
参考
schedule:interval:repeat:delay:でRepeatForever
Cocos2dのメソッドでscheduleがあるけどschedule:interval:repeat:delay:で無限ループさせるときにどうすんのかと調べたら単純なscheduleでも定数指定してるだけだった。
-(void) schedule:(SEL)selector { [self schedule:selector interval:0 repeat:kCCRepeatForever delay:0]; }
というわけでkCCRepeatForeverを指定すれば良い。
// 最初に3秒待って1秒ごとにhogeを呼び出す。 [self schedule:@selector(hoge) interval:1 repeat:kCCRepeatForever delay:3];
ちなみにkCCRepeatForeverの定義。
#define kCCRepeatForever (UINT_MAX -1) #define UINT_MAX 0xffffffff /* max value for an unsigned int */
とっても頑張って待てば止まるやつを見ることができるかも。UINT_MAXが0xffffffffだから(168-1)なのでざっと計算したら60FPSで820日ぐらい放置すればいいっぽい。多分。
CGImageCreate: invalid image size: 0 x 0
Social.Frameworkを使おうとして端末でFacebookにログインしていない状態で呼び出すとエラーで設定に遷移しなかった。エラー文は下記。
<Error>: CGImageCreate: invalid image size: 0 x 0.
- (void) viewDidAppear:(BOOL)animated { SLComposeViewController *controller = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeFacebook]; [controller setInitialText:@"なんでエラー…"]; [self presentViewController:controller animated:YES completion:nil]; }
結果、実機だと正常に動きましたorz
シミュレータだとエラーがでるということです。しかし、なんのサイズをとっているのやら。最初Cocos2dを使ってたからそっちの画面描画の問題かと思って検証しだしたらまじで時間取られた。。。
なまじTwitterだと上手く動くからまじ鬼畜。
Cocos2dとStoryboardを組み合わせる
iOS初心者にはなかなか大変でした。
環境
Tool | Version |
---|---|
XCode | 4.6.1 |
Cocos2d | v2.1-rc1 |
Storyboardを作成
プロジェクトはCocos2dの初期テンプレートを使ってます。 適当に。closeボタンを押したらCocos2dの画面に戻りたい。名前はStoryboard.storybordとかにしてます。
StoryboardのためにUIViewControlerを作成
UIViewControllerを継承したStoryboardViewControllerクラスを作ります。作成したあとはStoryboardを作成したStoryboardViewControllerをCustom Classとして設定します。ついでにStoryboardのCloseボタンからIBActionを接続しておきます。
// StoryboardViewController.h #import <UIKit/UIKit.h> @interface StoryboardViewController : UIViewController - (IBAction)backCocos2d:(id)sender; @end // StoryboardViewController.m #import "StoryboardViewController.h" #import "AppDelegate.h" @interface StoryboardViewController () @end @implementation StoryboardViewController - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (IBAction)backCocos2d:(id)sender { } @end
Cocos2dからStoryboard画面へ遷移
めんどくさいんでハローワールドのコードをそのまま使います。LeaderboardのボタンをStoryboardの呼び出しに変更します。
// HelloWorldLayer.m // CCMenuItem *itemLeaderboard = [CCMenuItemFont itemWithString:@"Leaderboard" block:^(id sender) { CCMenuItem *itemLeaderboard = [CCMenuItemFont itemWithString:@"Storyboard" block:^(id sender) { UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:[NSBundle mainBundle]]; UIViewController *initialViewController = [storyboard instantiateInitialViewController]; [[CCDirector sharedDirector] presentViewController:initialViewController animated:YES completion:nil]; }];
[CCDirector sharedDirector]でCocos2dが持っているUIViewControllerを取得できるみたいです。あとはインスタンス化したStoryboardからCustom Classに設定したUIViewControllerを取得してコントロールを渡して上げればOKです。
実行してStoryboard画面が見えればOK。
StoryboardからCocos2d画面へ戻る
接続していたIBActionメソッドに書きます。
// StoryboardViewController.m - (IBAction)backCocos2d:(id)sender { [self dismissViewControllerAnimated:YES completion:nil]; }
自由に行き来ができるようになったはず。
参考サイトと書籍
プロの力を身につける iPhone/iPadアプリケーション開発の教科書
- 作者: 藤田泰介
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2013/02/26
- メディア: 大型本
- クリック: 20回
- この商品を含むブログを見る