Comment détecter un bouton appuyer sur un jeu de jeu USB sur OSX 10.5 et supérieur? P>
Je ne peux pas envelopper ma tête autour du gestionnaire HID ridiculement complexe (même si apparemment, il a été simplifié avec 10.5), et les échantillons de code à Apple ont des milliers de lignes de code qui prendraient des jours pour comprendre et isoler ce dont j'ai besoin , alors j'apprécierais que quelqu'un pose une solution simple et entièrement codée pour ce problème isolé. P>
EDIT FORT>: Jusqu'à présent, toutes les réponses sont des liens vers le code source ou les bibliothèques semi-obscur pour toutes sortes de périphériques HID, ce qui nécessitera plus de temps de recherche que ce que j'aimerais investir à ce sujet. Je démarre une prime pour obtenir un extrait de code
7 Réponses :
J'utilise procontroll, mais c'est une bibliothèque Java. C'est bien cependant. P>
Peut-être que vous pourriez peut-être consulter le code source de MAME OS X ? Il a un bon soutien de gamepad. P>
Vous pouvez essayer Dave Dribin 's DDHIDLIB . P>
Dave a fait le port de Mac Mame, donc cela est probablement équivalent mais meilleur que ma suggestion.
Merci Peter. La documentation est rare (sinon inexistante) pour cette bibliothèque, savez-vous comment l'utiliser?
Non, je ne le fais pas. (Bonjour, Durée de la longueur minimum.)
Voici la poste d'introduction d'introduction de Dave. Il pointe vers les échantillons du projet. Je comprends que vous aimeriez un extrait, c'est bon, mais cela ne me regarde pas mal. dribin.org/dave/blog/archives/2007/03 / 19 / ddhidlib_10
Mais avez-vous des gars-là ont essayé de détecter des événements d'un gamepad?
suggestion de Peter du DDHIDLIB framework est exactement ce que vous recherchez. La bibliothèque est bien conçue et le code d'échantillon fourni avec la bibliothèque est assez explicite de soi.
Une implémentation d'un objet qui obtient toutes les joysticks / gamepads attachés au système et les montres pour les appuis sur les boutons à l'aide de DDHIDLIB ressemblerait à quelque chose comme Ceci: p>
Avez-vous testé ce code sur OSX 10.5 et plus? Ça ne fonctionne pas pour moi. Le tableau Joysticks est renseigné correctement, mais les méthodes DDHidJoystick ne sont pas appelées. J'ai ajouté des appels NSLOG aux méthodes DDHidJoyStick DDHidJoystick DDHidJoystick (et toutes les autres méthodes de saisie) et autant que j'appuie tous les boutons et déplacez tous les bâtons, aucune des méthodes ne s'appelle jamais. Je l'ai essayé avec quelques games. Ils apparaissent correctement dans le tableau de joysticks cependant.
et par ddhidjoystick ddhidjoystick Méthodes je voulais dire: ddhid joystick ddhid joystick: bouton bas: et ddhidjoystick ddhidjoystick: boutonnière:
Je crois avoir résolu le problème indiqué par l'affiche originale en ce qui concerne le code d'échantillon donné: P>
ddhidjoystick * actuelJoystick = [joysticks ObjectAindex: 0]; [CurrentJoystick StartListening]; P>
Vous devez sélectionner un joystick et commencer à l'écouter. Aussi simple que cela! Notez que vous pouvez remplacer le 0 avec n'importe quel index valide dans le tableau de joysticks, afin de sélectionner le joystick que vous écoutez, et je devine que vous pouvez écouter plus d'un à la fois si vous le souhaitez. P>
Notez également que cette initialisation (et la ci-dessus) doit être effectuée à partir d'un fil qui a une boucle d'exécution. Si vous travaillez sur des applications Native Mac OS X, ce n'est pas un problème, mais si vous écrivez le code portable et espère utiliser des threads POSIX, vous constaterez que de nombreux objets de cacao ne fonctionnent pas lors de la création d'un POSIX fil. J'ai constaté que vous pouvez généralement les appeler en toute sécurité à partir d'un thread une fois créé, mais la création doit se produire sur un fil avec une boucle d'exécution. Presque tous les objets de cacao qui fonctionnent via des événements de style de rappel, tirent ces événements de la boucle de course du fil qui les crée. P>
Premièrement, importez le cadre IOKIT et incluez-le comme celui-ci dans votre en-tête et vos fichiers de mise en œuvre: dans votre fichier d'en-tête, vous souhaiterez peut-être avoir cette variable: p> 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) setupGamepad {
hidManager = IOHIDManagerCreate( kCFAllocatorDefault, kIOHIDOptionsTypeNone);
NSMutableDictionary* criterion = [[NSMutableDictionary alloc] init];
[criterion setObject: [NSNumber numberWithInt: kHIDPage_GenericDesktop] forKey: (NSString*)CFSTR(kIOHIDDeviceUsagePageKey)];
[criterion setObject: [NSNumber numberWithInt: kHIDUsage_GD_GamePad] forKey: (NSString*)CFSTR(kIOHIDDeviceUsageKey)];
IOHIDManagerSetDeviceMatching(hidManager, criterion);
IOHIDManagerRegisterDeviceMatchingCallback(hidManager, gamepadWasAdded, (void*)self);
IOHIDManagerRegisterDeviceRemovalCallback(hidManager, gamepadWasRemoved, (void*)self);
IOHIDManagerScheduleWithRunLoop(hidManager, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
IOReturn tIOReturn = IOHIDManagerOpen(hidManager, kIOHIDOptionsTypeNone);
IOHIDManagerRegisterInputValueCallback(hidManager, gamepadAction, (void*)self);
}
Exemple de code de Rob a besoin d'une dernière chose à faire fonctionner.
if([joySticks count] > 0)
{
DDHidJoyStick *myJoyStick = [joySticks objectAtIdex:0];
[myJoyStick startListening];
}
Il vaut la peine de dépenser un peu de temps pour enquêter sur les options. Il m'a fallu toutes cinq minutes pour télécharger la source DDHIDLIB, trouver le code associé à un joystick et créer une implémentation.
J'ai fait dès que Peter l'a posté. Ne pouvait pas le comprendre après 30 min. Si je ne reçois pas d'extraits de code de travail de cette réponse, je n'aurai aucun choix, mais honnêtement, je redoutons ce moment. C'est beaucoup trop complexe pour un problème aussi simple.