macos - tecla - no se puede instalar mac os x en este ordenador
¿Cómo pueden los juegos de Mac OS X recibir eventos de entrada de teclado de bajo nivel? (6)
De acuerdo, llego tarde a la fiesta, pero creo que la mía es directa y se parece a la solución del Sr. Howards de arriba. Tenga en cuenta que esta entrada se utiliza para controlar la cámara en un juego SpriteKit. De esta forma obtendrás un movimiento continuo suave y una parada precisa.
let moveRight: SKAction = SKAction.repeatForever(SKAction.moveBy(x: -5000, y: 0, duration: 1.5))
...
override func keyDown(with event: NSEvent) {
camera!.constraints = [] // remove constraints usually added by a cameraComponent.
let ekc = event.keyCode
if ekc == 123 { camera!.run(moveLeft, withKey: "moveLeft") }
if ekc == 124 { camera!.run(moveRight, withKey: "moveRight") }
if ekc == 126 { camera!.run(moveUp, withKey: "moveUp") }
if ekc == 125 { camera!.run(moveDown, withKey: "moveDown") }
print("keyDown: /(event.characters!) keyCode: /(event.keyCode)")
}
override func keyUp(with event: NSEvent) {
let ekc = event.keyCode
if ekc == 123 { camera!.removeAction(forKey: "moveLeft") }
if ekc == 124 { camera!.removeAction(forKey: "moveRight") }
if ekc == 126 { camera!.removeAction(forKey: "moveUp") }
if ekc == 125 { camera!.removeAction(forKey: "moveDown") }
}
Los juegos necesitan acceso de bajo nivel a la entrada del teclado. En Windows, hay DirectInput. Pero, ¿qué tecnología utilizan los desarrolladores de juegos de Mac OS X?
Obviamente, hay suficientes juegos de Mac que obtienen la entrada del teclado justo, sin los inconvenientes de las soluciones conocidas:
Solución # 1: Use los eventos keyUp / keyDown
-(void)keyUp:(NSEvent*)event;
-(void)keyDown:(NSEvent*)event;
Desventaja inaceptable: los eventos KeyDown se repiten según la configuración de preferencias del sistema para "tasa de repetición de clave" y "retardo de repetición de clave". Esto causa un evento keyDown inicial seguido de una pausa antes de que comience a repetirse a una velocidad definida por una configuración de preferencia del sistema. Esta solución no se puede utilizar para eventos clave continuos.
Me pregunto si el comportamiento de repetición de clave puede ser desactivado Supongo que podría leer la primera clave Descendente, luego recordar el estado de "clave con claveCódigo x está inactivo" en su clase hasta que se reciba el evento keyUp para esa clave, evitando así los problemas de retardo de repetición y tasa de repetición.
Solución # 2: Use Quarts Event Taps
Ver referencia de servicios de eventos de cuarzo . Parece ser lo suficientemente bajo nivel.
Desventaja inaceptable: requiere que los dispositivos de asistencia estén habilitados en las preferencias del sistema en Acceso universal - Teclado. Si bien esto puede estar activado de forma predeterminada, no hay garantía de que pueda estar apagado en algunos sistemas.
También leí que los toques de eventos de cuarzo requieren que la aplicación se ejecute como root, pero no he encontrado confirmación de esto.
Solución # 3: Carbon Events / IOKit HID
La referencia de Carbon Event Manager está marcada como heredada y no debe utilizarse para nuevos desarrollos.
Desventaja inaceptable: nadie sabe por cuánto tiempo los eventos de Carbon continuarán siendo compatibles en futuras versiones de Mac OS.
Aparte de que Carbon es un marco legado, esta parece ser la mejor solución. Pero, ¿hay otros inconvenientes para el uso de Carbon Events?
Preguntas:
¿Qué tecnología utilizan los desarrolladores de juegos de Mac OS X para recibir eventos de entrada de teclado de bajo nivel? Si utilizan una de las tecnologías anteriores, ¿cómo solucionan los inconvenientes que mencioné?
ACTUALIZAR:
Finalmente, decidí usar los mensajes regulares de NSEvent y los envolví en una API ordenada para sondear los estados del teclado .
Echa un vistazo a ControllerMate y manymouse.
Encontré un muy buen ejemplo de cómo usar los grifos de eventos de cuarzo .
Sin embargo los problemas son:
para ciertos tipos de eventos, el usuario debe ejecutar la aplicación con privilegios de raíz. por ejemplo, la interceptación de eventos keydown y keyup requiere root.
la intercepción es de todo el sistema, lo que significa que cuando el programa se ejecuta, capturará todos los eventos clave, incluso los que se envían a otras aplicaciones. La implementación debe ser muy cuidadosa para no romper otras aplicaciones.
He tenido buena suerte con el # 3, pero requiere mucho trabajo pesado si quieres apoyar algo más allá del teclado.
Sin embargo, un punto rápido antes de que nos sumergamos, Carbon y IOKit HID son dos cosas separadas. El carbono puede desaparecer en algún momento. Pero IOKit HID está aquí para quedarse y acaba de recibir una buena renovación en 10.5.
Para ver un ejemplo completo de cómo encaja todo esto, consulte https://github.com/OpenEmu/OpenEmu/blob/master/OpenEmu/OEHIDManager.m . Esa es una pequeña pieza del rompecabezas, ya que también hay otros archivos allí.
Puede encontrar la documentación de lo que desea hacer en http://developer.apple.com/library/mac/#documentation/DeviceDrivers/Conceptual/HID/new_api_10_5/tn2187.html
Nuevamente, esto no va a desaparecer en el corto plazo y está completamente separado de Carbon y Carbon Events.
Llego tarde a esta fiesta, pero aquí está mi solución para un juego de OSX que estoy escribiendo usando Swift. Es muy simple, y parece estar funcionando bastante bien.
Primero puede poner este código en el controlador que está recibiendo eventos de teclado:
var keysDown = Set<UInt16>()
override func keyDown(e: NSEvent) {
keysDown.insert(e.keyCode)
}
override func keyUp(e: NSEvent) {
keysDown.remove(e.keyCode)
}
Luego, otras partes del sistema pueden determinar si una clave en particular está inactiva:
if (keysDown.contains(49)) {
// space bar is down
}
O recorre todas las teclas que están presionadas actualmente
for char in keysDown {
switch char {
case 49:
// space
player.jump()
case 126:
// up
player.moveForward()
case 124:
// right
player.turnRight()
// ... etc ...
default:
// during development I have this line so I can easily see which keys have which codes
print(char)
}
}
Note keysDown es un Swift Set, por lo que no tiene que preocuparse por los duplicados o los pedidos. Una clave está en el set o no lo está.
No estoy muy seguro de cómo están estandarizados los códigos clave. Pero podría ofrecer una página de configuración del teclado donde el usuario pueda escribir las teclas para cada acción y luego guardar el código de tecla que se encuentre.
También hay algunas clases de dispositivos en polkit (kit de herramientas Obj-C) que incluyen ...
- HIDController para usar dispositivos USB HID
- AppleRemote para usar el Apple Remote
- MidiController para usar dispositivos midi
- OSCController para usar dispositivos compatibles con OSC sobre UDP
- SerialPort para utilizar cualquier dispositivo de puerto serie
- SC2004LCDModule usará el SC 2004 de siliconcraft.net