サムです。今日はGameController.frameworkについて軽く触れます。
GameController.frameworkは、MFiのiPhone/iPod/iPadとBluetoothまたは物理接続したコントローラの入力をアプリケーション側に受信できるものです。
そこで、2013/12/24にロジクールから発売された「G550 パワーシェル コントローラ + バッテリー」を使って、SpriteKit + GameController.frameworkについて書きます。
0. 今回の環境
OS X Version: 10.8.5
Xcode Version: 5.0.2
Development Target: 7.0
Devices: iPhone 5S, G550
1. GameController.frameworkの追加
XcodeのプロジェクトからTARGET > General > Linked Frameworks and Libraries
でGameController.framework
を追加します。
2. import
SKSceneクラスを拡張してあるシーンにGameControllerを追加します。
3. ゲームパッド用のプロパティを宣言
まず、ゲームパッドのクラスオブジェクトには2タイプあります。
GCGamepad Class
こちらはとてもシンプルなゲームパットクラスで、次のコントロールを結びつけています。
- Two shoulder buttons.
- Four face buttons arranged in a diamond pattern.
- One directional pad (D-pad).
GCExtendedGamepad
一方のGCExtendedGamepadクラスは、GCGamepadクラスとは事なり、より多くのコントロールに関連しています。
- Two shoulder buttons.
- Two triggers.
- Four face buttons arranged in a diamond pattern.
- One directional pad.
- Two thumbsticks.
G550はGCGamepadクラス用のゲームパッドなので、次のように宣言します。
4. ゲームパッドの接続、切断を検出を通知するコードを追加
ゲームパッドは、Bluetoothで接続されても、ケーブルを介して直接接続されても、ゲーム上では同じように動作されます。
ゲームパッドが接続または切断されたときは、GameController.frameworkからNotificationが発生するので、これを受け取るセレクターを用意します。
この通知は、ゲームコントローラの接続/切断が変更されるたびに呼び出されます。
4-2. ワイヤレスゲームパッドの場合
ワイヤレスコントローラは、通常ゲームの外で接続されます(Bluetoothゲームパッドとかを利用したとき?)
そのため、ゲームの起動前に接続しておく(または、接続した後にゲームを再起動する)必要があります。
けれどもstartWirelessControllerDiscoveryWithCompletionHandler
クラスメソッドを使うことで、ゲーム内でゲームパッド(優先、無線含む)を直接接続することもできます。
この検出プロセスを実行すると、新しいコントローラが自動的に検出され、ゲームパッドとして接続されます。
検出プロセスは自動的にタイムアウト(30秒くらい?)されますがstopWirelessControllerDiscovery
クラスメソッドを呼び出すことで、現在実行されている検索プロセスを停止させることができます。
これらのクラスメソッドは、アプリケーションで適切なユーザインターフェースを設計して、提供する必要があります。
※例えば、ゲーム設定とかに「ワイヤレスコントローラと接続する」的な項目を追加したりとか
まとめ
以上で、GameController.frameworkを使ってG500ゲームパッドに接続することができます。
次回は、ボタンのイベントを取得してみようと思います。
これらのソースコードはGitHubで公開しております。
参考、引用元
Apple Developer - Game Controller Programming Guide