CocoaPods管理のcocos2dを使ってアプリケーションを作成する


最近[cocos2d-iphone](http://www.cocos2d-iphone.org/)を触り始めました。
開発するiOSアプリケーションへライブラリを組み込みたい時にいろいろな手間をはぶける[CocoaPods](http://cocoapods.org/)、使っていますか？
ひとつひとつファイルをダウンロードしてきてプロジェクトに追加なんて面倒くさくてやっていられないですよね。

cocos2dをインストールするとXcodeにプロジェクトテンプレートが追加されます。
普通はプロジェクト作成時にこのテンプレートを選択することになると思いますが、cocos2dのファイル群が自分の書いたソースファイルと同列にあるのが気持ち悪い。
cocos2dもCocoaPodsで管理するようにしましょう。

cocos2dはCocoaPodsに登録されているので、他のライブラリと同じようにPodfileへ以下のように書けばプロジェクトに追加することができます。

    pod 'cocos2d'

やってみましょう。

まず、プロジェクトを作成するときには、`Empty Application` を選択します。
必要な情報を入力してプロジェクトを作成しましょう。
プロジェクトを作成したら、プロジェクトのディレクトリに`Podfile`を作成します。
Podfile には上にも書いた、`pod 'cocos2d'`を記述します。
もちろん、他のライブラリを追加してもOKです。

編集を終えたら、`pod install`を実行します。
この記事ではcocoapodsの使い方は説明しません。
cocoapodsもインストールされているものとして話を進めます。
生成された hogehoge.xcworkspace を開くと、Podsプロジェクトにcocos2dのファイル郡が追加されています。

cocos2dのテンプレートをつかってプロジェクトを作成したときと違って、AppDelegateにはcocos2d関連の処理が書かれていません。
当然ですね。
なので、cocos2dのテンプレートを使った時に生成されるファイルを参考に、以下のようにAppDelegateのファイルを編集します。

```objectivec:CCAppDelegate.h
#import <UIKit/UIKit.h>
#import <cocos2d.h>

@interface CCAppDelegate : UIResponder <UIApplicationDelegate, CCDirectorDelegate>

@property (strong, nonatomic) UIWindow *window;

@end
```

```objectivec:CCAppDelegate.m
#import "CCAppDelegate.h"

@interface CCAppDelegate ()

@property (weak, nonatomic) CCDirectorIOS *director;
@property (strong, nonatomic) UINavigationController *rootViewController;

@end

@implementation CCAppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    CCGLView *glView = [CCGLView viewWithFrame:self.window.bounds
                                   pixelFormat:kEAGLColorFormatRGB565
                                   depthFormat:0
                            preserveBackbuffer:NO
                                    sharegroup:nil
                                 multiSampling:NO
                               numberOfSamples:0];

    self.director = (CCDirectorIOS *)[CCDirector sharedDirector];
    self.director.wantsFullScreenLayout = YES;
    self.director.displayStats = NO;
    self.director.animationInterval = 1.0/60;
    self.director.view = glView;
    self.director.delegate = self;
    self.director.projection = kCCDirectorProjection2D;

    [self.director enableRetinaDisplay:YES];

    [CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGBA8888];

    CCFileUtils *fileUtils = [CCFileUtils sharedFileUtils];
    [fileUtils setEnableFallbackSuffixes:NO];
    [fileUtils setiPhoneRetinaDisplaySuffix:@"-hd"];
    [fileUtils setiPadSuffix:@"-ipad"];
    [fileUtils setiPadRetinaDisplaySuffix:@"-ipadhd"];

    [CCTexture2D PVRImagesHavePremultipliedAlpha:YES];

    [self.director pushScene:[IntroLayer scene]];

    self.rootViewController = [[UINavigationController alloc] initWithRootViewController:self.director];
    self.rootViewController.navigationBarHidden = YES;

    self.window.rootViewController = self.rootViewController;
    [self.window makeKeyAndVisible];

    return YES;
}

- (void)applicationWillResignActive:(UIApplication *)application
{
    if (self.rootViewController.visibleViewController == self.director) {
        [self.director pause];
    }
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    if (self.rootViewController.visibleViewController == self.director) {
        [self.director stopAnimation];
    }
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    if (self.rootViewController.visibleViewController == self.director) {
        [self.director startAnimation];
    }
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    if (self.rootViewController.visibleViewController == self.director) {
        [self.director resume];
    }
}

- (void)applicationWillTerminate:(UIApplication *)application
{
    CC_DIRECTOR_END();
}

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
{
    [self.director purgeCachedData];
}

- (void)applicationSignificantTimeChange:(UIApplication *)application
{
    self.director.nextDeltaTimeZero = YES;
}

@end
```

IntroLayerをpushSceneしているところは好きなLayerクラスに置き換えてください。
これでCocoaPodsで追加したcocos2dが使えるはずです。