Как прослушать нажатия клавиш в приложении Ma c Catalyst? - PullRequest
0 голосов
/ 23 марта 2020

У меня есть простая iOS игра, которую я портирую на Ma c. Я бы хотел, чтобы пользователь мог управлять игрой с помощью клавиатуры. Нет встроенного ввода текста (например, UITextField, UITextView).

Как прослушать события нажатия клавиш в приложении Ma c Catalyst? Это не кажется тривиальным.

UIKeyCommand не работает, потому что кажется, что оно сделано для комбинаций (например, cmd+c). Я мог бы создать поддельное текстовое поле, но я ищу более чистый способ сделать это. Я хочу слушать отдельные буквы и цифры.

Можно ли как-нибудь интегрировать NSResponder::keyDown(with:)?

1 Ответ

1 голос
/ 07 апреля 2020

Вы можете просто переопределить метод pressesBegan. Вот пример кода, который я использую в своей игре для управления игроком. Он использует UIKeyCommand для специальных командных клавиш, таких как клавиши со стрелками, и key.character для реагирования на специальный символ. Оригинальный код взят из документации Apple Catalyst .

override func pressesBegan(_ presses: Set<UIPress>, with event: UIPressesEvent?) {

    var didHandleEvent = false
    for press in presses {
        guard let key = press.key else { continue }
        if key.charactersIgnoringModifiers == UIKeyCommand.inputLeftArrow || key.characters == "a" {
            self.moveLeft(self)
            didHandleEvent = true
        } else if key.charactersIgnoringModifiers == UIKeyCommand.inputRightArrow || key.characters == "d" {
            self.moveRight(self)
            didHandleEvent = true
        } else if key.charactersIgnoringModifiers == UIKeyCommand.inputUpArrow || key.characters == "w" {
            self.moveForward(self)
            didHandleEvent = true
        } else if key.charactersIgnoringModifiers == UIKeyCommand.inputDownArrow || key.characters == "s" {
            self.moveBackward(self)
            didHandleEvent = true
        } else if key.characters == "q" {
            self.turnLeft(self)
            didHandleEvent = true
        } else if key.characters == "e" {
            self.turnRight(self)
            didHandleEvent = true
        }
    }

    if didHandleEvent == false {
        // Didn't handle this key press, so pass the event to the next responder.
        super.pressesBegan(presses, with: event)
    }
}
...