Ввод в Urho3D

Материал из Энциклопедия о программировании
Перейти к: навигация, поиск

Подсистема ввода обеспечивает ввод клавиатуры, мыши, джойстика и сенсорного ввода и с помощью опроса интерфейса и событий. Эта подсистема также используется для запроса, имеет ли окно приложения фокус ввода или минимизировано.

Подсистема всегда создается, даже в автономном режиме, но активна только после создания окна приложения. После активации подсистема принимает на себя курсор мыши ОС. По-умолчанию он будет скрыт, поэтому при необходимости следует использовать пользовательский интерфейс для визуализации программного курсора. Для приложений, подобных редактору, курсор ОС можно сделать видимым, вызвав SetMouseVisible().

Список событий

События ввода включают в себя:

  • E_MOUSEBUTTONUP – была отпущена кнопка мыши.
  • E_MOUSEBUTTONDOWN – была нажата кнопка мыши.
  • E_MOUSEMOVE – мышь переместилась.
  • E_MOUSEWHEEL – колесо мыши переместилось.
  • E_KEYUP – ключ был отпущен.
  • E_KEYDOWN – была нажата клавиша.
  • E_TEXTINPUT – строка введенного переведенного текста в формате UTF8. Может содержать один или несколько символов.
  • E_JOYSTICKCONNECTED – джойстик подключен.
  • E_JOYSTICKDISCONNECTED – джойстик был отключен.
  • E_JOYSTICKBUTTONDOWN – была нажата кнопка джойстика.
  • E_JOYSTICKBUTTONUP – была отпущена кнопка джойстика.
  • E_JOYSTICKAXISMOVE – ось джойстика была перемещена.
  • E_JOYSTICKHATMOVE – перемещена шляпа от точки обзора джойстика.
  • E_TOUCHBEGIN – палец коснулся экрана.
  • E_TOUCHEND – палец был оторван от экрана.
  • E_TOUCHMOVE – палец двигался по экрану.
  • E_GESTURERECORDED – запись сенсорного жеста завершена.
  • E_GESTUREINPUT – распознан сенсорный жест.
  • E_MULTIGESTURE – выполняется жест касания с зажатием / поворотом нескольких пальцев.
  • E_DROPFILE – файл был перетащен в окно приложения.
  • E_INPUTFOCUS – изменен фокус ввода приложения или состояние минимизации окна.
  • E_MOUSEVISIBLECHANGED – видимость курсора мыши операционной системы изменена.
  • E_EXITREQUESTED – был запрошен выход из приложения (например, с помощью кнопки закрытия окна.)
  • E_INPUTBEGIN – начинается обработка ввода.
  • E_INPUTEND – обработка ввода завершена.
  • E_SDLRAWINPUT – необработанное событие SDL отправляется для настраиваемой обработки событий.

Ввод с клавиатуры и мыши

Ключевые события включают в себя как символический код клавиши («Key»), который зависит от раскладки клавиатуры, не зависящий от раскладки и ОС скан-код SDL («Scancode»), так и истинный необработанный код клавиши для конкретной ОС («Raw»).

API входного опроса различает инициирование нажатия клавиши клавиатуры и кнопки мыши, и удержание клавиши или кнопки. Методы GetKeyPress и GetMouseButtonPress возвращают true только для одного кадра (инициирования), в то время как методы GetKeyDown и GetMouseButtonDown возвращают истину, пока клавиша или кнопка удерживается нажатой. Чтобы проверить, нажаты ли клавиши или нажаты сканкодом, используйте методы GetScancodeDown и GetScancodePress. Также существуют функции для преобразования кодов клавиш в сканкоды или наоборот или получения имен клавиш. См., напр., GetKeyName и GetKeyFromScancode.

Доступ к движению мыши с момента последнего кадра можно получить с помощью GetMouseMove. Положение курсора в окне можно запросить с помощью GetMousePosition.

В AngelScript доступ к API опроса осуществляется через свойства: input.keyDown[], input.keyPress[], input.scancodeDown[], input.scancodePress[], input.mouseButtonDown[], input.mouseButtonPress[], input.mouseMove, input.mousePosition.

Режимы мыши

