Ogre3D Basic Tutorials / Базовые туториалы Ogre3D: Basic Tutorial 5: Buffered Input
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
КРАТКОЕ СОДЕРЖАНИЕ proVIDec 28.06.11 в 10:24 ВВЕДЕНИЕ В РУКОВОДСТВО wuffur 22.07.11 в 12:43 ВВЕДЕНИЕ Mingun 22.07.11 в 15:15 |
|
|
В этом коротком разделе руководства вы будете учиться использовать буферизованный ввод OIS в отличии от небуферизованного ввода, который мы использовали в предыдущем разделе руководства. wuffur 13.07.11 в 06:41 В этом коротком уроке вы научитесь использовать буферизованный ввод OIS, в противоположность небуферизованному, который мы использовали в прошлом уроке. Mingun 22.07.11 в 15:18 |
||
|
Этот раздел руководства отличается от предыдущего тем, что мы будем управлять событиями клавиатуры и мыши непосредственно, когда они происходят, вместо одного раза за кадр. wuffur 13.07.11 в 06:42 Этот урок отличается от предыдущего тем, что мы будем обрабатывать события клавиатуры и мыши сразу, как они произойдут, а не один раз за каждый кадр. Mingun 22.07.11 в 15:19 |
||
|
Отметим, это означает, что этот раздел руководства только введение в буферизованный ввод, и не является полным рукводством по тому, как использовать OIS. wuffur 13.07.11 в 06:44 Учтите, что этот урок годится только в качестве введения в буферизованный ввод и не является полным руководством по использованию OIS. Mingun 22.07.11 в 15:22 |
||
|
Если хотите больше информации об этом, обязательно посмотрите на статью Использование OIS. wuffur 13.07.11 в 06:45 Для более полной информации о нем обязательно прочтите статью Использование OIS (Using OIS). Mingun 22.07.11 в 15:24 |
+3 | |
|
ДЛЯ НАЧАЛА proVIDec 28.06.11 в 10:18 С ЧЕГО НАЧАТЬ Mingun 22.07.11 в 15:27 |
||
|
Этот урок основан на предыдущем, но мы изменим способ, которым мы принимаем ввод пользователя. Mingun 22.07.11 в 15:28 |
||
|
Поскольку функциональность будет в основном та же, мы будем использовать тот же класс BaseApplication, что и в предыдущий раз. wuffur 13.07.11 в 07:03 |
||
|
Создайте проект в компиляторе, который вы выбрали для этого проекта, и добавьте следующие строки кода: wuffur 13.07.11 в 07:03 Создайте проект для компилятора, который вы выбрали для этого проекта и добавьте следующий код: Mingun 22.07.11 в 15:30 |
+1 | |
|
Объекты и способы контроля программы будут те же, что и в предыдущей части руководства. wuffur 13.07.11 в 07:04 Управление программой будет таким же, как и в прошлом уроке. Mingun 22.07.11 в 15:35 |
+2 | |
|
Мы переопределим методы frameRenderingQueued и createFrameListener, как и методы слушателей событий MouseListener и KeyboardListener (keyPressed(), keyReleased(), mouseMoved(), mousePressed() и mouseReleased()). wuffur 13.07.11 в 07:05 |
+1 | |
|
КОРОТКО, О БУФЕРИЗОВАННОМ ВВОДЕ wuffur 13.07.11 в 07:07 ВКРАТЦЕ О БУФЕРИЗОВАННОМ ВВОДЕ Mingun 22.07.11 в 15:41 |
+1 | |
|
ВВЕДЕНИЕ proVIDec 28.06.11 в 06:07 |
||
|
В предыдущем разделе руководства мы использовали небуферизованный ввод, то есть каждый кадр мы запрашивали состояние экземпляров OIS::Keyboard и OIS::Mouse, чтобы увидеть какие клавиши и кнопки мыши были нажаты. wuffur 13.07.11 в 08:08 В предыдущем уроке мы использовали небуферизованный ввод, то есть каждый кадр мы запрашивали состояние объектов OIS::Keyboard и OIS::Mouse, чтобы определить, какие клавиши и кнопки мыши были нажаты. Mingun 22.07.11 в 15:45 |
||
|
Буферизованный ввод использует интерфейс listener, чтобы информировать вашу программу о произошедших событиях. wuffur 13.07.11 в 08:09 Буферизованный ввод использует интерфейс слушателей для информирования вашей программы о произошедших событиях. Mingun 22.07.11 в 15:46 |
||
|
Например, когда нажата кнопка передается событие KeyListener::keyPressed и когда кнопку отпустили(она больше не нажата), KeyListener::keyReleased событие высвечивается всем зарегистрированным классам. wuffur 13.07.11 в 09:42 Например, когда нажимается клавиша, испускается событие KeyListener::keyPressed, а когда она отпускается (больше не является нажатой) - событие KeyListener::keyReleased. Они доставляются всем зарегистрированным слушателям. Mingun 22.07.11 в 15:49 |
||
|
Это событие заботиться о том, чтобы отслеживать моменты, когда происходить переключение или были ли ключи не нажатыми в предыдущем кадре. wuffur 13.07.11 в 12:33 Это позволяет отслеживать моменты переключения или узнать, была ли клавиша отжата в предыдущем кадре. Mingun 22.07.11 в 15:54 |
||
|
Еще одна важная вещь, что нужно обратить внимание на системы объекта listener из OIS, состоит в том, что вы можете иметь только один объект listener на объекты Keyboard, Mouse или Joystick. wuffur 13.07.11 в 12:35 Одно важное замечание об использовании системы слушателей OIS: вы можете иметь только по одному слушателю для объектов Keyboard, Mouse или Joystick. Mingun 22.07.11 в 15:59 |
||
|
Это сделано для простоты (и для скорости). wuffur 13.07.11 в 12:36 |
+1 | |
|
Вызов функции setEventCallback (которую мы опишем ниже) несколько раз приведет к тому, что только последний зарегистрированный слушатель будет получать события. Mingun 22.07.11 в 16:02 |
+1 | |
|
Если у вас есть большое количество объектов, чтобы получить события Key, Mouse или Joystick вам придется написать сообщение отправляющее себя по назначению. wuffur 13.07.11 в 12:50 Если вам нужно несколько объектов, получающих события от клавиатуры, мыши или джойстика, вы должны написать собственный диспатчер сообщений. Mingun 22.07.11 в 16:05 |
+3 | |
|
Также удостоверьтесь, что вы все еще можете вызывать Keyboard::capture и Mouse::capture в методе frameRenderingQueued. wuffur 13.07.11 в 12:53 Также обязательно убедитесь, что вы вызвали Keyboard::capture и Mouse::capture (что значит захватить - прим. пер.) в методе frameRenderingQueued. Mingun 22.07.11 в 16:08 |
+2 | |
|
OIS не использует нити(или магию) для определения состояния клавиатуры или мыши, поэтому вам приходится определять, когда она должна захватить входной поток данных. wuffur 13.07.11 в 13:04 OIS не использует потоки (или магию) для определения состояний клавиатуры и мыши, поэтому вы должны определить, когда нужно захватить ввод. Mingun 22.07.11 в 16:10 |
+2 | |
|
ИНТЕРФЕЙС ОБЪЕКТА KEYLISTENER wuffur 13.07.11 в 13:00 ИНТЕРФЕЙС KEYLISTENER Mingun 22.07.11 в 16:10 |
+1 | |
|
Интерфейс объекта OIS KeyListener добавляет две виртуальные функции без примесей. wuffur 13.07.11 в 13:01 Интерфейс OIS KeyListener предоставляет две чисто виртуальные функции. Mingun 22.07.11 в 16:12 |
+5 | |
|
Первая функция это keyPressed (которая вызывается каждый раз, когда нажимают кнопку) и функция keyReleased(которая вызывается каждый раз кнопка отпускается). wuffur 13.07.11 в 13:06 Первая - это keyPressed (вызывается каждый раз при нажатии клавиши) и вторая - keyReleased (вызывается каждый раз при отпускании клавиши). Mingun 22.07.11 в 16:19 |
||
|
Параметр передаваемый этим функциям это KeyEvent, который содержит кот кнопки, которую нажали/отпустили. wuffur 13.07.11 в 13:07 Этим функциям передается параметр типа KeyEvent, содержащий информацию о коде нажатой или отпущенной клавиши. Mingun 22.07.11 в 16:21 |
||
|
ИНТЕРФЕЙС ОБЪЕКТА MOUSELISTENER wuffur 13.07.11 в 13:08 ИНТЕРФЕЙС MOUSELISTENER Mingun 22.07.11 в 16:21 |
||
|
Интерфейс объекта MouseListener все лишь немного более сложный, чем интерфейс объекта KeyListener. wuffur 13.07.11 в 13:09 Интерфейс MouseListener лишь немногим сложнее интерфейса KeyListener. Mingun 22.07.11 в 16:22 |
||
|
Он содержит функцию, которая смотрит, когда кнопка мыши была нажата или отпущена: MouseListener::mousePressed и MouseListener::mouseReleased. wuffur 13.07.11 в 13:09 Он содержит функции, следящие за нажатием и отпусканием кнопок мыши: MouseListener::mousePressed и MouseListener::mouseReleased. Mingun 22.07.11 в 16:24 |
+1 | |
|
Она также содержит функцию mouseMoved, которая говорит, когда мышь подвинулась. wuffur 13.07.11 в 13:10 Он также содержит функцию mouseMoved, которая вызывается, когда мышь перемещается. Mingun 22.07.11 в 16:25 |
||
|
Каждая из этих функций получает событие MouseEvent, которое содержит текущую состояние мыши в переменной "state" . wuffur 13.07.11 в 13:11 Каждая из этих функций получает объект MouseEvent, который содержит текущее состояние мыши в переменной "state". Mingun 22.07.11 в 16:26 |
||
|
Наиболее важная вещь, о которой нужно сделать замечание, это замечание об объекте MouseState, и оно состоит в том, что она содержит не только относительные координаты X и Y (то есть, как далеко она подвинулась с предыдущего раза MouseListener::mouseMoved function was called), но также и абсолютные координаты X и Y(то есть, где она находится на экране). wuffur 13.07.11 в 13:14 Самая важная вещь в объекте MouseState, о которой стоит упомянуть, это то, что он содержит не только относительные координаты X и Y перемещения мыши (т.е. расстояние, показывающее, как далеко сместилась мышь со времени последнего вызова функции MouseListener::mouseMoved), но также и абсолютные координаты (т.е. текущее положение мыши на экране). Mingun 22.07.11 в 16:31 |
||
|
КОД proVIDec 28.06.11 в 06:54 МОМЕНТ ИСТИНЫ: КОД Mingun 22.07.11 в 16:32 |
+1 | |
|
ПЕРЕМЕННЫЕ proVIDec 28.06.11 в 06:54 |
||
|
Некоторые переменные изменились с последней части руководства. wuffur 13.07.11 в 13:44 Несколько переменных изменилось с последнего урока. Mingun 22.07.11 в 16:34 |
||
|
Я убрал mToggle и mMouseDown (которые больше не нужны). wuffur 13.07.11 в 13:44 |
||
|
И я также добавил некоторые: wuffur 13.07.11 в 13:44 |
||
|
Переменные mRotate, mMove и mCamNode те же, что и в последнем руководстве(хотя мы будем изменять значение mRotate, поскольку мы по-другому ее используем). wuffur 13.07.11 в 13:45 Переменные mRotate, mMove и mCamNode такие же, что и в последнем уроке (хотя мы будем изменять значение mRotate, поскольку мы используем ее по-другому). Mingun 22.07.11 в 16:37 |
||
|
Переменная mDirection содержит информацию о том как мы собираемся переводить вершину камеры каждый кадр. wuffur 13.07.11 в 13:47 Переменная mDirection содержит информацию о том, как мы собираемся перемещать узел камеры каждый кадр. Mingun 22.07.11 в 16:40 |
+2 | |
|
МЕТОД CREATEFRAMELISTENER Mingun 22.07.11 в 16:40 |
+2 | |
|
В этом методе мы будем вызывать метод createFrameListener из класса BaseApplication и инициализировать некоторые из переменных. wuffur 13.07.11 в 13:48 |
+1 | |
|
Добавьте еще чуток кода в метод createFrameListener: wuffur 13.07.11 в 13:49 |
||
|
Объекты OIS mMouse и mKeyboard уже получены в методе createFrameListener из BaseApplication. wuffur 13.07.11 в 13:50 |
||
|
Здесь мы регистрируем объект listener вызвав метод setEventCallback на этих объекта ввода следующим образом: wuffur 14.07.11 в 11:19 Здесь мы регистрируем слушателя, вызывая метод setEventCallback на объектах ввода, вот так: Mingun 22.07.11 в 16:44 |
||
|
И наконец, нам нужно инициализировать mDirection нулевым вектором(так мы изначально не двигались, следовательно и направления нет): wuffur 14.07.11 в 11:20 |
+2 | |
|
СВЯЗЫВАНИЕ КОМБИНАЦИЙ КЛАВИШ С КОМАНДАМИ wuffur 14.07.11 в 11:26 |
||
|
До тех пор пока мы не начали никуда переходить, нам нужно задать команду клавише Escape на выход из программы. wuffur 14.07.11 в 11:29 Прежде, чем двигаться дальше, мы должны связать клавишу Escape с действием выхода из программы (не вечно же любоваться на свое творение). Mingun 22.07.11 в 16:50 |
||
|
Найдите метод BasicTutorial05::keyPressed. wuffur 14.07.11 в 11:29 |
||
|
Этот метод вызывается объектом KeyEvent, каждый раз когда клавиша на клавиатуре нажимается. wuffur 14.07.11 в 11:30 |
+2 |
