环境:iOS 10.3.3
Xcode: 8.3.3
蓝牙手柄:莱仕达MFi认证手柄 链接 (非广告,只是随便搜的)
引用库:
#import <GameController/GameController.h>
在info.plist中添加:
Privacy - Bluetooth Peripheral Usage Description
一、执行配置/连接方法
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
[self configureGameControllers];
}
二、配置方法
//配置 GameController
- (void)configureGameControllers {
NSLog(@"configure GameController");
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(gameControllerDidConnect:) name:GCControllerDidConnectNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(gameControllerDidDisconnect:) name:GCControllerDidDisconnectNotification object:nil];
[GCController startWirelessControllerDiscoveryWithCompletionHandler:^{
// we don't use any code here since when new controllers are found we will get notifications
}];
}
三、判断连接状态,成功则连接 GameController
//判断连接状态
- (void)gameControllerDidConnect:(NSNotification *)notification {
[self configureConnectedGameControllers];
NSLog(@"connect GameController Device success");
}
- (void)gameControllerDidDisconnect:(NSNotification *)notification {
NSLog(@"fail to connect GameController Device");
}
//连接 GameControllers
- (void)configureConnectedGameControllers {
for (GCController *controller in [GCController controllers]) {
[self setupController:controller];
}
}
四、配置按键
//配置按键
- (void)setupController:(GCController *)controller
{
NSLog(@"setupController");
/** 对X,Y,A,B键位进行注册
**/
GCControllerButtonValueChangedHandler Y_ButtonHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
NSLog(@"Y_button (value : %f), (pressed : %d)", value, pressed);
};
GCControllerButtonValueChangedHandler X_ButtonHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
NSLog(@"X_button (value : %f), (pressed : %d)", value, pressed);
};
GCControllerButtonValueChangedHandler A_ButtonHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
NSLog(@"A_button (value : %f), (pressed : %d)", value, pressed);
};
GCControllerButtonValueChangedHandler B_ButtonHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
NSLog(@"B_button (value : %f), (pressed : %d)", value, pressed);
};
if (controller.gamepad) {
controller.gamepad.buttonA.valueChangedHandler = A_ButtonHandler;
controller.gamepad.buttonB.valueChangedHandler = B_ButtonHandler;
controller.gamepad.buttonX.valueChangedHandler = X_ButtonHandler;
controller.gamepad.buttonY.valueChangedHandler = Y_ButtonHandler;
}
if (controller.extendedGamepad) {
controller.extendedGamepad.buttonA.valueChangedHandler = A_ButtonHandler;
controller.extendedGamepad.buttonB.valueChangedHandler = B_ButtonHandler;
controller.extendedGamepad.buttonX.valueChangedHandler = X_ButtonHandler;
controller.extendedGamepad.buttonY.valueChangedHandler = Y_ButtonHandler;
}
/** 对肩部的键位进行注册
**/
GCControllerButtonValueChangedHandler L_ShoulderHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
NSLog(@"L_shoulder (value : %f), (pressed : %d)", value, pressed);
};
GCControllerButtonValueChangedHandler R_ShoulderHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
NSLog(@"R_shoulder (value : %f), (pressed : %d)", value, pressed);
};
if (controller.gamepad) {
controller.gamepad.leftShoulder.valueChangedHandler = L_ShoulderHandler;
controller.gamepad.rightShoulder.valueChangedHandler = R_ShoulderHandler;
}
if (controller.extendedGamepad) {
controller.extendedGamepad.leftShoulder.valueChangedHandler = L_ShoulderHandler;
controller.extendedGamepad.rightShoulder.valueChangedHandler = R_ShoulderHandler;
}
/** 对扳机进行注册
**/
GCControllerButtonValueChangedHandler L_LeftTrigger = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
NSLog(@"L_TriggerHandler (value : %f), (pressed : %d)", value, pressed);
};
GCControllerButtonValueChangedHandler R_LeftTrigger = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
NSLog(@"R_TriggerHandler (value : %f), (pressed : %d)", value, pressed);
};
if (controller.extendedGamepad) {
controller.extendedGamepad.leftTrigger.valueChangedHandler = L_LeftTrigger;
controller.extendedGamepad.rightTrigger.valueChangedHandler = R_LeftTrigger;
}
/** 对左右滑杆、方向按键进行注册
**/
//滑杆
GCControllerDirectionPadValueChangedHandler L_ThumbHandler = ^(GCControllerDirectionPad *dpad, float xValue, float yValue) {
NSLog(@"L_thumbHandler (x : %f), (y : %f)", xValue, yValue);
};
GCControllerDirectionPadValueChangedHandler R_ThumbHandler = ^(GCControllerDirectionPad *dpad, float xValue, float yValue) {
NSLog(@"R_thumbHandler (x : %f), (y : %f)", xValue, yValue);
};
//方向按键
GCControllerDirectionPadValueChangedHandler dpadChangedHandler = ^(GCControllerDirectionPad *dpad, float xValue, float yValue){
NSLog(@"dpad (x : %f), (y : %f)", xValue, yValue);
};
if (controller.extendedGamepad) {
controller.extendedGamepad.leftThumbstick.valueChangedHandler = L_ThumbHandler;
controller.extendedGamepad.rightThumbstick.valueChangedHandler = R_ThumbHandler;
}
if (controller.gamepad.dpad) {
controller.gamepad.dpad.valueChangedHandler = dpadChangedHandler;
}
}
五、苹果官方介绍 Game Controller Programming Guide