Курсор мыши ОС может использоваться в четырех режимах, которые можно переключать с помощью SetMouseMode.

  1. MM_ABSOLUTE - поведение по-умолчанию, позволяющее переключать видимость курсора ОС и позволять курсору выходить из окна, когда он виден. Когда курсор ОС невидим в абсолютном режиме мыши, мышь ограничена окном. Если ОС и курсоры пользовательского интерфейса невидимы, взаимодействие с пользовательским интерфейсом будет ограничен, напр., события завершения перетаскивания не запускаются. SetMouseMode(MM_ABSOLUTE) вызовет SetMouseGrabbed(false).
  2. MM_RELATIVE делает курсор ОС невидимым и ограничивает курсор окном. Курсор ОС нельзя сделать видимым в этом режиме с помощью SetMouseVisible, однако изменения отслеживаются и будут восстановлены при установке другого режима мыши. Когда виртуальный курсор также невидим, взаимодействие с пользовательским интерфейсом будет по-прежнему функционировать как обычно, напр., запускаются события перетаскивания. SetMouseMode(MM_RELATIVE) вызовет SetMouseGrabbed(true).
  3. MM_WRAP захватывает мышь из ОС и ограничивает курсор ОС окном, оборачивая курсор, когда он находится рядом с краями. SetMouseMode(MM_WRAP) вызовет SetMouseGrabbed(true).
  4. MM_FREE не захватывает и не ограничивает курсор мыши, даже когда он скрыт. Это можно использовать в случаях, когда курсор должен отображаться с использованием ОС за пределами окна и выполнять настраиваемый рендеринг (с SetMouseVisible(false)) внутри.

Ввод джойстика

Подключенные джойстики начнут автоматически отправлять события ввода. Каждому джойстику будет присвоен идентификатор, который будет использоваться в последующих событиях джойстика, а также для получения состояния джойстика. Используйте GetJoystick, чтобы получить состояние джойстика по идентификатору. Если у вас нет идентификатора, вы также можете использовать GetJoystickByIndex, который использует индекс, отсчитываемый от нуля; см. GetNumJoysticks, чтобы узнать кол-во подключенных в данный момент джойстиков. Идентификатор, а также имя джойстика можно найти в состоянии джойстика.

Если модель джойстика распознается SDL как игровой контроллер, в сопоставлениях кнопок и осей используются известные константы, такие как CONTROLLER_BUTTON_A или CONTROLLER_AXIS_LEFTX, без необходимости их угадывать. Используйте IsController, чтобы различать игровой контроллер и нераспознанный джойстик.

На платформах, поддерживающих акселерометр, он будет отображаться как «виртуальный» джойстик.

Сенсорный ввод

На платформах, где доступен сенсорный ввод, будут отправляться события начала/конца/перемещения касания, а также события с несколькими жестами со значениями дельты сжатия/поворота при нажатии более чем одним пальцем. К текущим прикосновениям пальца также можно получить доступ через API опроса: GetNumTouches и GetTouch.

Сенсорные жесты можно записывать с помощью встроенной системы распознавания жестов SDL. Используйте RecordGesture, чтобы начать запись. Следующие движения пальцев будут записываться до тех пор, пока палец не будет поднят, после чего запись закончится и будет отправлено событие E_GESTURERECORDED с хеш-идентификатором нового жеста. Текущие жесты в памяти можно сохранить или загрузить как двоичные данные с помощью функций SaveGestures, SaveGesture, LoadGestures.

Каждый раз, когда пользователь вводит распознанный жест, будет отправлено событие E_GESTUREINPUT. Помимо идентификатора наиболее подходящего жеста, он содержит центральное положение и метрику ошибки (ниже = лучше), чтобы помочь отфильтровать ложные жесты.

Обратите внимание, что все записанные (сохраненные или нет) и загруженные жесты хранятся в памяти. Для их очистки доступны две дополнительные функции: RemoveGesture для выборочной очистки жеста по его идентификатору и RemoveAllGestures для их удаления.

Сенсорный ввод также может имитировать виртуальный джойстик, отображая экранные кнопки. См. Функцию AddScreenJoystick.

Эмуляцию касания можно использовать для тестирования мобильных приложений на настольном компьютере без сенсорного экрана. Смотрите SetTouchEmulation. Когда включена эмуляция сенсорного экрана, фактические события мыши больше не отправляются, и курсор мыши ОС становится видимым. Левая кнопка мыши действует как движущийся палец, в то время как остальные кнопки мыши действуют как неподвижные пальцы для жестов с несколькими пальцами. Напр., нажатие левой и правой кнопок мыши, а затем перетаскивание мыши с нажатыми кнопками имитирует жест увеличения масштаба двумя пальцами.

Детали, специфичные для платформы

На платформах, которые поддерживают виртуальную клавиатуру на экране, напр., Android, она может быть отображена или скрыта. Когда показано, нажатия клавиш с виртуальной клавиатуры будут отправляться как события ввода текста, как если бы они были набраны с реальной клавиатуры. Покажите или скройте его, вызвав SetScreenKeyboardVisible. UI подсистема также может автоматически отображать виртуальную клавиатуру, когда LineEdit элемент сфокусирован, и скрыть её, когда расфокусирован. Этим поведением можно управлять, вызывая SetUseScreenKeyboard.

В Windows пользователь должен сначала прикоснуться к экрану один раз, прежде чем будет активирован сенсорный ввод. Попытка записать или загрузить сенсорные жесты до этого не удастся.