6. Ogre3D: Ввод пользователя

28.06.2012

Для того, чтобы ваша программа была игрой, а не мультимедиа приложением, необходимо организовать взаимодействие с пользователем.

Обычно, такое взаимодействие организуется через стандартные средства персонального компьютера – мышь и клавиатуру. Модуль ввода в случае 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
Присвоен тэг:

avatar

Об Авторе ()

Коллективный разум нашей редакции. Все человеческое здесь заканчивается и начинается C++!

Комментирование закрыто.

Наверх