Ogre3D Basic Tutorials / Базовые туториалы Ogre3D: Basic Tutorial 4: Frame Listeners and Unbuffered Input
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
РАЗРАБОТКА СЦЕНЫ proVIDec 28.06.11 в 10:59 УСТАНОВКА СЦЕНЫ wuffur 24.07.11 в 11:37 |
|
|
ВВЕДЕНИЕ proVIDec 27.06.11 в 10:22 |
||
|
Перед тем, непосредственно углубиться в код, давайте кратко опишем то, что мы будем делать. Разберемся что, как и зачем мы добавляем в код. proVIDec 28.06.11 в 07:44 |
||
|
Мы поместим на сцену один объект (ниндзя) и один источник света. proVIDec 28.06.11 в 07:08 Мы поместим на сцену один объект (ниндзя) и один точечный источник света. wuffur 24.07.11 в 11:46 |
||
|
При нажатии на левую кнопку мыши, свет будет включаться и выключаться. proVIDec 28.06.11 в 06:27 |
||
|
Вы сможете двигать Node(к которому привязан ниндзя) используя клавиши IKJL: "I" двигает вперед, "K" назад, "J" влево, правый shift + "J" поворачивают влево, "K" двигает вправо, правый shift + "K" поворачивают вправо. proVIDec 28.06.11 в 07:50 |
||
|
Клавиши "U" и "O" будут двигают Node с ниндзя вверх и вниз. proVIDec 28.06.11 в 07:35 Клавиши "U" и "O" будут двигают узел с ниндзей вверх и вниз. wuffur 24.07.11 в 11:47 |
||
|
КОД proVIDec 28.06.11 в 06:02 |
||
|
Найдите метод BasicTutorial4::createScene. Первое, с чего мы начнем - сделаем окружающий свет очень слабым. proVIDec 28.06.11 в 13:04 |
||
|
Мы бы хотели чтобы объекты на сцене были видны, когда свет выключен, но и чтобы включение/выключение света тоже давало о себе знать. proVIDec 28.06.11 в 13:06 Мы бы хотели, чтобы объекты все еще были видны, когда свет выключен, но мы также хотим, чтобы включение/выключение света было заметным. wuffur 25.07.11 в 07:32 |
||
|
Теперь добавим объект ниндзя на нашу сцену в нулевые координаты. proVIDec 28.06.11 в 08:50 Теперь добавим объект ниндзя на нашу сцену в начало координат: wuffur 25.07.11 в 18:30 |
||
|
Ну а сейчас создадим белый источник света и поместим его на небольшое(относительно) расстояние от ниндзя. proVIDec 28.06.11 в 11:01 |
||
|
С функцией createScene мы закончили. proVIDec 28.06.11 в 08:51 |
||
|
Давайте займемся функцией frameRenderingQueued. proVIDec 28.06.11 в 08:51 |
||
|
КАДРОВЫЙ КОНТРОЛЛЕР proVIDec 29.06.11 в 07:23 |
||
|
Нам нужно добавить код в нашу функцию-контроллер кадров frameRenderingQueued proVIDec 29.06.11 в 07:23 Нам нужно добавить код в нашу контроллер кадров функцию frameRenderingQueued: wuffur 25.07.11 в 18:45 |
||
|
Код будет просто вызывать функции BaseApplication::frameRenderingQueued и (еще на записанную) processUnbufferedInput, а потом возвращаться в цикл. proVIDec 29.06.11 в 06:55 Программа просто вызовет функции BaseApplication::frameRenderingQueued и (еще не записанную) processUnbufferedInput, а потом вернется в цикл рендеринга. wuffur 26.07.11 в 06:07 |
||
|
Для того, чтобы продолжить рендеринг, метод frameStarted должен вернуть положительное значение(true). proVIDec 28.06.11 в 15:04 Для того, чтобы продолжить рендеринг, метод frameStarted должен вернуть положительное булево значение(true). wuffur 26.07.11 в 06:12 |
||
|
Если что-нибудь возвращает ложь(false), то Ogre завершает процесс рендринга и приложение закрывается. proVIDec 28.06.11 в 16:16 Если как-нибудь возвратится ложное значение(false), то Ogre завершит цикл рендринга и приложение закроется. wuffur 26.07.11 в 06:10 |
||
|
Давайте запишем что-нибудь в функции processUnbufferedInput. proVIDec 28.06.11 в 14:27 Давайте запишем что-нибудь в функцию processUnbufferedInput. wuffur 26.07.11 в 06:13 |
||
|
ОБРАБОТКА ВХОДНЫХ ДАННЫХ proVIDec 28.06.11 в 16:17 |
||
|
ПЕРЕМЕННЫЕ proVIDec 28.06.11 в 06:03 |
||
|
Мы определили несколько переменных в классе TutorialFrameListener. proVIDec 28.06.11 в 10:08 Мы определили несколько переменных в классе TutorialFrameListener. wuffur 26.07.11 в 06:13 |
+2 | |
|
mRotate и mMove - это константы вращения и движения, соответственно. proVIDec 28.06.11 в 08:52 |
||
|
Если вы хотите увеличить(уменьшить) скорость передвижения или вращения, измените значение переменных в соответствующую сторону. proVIDec 28.06.11 в 08:54 |
||
|
Другие две переменные(mToggle и mMouseDown) контролируют входные данные. proVIDec 28.06.11 в 14:32 Две другие переменные(mToggle и mMouseDown) контролируют входные данные. wuffur 26.07.11 в 06:15 |
||
|
Это означает, что для запроса состояния клавиатуры и мыши, мы будем вызывать различные методы и контролировать их каждый кадр. proVIDec 29.06.11 в 07:09 Это означает, что мы будем вызывать методы во время работы нашего кадрового контроллера, чтобы запросить состояние клавиатуры и мыши. wuffur 26.07.11 в 06:17 |
||
|
Мы столкнулись с интересной проблемой, когда пытались использовать клавиатуру для изменения состояния какого-либо объекта на сцене. proVIDec 29.06.11 в 07:01 Мы столкнулись с интересной проблемой, когда пытались использовать клавиатуру для изменения состояния какого-либо объекта на экране. wuffur 26.07.11 в 06:17 |
||
|
Если мы видим, что клавиша зажата, мы можем воспользоваться этой информацией, но что тогда произойдет в следующем фрейме. proVIDec 28.06.11 в 14:38 Если мы видим, что клавиша зажата, мы можем воспользоваться этой информацией, но что тогда произойдет в следующем кадре. wuffur 26.07.11 в 06:18 |
||
|
В следующем фрейме мы видим, что та же клавиша нажата и выполняем тоже самое действие. proVIDec 28.06.11 в 18:10 Видим ли мы, что та же клавиша нажата и выполняется то же действие? wuffur 26.07.11 в 06:20 |
||
|
Зажали клавишу "T". В первом фрейме нужная клавиша нажата, свет переключается, в следующем фрейме клавиша "T" до сих пор зажата, и свет снова переключается... и снова и снова, пока клавишу не отпустят. proVIDec 29.06.11 в 06:50 В первом кадре клавиша T нажимается, свет переключается, а в следующим кадре кадре клавиша T все еще нажата, поэтому свет переключается снова... и снова, и снова, пока клавишу не отпустят. wuffur 26.07.11 в 06:23 |
||
|
Что бы избежать этой проблемы, нам нужно отслеживать состояние клавиши между фреймами. proVIDec 03.07.11 в 03:26 Что бы избежать этой проблемы, нам нужно отслеживать состояние клавиши между кадрами. wuffur 26.07.11 в 06:24 |
||
|
Для реализации этого, нам нужно два отдельных метода. proVIDec 03.07.11 в 03:33 Для решения этой проблемы, мы представим два отдельных метода. wuffur 26.07.11 в 06:25 |
||
|
Переменная mMouseDown отслеживает была ли нажата мышь в предыдущем кадре (итак, если mMouseDown принимает значение true,то пока кнопка мыши не будет отпущена, мы не будем выполнять те же действия). proVIDec 08.07.11 в 06:13 |
||
|
Переменная mToggle определяет время, до конца которого мы не можем выполнять действие снова. proVIDec 29.06.11 в 13:13 |
||
|
То есть, когда кнопка нажата, mToggle задается определенное количество времени, до истечения которого никакого другого действия выполнить нельзя. proVIDec 03.07.11 в 03:34 |
||
|
Статичные локальные переменные в основном для удобства. proVIDec 08.07.11 в 06:15 |
||
|
Они так же хорошо могли бы быть и членами первого класса данных нашего BasicTutorial4, но так как они используются только в этой функции, имеет больше смысла держать их здесь. proVIDec 08.07.11 в 15:53 |
||
|
Открытая система ввода (OIS) принимает ввод от трех классов: клавиатура, мышь и джойстик. proVIDec 28.06.11 в 10:07 |
||
|
В этом туториале мы изучим только как манипулировать мышью и клавиатурой. proVIDec 28.06.11 в 09:16 |
||
|
Если вы заинтересованны в использование джойстика(или геймпада) с помощью Ogre, можете заглянуть в класс Joystick. proVIDec 28.06.11 в 09:19 |
+1 | |
|
Прежде чем продолжить, давайте взглянем на BaseApplication::frameRenderingQueued. proVIDec 29.06.11 в 07:28 |
+1 | |
|
Для этого следующие методы добавляются в BaseApplication::frameRenderingQueued: proVIDec 28.06.11 в 14:33 Это происходит, когда эти две линии находятся в BaseApplication::frameRenderingQueued: wuffur 28.07.11 в 07:10 |
||
|
Не добавляйте это в нашу функцию! proVIDec 28.06.11 в 06:06 |
||
|
Первое, что мы хотим сделать - это переключение света нажатием кнопки мыши. proVIDec 28.06.11 в 15:14 |
||
|
Обычно "0" это левая кнопка мыши, "1" правая, и "2" средняя. proVIDec 28.06.11 в 06:06 |
||
|
В некоторых системах клавиша "1" - это средняя кнопка, а "2" правая. proVIDec 28.06.11 в 10:02 |
||
|
Попробуйте разные конфигурации, если кнопки мыши работают не так, как ожидалось. proVIDec 28.06.11 в 10:04 |
||
|
Переменная currMouse будет возвращать значение "true", если кнопка мыши нажата. proVIDec 28.06.11 в 09:59 |
+1 | |
|
Теперь мы будем переключать свет в независимости от того, возвращает ли currMouse значение true. Но мы будем брать во внимание, была ли кнопка нажата в предыдущем фрейме (мы ведь хотим переключить свет один раз за одно нажатие). proVIDec 29.06.11 в 11:55 |
