iPhone Game Controller 、Logicool G550
先日、Logicool社よりiphone用ゲーミングコントローラー、G550が発売されました。
詳しい説明はリンク先を参考にしてほしいですが、
簡単に説明しますと、iOS7より標準搭載となった、GameController.flameworkに対応したiphone用ゲームコントローラーです。
iphoneにガチャっとくっつけるだけでゲーム機さながらの操作性を体験出来ます。
GameController.framework
GameController.framework document
GameController.frameworkにはゲーミングコントローラーを使用するために最低限必要な機能は一通り揃っている、フレームワークです。
・ジョイスティックの入力
・各ボタンの入力
・コントローラーの接続検知
・コントローラーの接続解除検知
などなど。
って読んでみたけど、よく分からん。
で、実際に使う場合どうすんの?っていう。
早速実装してみる(Obj-C編)
Project作成
ここは省略。今回はSpriteKitにしてみました。
GameController.frameworkの追加
G550のInputを受け取りにはGameController.frameworkが必要ですので、
こちらをプロジェクトに組み込みます。
早速実装してみる。
プロジェクト作成時にHello world出してるラベルがあるので、そこに入力を表示させてみる。
#import <SpriteKit/SpriteKit.h>
#import <GameController/GameController.h>
@interface MyScene : SKScene
@property(retain , nonatomic) GCGamepad * gamepad;
@property(retain , nonatomic) SKLabelNode *myLabel;
@end
#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)
このゲームパッドの状態が変更されたらイベントが発行されるハンドラを登録すると、
値が取れる!という事になります。
実機で確認してみる。
アプリを入れたあと、一旦取り外してコントローラー接続して…めんどくさ(ry
おお!しっかり取れました!
写真ではdpadのみ出力してますが、その他もしっかり取れました。
次回予告
やっぱりcocos-2dxで使いたいよね!ってことで次回はそっちで使ってまた投稿します。