6. Ogre3D: Ввод пользователя
Для того, чтобы ваша программа была игрой, а не мультимедиа приложением, необходимо организовать взаимодействие с пользователем.
Обычно, такое взаимодействие организуется через стандартные средства персонального компьютера – мышь и клавиатуру. Модуль ввода в случае Ogre3D является, фактически, “готовым к употреблению”. Вам не нужно проводить дополнительную настройку, резве только, если вы хотите использовать какие либо нестандартные устройства. В этом уроке мы покажем вам, как пользоваться буферизованным и небуферизованным вводом с клавиатуры и мыши средствами Ogre3D – библиотекой OIS.
Небуферизованный ввод.
Начнем мы наш диалог о вводе с более простого случая – небуферизованного ввода. Что значит “небуферизованный”? Это значит, что состояние устройств ввода проверяется нами самостоятельно.
Т.е. перед отрисовкой каждого кадра в нашем игровом цикле, мы опрашиваем состояние мышки и клавиатуры и программируем реакцию на изменения этого состояния.
В предыдущей статье мы описывали способы обработки игровой механики в цикле. Вот как выглядел бы небуферизованный ввод в виде псевдокода в момент обработки каждого кадра:
while( true ) { if ( leftPressed ) rotateShipLeft(); if ( rightPressed ) rotateShipRight(); drawShip(); } |
В случае Ogre3D устройства, которые нас интересуют – это
OIS::Mouse* mMouse; OIS::Keyboard* mKeyboard; |
Найти их можно в protected части базового приложения.
Основной метод, которым мы можем воспользоваться для определения состояния клавиатуры это
mKeyboard->isKeyDown( OIS::KC_* ); |
где KC_* — идентификатор клавиши. Полный список клавиш вы можете найти в хедере OISKEyboard.h.
Проверить состояние мыши еще проще. Для этого существует метод
OIS::MouseState & state = mMouse->getMouseState(); |
Этот метод возвращает ссылку на структуру MouseState. Внутри этой структуры вы можете найти инфо о перемещении мыши и проверить состояние клавиш с помощью метода buttonDown(). Список клавиш для мыши можно найти в хедере OISMouse.h.
Необходимо так же отметить, что для того, чтобы вы могли получать свежую информацию о состоянии устройств, необходимо каждый кадр производить считывание ввода.
Делается это при помощи следующих вызовов
mMouse->capture(); mKeyboard->capture(); |
Просто добывьте эти вызовы перед отрисовкой каждого кадра.
Буферизованный ввод.
В прошлом случае для того, чтобы получить ввод пользователя мы каждый кадр опрашивали мышь и клавиатуру на предмет изменений. В случае буферизованного ввода, Ogre3D использует специальный интерфейс, для того, чтобы оповестить приложение о событиях ввода. Фактически, все, что нужно сделать программисту – это реализовать интерфейс в своем классе и зарегистрировать его.
Интерфейс листнера (OIS::KeyListener) для клавиатуры объявлен следующим образом:
class _OISExport KeyListener { public: virtual ~KeyListener() {} virtual bool keyPressed(const KeyEvent &arg) = 0; virtual bool keyReleased(const KeyEvent &arg) = 0; }; |
Через этот интерфейс Ogre3D сообщает программе о том, что пользователь нажал и отпустил клавишу на клавиатуре (два разных события).
Информация о событии приходит в параметры методов (KeyEvent). Эта структура содержит информацию о том, какая клавиша была нажата.
Интерфейс листнера мыши (OIS::MouseListener) отличается лишь дополнительным методом, сообщающим о перемещениях мыши.
class _OISExport MouseListener { public: virtual ~MouseListener() {} virtual bool mouseMoved( const MouseEvent &arg ) = 0; virtual bool mousePressed( const MouseEvent &arg, MouseButtonID id ) = 0; virtual bool mouseReleased( const MouseEvent &arg, MouseButtonID id ) = 0; }; |
Конкретные параметры события (идентификатор клавиши, расстояния перемещения по осям) так же доступны через аргументы методов.
Найти декларации листнеров можно в файле OISKeyboard.h для клавиатуры и OISMouse.h для мыши, соответственно.
Вы могли заметить, что базовое приложени Ogre имплементирует эти листнеры по умолчанию
class BaseApplication : public Ogre::FrameListener, public OIS::KeyListener |
и регистрирует себя как обработчика событий клавиатуры и мыши
mMouse->setEventCallback( this ); mKeyboard->setEventCallback( this ); |
Заполнен: Ogre3D
