Я долго думал как правильно организовать обработку ввода, стоит ли генерировать события для нажатия каждой кнопки прямо в обработчике ввода или стоит вынести эту работу в отдельный класс. Особенно меня волновал вопрос связанный с тем, что по факту при наличии GUI есть два варианта событий при нажатии на одну и туже кнопку:
1) в фокусе ввода находится текстовое поле и все нажатия клавиатуры необходимо перенаправлять в него.
2) в фокусе ввода находится выделенный объект и нажатие кнопок это горячие клавиши быстрых действий с ним.
В результате я принял решение что обработчик ввода выполняет только функции опроса клавиатуры и мыши, а также эффекта залипания клавиш. Проблемой определения фокуса ввода и управления объектами в игре будет заниматься класс Манипулятор, который будет знать о всех действиях которые возможно выполнить с объектом. Вариант его реализации будет рассмотрен в будущем.
Период повторения залипшей клавиши равен периоду опроса клавиатуры, данный параметр передается в метод createInput который запускает процесс обработки ввода. Я сознательно выделил запуск в отдельный метод т.к. это удобно и может пригодится во многих ситуациях. Конструктору класса при его создании необходимо передать ID сообщений клавиатуры, мыши и группы ввода которые должны быть определены в движке заранее.
Я не стал использовать класс KeyMap при обработке ввода из-за того что он некорректно обрабатывает нажатие некоторых клавиш, а именно он не различает клавиши левый и правый ALT,SHIFT,CTRL. Из-за этого мне пришлось перейти на более низкий уровень реализации а именно JWJGL
Весь код находитсяДоступно только для пользователей
|