【Obj-C】 GameController.frameworkでLogicool G550を使ってみる！【iOS7】

# iPhone Game Controller 、Logicool G550

先日、Logicool社よりiphone用ゲーミングコントローラー、G550が発売されました。

[Logicool G550 PowerShell](http://gaming.logicool.co.jp/ja-jp/product/powershell-controller-and-battery "Logicool G550")

詳しい説明はリンク先を参考にしてほしいですが、
簡単に説明しますと、iOS7より標準搭載となった、GameController.flameworkに対応したiphone用ゲームコントローラーです。
iphoneにガチャっとくっつけるだけでゲーム機さながらの操作性を体験出来ます。

# GameController.framework

[GameController.framework document](https://developer.apple.com/jp/devcenter/ios/library/documentation/GameControllerPG.pdf , "PDF")

GameController.frameworkにはゲーミングコントローラーを使用するために最低限必要な機能は一通り揃っている、フレームワークです。

・ジョイスティックの入力
・各ボタンの入力
・コントローラーの接続検知
・コントローラーの接続解除検知
などなど。

って読んでみたけど、よく分からん。
で、実際に使う場合どうすんの？っていう。

# 早速実装してみる（Obj-C編)

### Project作成

ここは省略。今回はSpriteKitにしてみました。

### GameController.frameworkの追加

G550のInputを受け取りにはGameController.frameworkが必要ですので、
こちらをプロジェクトに組み込みます。

![スクリーンショット 2013-12-25 0.02.12.png](https://qiita-image-store.s3.amazonaws.com/0/26453/33ada700-8cb1-2a2d-34f7-6efc22f488b8.png)

### 早速実装してみる。

プロジェクト作成時にHello world出してるラベルがあるので、そこに入力を表示させてみる。

```objc:MyScene.h
#import <SpriteKit/SpriteKit.h>
#import <GameController/GameController.h>
 
@interface MyScene : SKScene
@property(retain , nonatomic) GCGamepad * gamepad;
@property(retain , nonatomic) SKLabelNode *myLabel;
@end
```


```objc:MyScene.m

#import "MyScene.h"
 
@implementation MyScene
 
-(id)initWithSize:(CGSize)size {    
    if (self = [super initWithSize:size]) {
        /* Setup your scene here */
        
        self.backgroundColor = [SKColor colorWithRed:0.15 green:0.15 blue:0.3 alpha:1.0];
        
        self.myLabel = [SKLabel NodelabelNodeWithFontNamed:@"Chalkduster"];
        
        self.myLabel.text = @"Hello, World!";
        self.myLabel.fontSize = 30;
        self.myLabel.position = CGPointMake(CGRectGetMidX(self.frame),
                                       CGRectGetMidY(self.frame));
        
        [self addChild:self.myLabel];
        
        [GCController startWirelessControllerDiscoveryWithCompletionHandler:^{
            
            NSArray * controllers = [GCController controllers];
            for(GCController * c in controllers){
                if(self.gamepad == nil){
                    self.gamepad = c.gamepad;
                    
                    self.gamepad.valueChangedHandler = ^(GCGamepad *gamepad, GCControllerElement *element){
                        NSString * dpad = [NSString stringWithFormat:@"dpad == %f , %f" , gamepad.dpad.xAxis.value , gamepad.dpad.yAxis.value];
                        self.myLabel.text = dpad;
                    };
                    
                    break;
                }
            }
        }];
        
    }
    return self;
}

```

###### ちょっとだけ説明




\+ (void)startWirelessControllerDiscoveryWithCompletionHandler:(void (^)(void))completionHandler

これは、ゲームコントローラと接続が開始された時にイベントを発行するハンドラ。
接続が開始されると、

[GCController controllers];

ここに自動的に追加されるので、それを取得する。
さらにそのGCController内のgamepadを取得して、

GCGamepadValueChangedHandler
typedef void (^GCGamepadValueChangedHandler)(GCGamepad *gamepad, GCControllerElement *element)

このゲームパッドの状態が変更されたらイベントが発行されるハンドラを登録すると、
値が取れる！という事になります。

### 実機で確認してみる。

アプリを入れたあと、一旦取り外してコントローラー接続して…めんどくさ（ｒｙ

おお！しっかり取れました！

![写真.JPG](https://qiita-image-store.s3.amazonaws.com/0/26453/e3ec87ec-1d51-bd0f-4b2d-59dd4f3403f7.jpeg)

写真ではdpadのみ出力してますが、その他もしっかり取れました。

### 次回予告

やっぱりcocos-2dxで使いたいよね！ってことで次回はそっちで使ってまた投稿します。