我正试图在我的游戏中检测并使用连接到我的Mac的游戏手柄。 我正在使用IOKit,但没有成功。 游戏手柄被识别为我下载的Mac应用程序可以查看所有连接的游戏手柄。 它是罗技F310,我已将其设置为DirectInput。 我在awakeFromNib中调用setupInput但是没有调用任何回调。 没有抛出错误或异常。 我不知道为什么不调用回调。 我究竟做错了什么? 我想也许这是运行循环的一个问题。我尝试了CFRunLoopGetMain和CFRunLoopGetCurrent。
不确定还能做什么。
编辑:正如某人所建议的那样,我试图将相同的GamePad代码放在一个新项目中并且它有效。 类的结构有一些不同,但即使我试图复制类,我也无法在我的应用程序中使用它。 我的应用程序使用AppDelegate和NSOpenGLView。奇怪的是,它没有NSViewController。 最小的应用程序使用NSOpenGLView,但也使用NSResponder,当我将游戏手柄代码放在(自定义)NSResponder类中时,它"工作"(检测游戏手柄并响应输入)。 我尝试将该自定义类添加到我的应用程序中,但它没有工作"。 我错过了什么?
void gamepadWasAdded(void* inContext, IOReturn inResult, void* inSender, IOHIDDeviceRef device) {
NSLog(@"Gamepad was plugged in");
}
void gamepadWasRemoved(void* inContext, IOReturn inResult, void* inSender, IOHIDDeviceRef device) {
NSLog(@"Gamepad was unplugged");
}
void gamepadAction(void* inContext, IOReturn inResult, void* inSender, IOHIDValueRef value) {
NSLog(@"Gamepad talked!");
IOHIDElementRef element = IOHIDValueGetElement(value);
NSLog(@"Element: %@", element);
int elementValue = IOHIDValueGetIntegerValue(value);
NSLog(@"Element value: %i", elementValue);
}
-(void) setupInput {
//get a HID manager reference
hidManager = IOHIDManagerCreate(kCFAllocatorDefault,
kIOHIDOptionsTypeNone);
//define the device to search for, via usage page and usage key
NSMutableDictionary* criterion = [[NSMutableDictionary alloc] init];
[criterion setObject: [NSNumber numberWithInt: kHIDPage_GenericDesktop]
forKey: (NSString*)CFSTR(kIOHIDDeviceUsagePageKey)];
[criterion setObject: [NSNumber numberWithInt: kHIDUsage_GD_Joystick]
forKey: (NSString*)CFSTR(kIOHIDDeviceUsageKey)];
//search for the device
IOHIDManagerSetDeviceMatching(hidManager,
(__bridge CFDictionaryRef)criterion);
//register our callback functions
IOHIDManagerRegisterDeviceMatchingCallback(hidManager, gamepadWasAdded,
(__bridge void*)self);
IOHIDManagerRegisterDeviceRemovalCallback(hidManager, gamepadWasRemoved,
(__bridge void*)self);
IOHIDManagerRegisterInputValueCallback(hidManager, gamepadAction,
(__bridge void*)self);
//scedule our HIDManager with the current run loop, so that we
//are able to recieve events from the hardware.
IOHIDManagerScheduleWithRunLoop(hidManager, CFRunLoopGetMain(),
kCFRunLoopDefaultMode);
//open the HID manager, so that it can start routing events
//to our callbacks.
IOHIDManagerOpen(hidManager, kIOHIDOptionsTypeNone);
}
// Put our timer in -awakeFromNib, so it can start up right from the beginning
-(void)awakeFromNib
{
renderTimer = [NSTimer timerWithTimeInterval:0.001 //a 1ms time interval
target:self
selector:@selector(timerFired:)
userInfo:nil
repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:renderTimer
forMode:NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] addTimer:renderTimer
forMode:NSEventTrackingRunLoopMode]; //Ensure timer fires during resize
[self setupInput];
}
答案 0 :(得分:4)
好的,我发现了这个问题。 问题是我的Mac应用程序在沙箱中,我没有勾选硬件/ USB复选框。 选中此选项后,它将使用原始代码。