なんかの Log

良い感じで投げっぱなしにしてみせる。

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];
}

そんな感じで。

参考

Accelerometer not working on restart of scene.

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とかにしてます。

f:id:sugumura:20130406161009p:plain

StoryboardのためにUIViewControlerを作成

UIViewControllerを継承したStoryboardViewControllerクラスを作ります。作成したあとはStoryboardを作成したStoryboardViewControllerをCustom Classとして設定します。ついでにStoryboardのCloseボタンからIBActionを接続しておきます。

f:id:sugumura:20130406163103p:plain

// 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アプリケーション開発の教科書

プロの力を身につける iPhone/iPadアプリケーション開発の教科書