Я планировал сделать небольшую кроссплатформенную игру с kivy, и когда я тестировал способ ввода с клавиатуры на ПК, меня ждал небольшой сюрприз.
Kivy, похоже, не обрабатывает несколько нажатых клавиш одновременно с событиями on_keyboard_down, когда вы нажимаете более одной клавиши одновременно в kivy, класс клавиатуры, используемый в официальной документации, передает последнюю нажатую клавишу при изменении всех нажатых клавиш в данный момент.
Похоже, что класс клавиатуры предназначен для того, чтобы пользователь мог вводить текст в приложении, потому что, когда вы нажимаете клавишу в течение нескольких секунд, возникает небольшая задержка между первым событием клавиши и остальными из них (которые, наконец, по одному на шаг), точно так же, как тот, который вы можете заметить при наборе текста.
Это код, который я написал для интерактивного приветствия с клавиатурой.
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.scatter import Scatter
from kivy.core.window import Window
class MyApp(App):
def __init__(self, **kwargs):
super(MyApp, self).__init__(**kwargs)
self._keyboard = Window.request_keyboard(self._keyboard_closed, self)
self._keyboard.bind(on_key_down = self._on_keyboard_down)
def _keyboard_closed(self):
self._keyboard.unbind(on_key_down = self._on_keyboard_down)
self._keyboard = None
def _on_keyboard_down(self, keyboard, keycode, text, modifiers):
print str(keyboard)+' '+str(keycode[1])+' '+str(text)+' '+str(modifiers)
if keycode[1] == 'w':
self.moveable.y += 1
if keycode[1] == 's':
self.moveable.y -= 1
if keycode[1] == 'd':
self.moveable.x += 1
if keycode[1] == 'a':
self.moveable.x -= 1
def build(self):
self.moveable = Scatter()
self.moveable.add_widget( Label(text = 'Hello moving world!') )
return self.moveable
if __name__ == '__main__':
MyApp().run()
Из-за того, что я писал ранее, это не похоже на ввод с клавиатуры, который я бы использовал для видеоигры, и я нигде не нашел, как улучшить его для этой цели.
Извините, если вопрос по какой-то причине неуместен, я пытался найти на него ответ, но не смог, так что вот он.
Спасибо вам большое заранее, если вы можете помочь с этим.