Ogre3D Basic Tutorials / Базовые туториалы Ogre3D: Basic Tutorial 4: Frame Listeners and Unbuffered Input

← →
Английский оригинал Перевод на русский

Сожалеем, но текст оригинала доступен только зарегистрированным пользователям.

РАЗРАБОТКА СЦЕНЫ

proVIDec 28.06.11 в 10:59

0

УСТАНОВКА СЦЕНЫ

wuffur 24.07.11 в 11:37

0

ВВЕДЕНИЕ

proVIDec 27.06.11 в 10:22

0

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

proVIDec 28.06.11 в 07:44

0

Мы поместим на сцену один объект (ниндзя) и один источник света.

proVIDec 28.06.11 в 07:08

0

Мы поместим на сцену один объект (ниндзя) и один точечный источник света.

wuffur 24.07.11 в 11:46

0

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

proVIDec 28.06.11 в 06:27

0

Вы сможете двигать Node(к которому привязан ниндзя) используя клавиши IKJL: "I" двигает вперед, "K" назад, "J" влево, правый shift + "J" поворачивают влево, "K" двигает вправо, правый shift + "K" поворачивают вправо.

proVIDec 28.06.11 в 07:50

0

Клавиши "U" и "O" будут двигают Node с ниндзя вверх и вниз.

proVIDec 28.06.11 в 07:35

0

Клавиши "U" и "O" будут двигают узел с ниндзей вверх и вниз.

wuffur 24.07.11 в 11:47

0

КОД

proVIDec 28.06.11 в 06:02

0

Найдите метод BasicTutorial4::createScene. Первое, с чего мы начнем - сделаем окружающий свет очень слабым.

proVIDec 28.06.11 в 13:04

0

Мы бы хотели чтобы объекты на сцене были видны, когда свет выключен, но и чтобы включение/выключение света тоже давало о себе знать.

proVIDec 28.06.11 в 13:06

0

Мы бы хотели, чтобы объекты все еще были видны, когда свет выключен, но мы также хотим, чтобы включение/выключение света было заметным.

wuffur 25.07.11 в 07:32

0

Теперь добавим объект ниндзя на нашу сцену в нулевые координаты.

proVIDec 28.06.11 в 08:50

0

Теперь добавим объект ниндзя на нашу сцену в начало координат:

wuffur 25.07.11 в 18:30

0

Ну а сейчас создадим белый источник света и поместим его на небольшое(относительно) расстояние от ниндзя.

proVIDec 28.06.11 в 11:01

0

С функцией createScene мы закончили.

proVIDec 28.06.11 в 08:51

0

Давайте займемся функцией frameRenderingQueued.

proVIDec 28.06.11 в 08:51

0

КАДРОВЫЙ КОНТРОЛЛЕР

proVIDec 29.06.11 в 07:23

0

Нам нужно добавить код в нашу функцию-контроллер кадров frameRenderingQueued

proVIDec 29.06.11 в 07:23

0

Нам нужно добавить код в нашу контроллер кадров функцию frameRenderingQueued:

wuffur 25.07.11 в 18:45

0

Код будет просто вызывать функции BaseApplication::frameRenderingQueued и (еще на записанную) processUnbufferedInput, а потом возвращаться в цикл.

proVIDec 29.06.11 в 06:55

0

Программа просто вызовет функции BaseApplication::frameRenderingQueued и (еще не записанную) processUnbufferedInput, а потом вернется в цикл рендеринга.

wuffur 26.07.11 в 06:07

0

Для того, чтобы продолжить рендеринг, метод frameStarted должен вернуть положительное значение(true).

proVIDec 28.06.11 в 15:04

0

Для того, чтобы продолжить рендеринг, метод frameStarted должен вернуть положительное булево значение(true).

wuffur 26.07.11 в 06:12

0

Если что-нибудь возвращает ложь(false), то Ogre завершает процесс рендринга и приложение закрывается.

proVIDec 28.06.11 в 16:16

0

Если как-нибудь возвратится ложное значение(false), то Ogre завершит цикл рендринга и приложение закроется.

wuffur 26.07.11 в 06:10

0

Давайте запишем что-нибудь в функции processUnbufferedInput.

proVIDec 28.06.11 в 14:27

0

Давайте запишем что-нибудь в функцию processUnbufferedInput.

wuffur 26.07.11 в 06:13

0

ОБРАБОТКА ВХОДНЫХ ДАННЫХ

proVIDec 28.06.11 в 16:17

0

ПЕРЕМЕННЫЕ

proVIDec 28.06.11 в 06:03

0

Мы определили несколько переменных в классе TutorialFrameListener.

Давайте пройдемся по ним, до того как продолжить.

proVIDec 28.06.11 в 10:08

1

Мы определили несколько переменных в классе TutorialFrameListener.

Давайте пройдемся по ним, до того как продолжать:

wuffur 26.07.11 в 06:13

0
+2

mRotate и mMove - это константы вращения и движения, соответственно.

proVIDec 28.06.11 в 08:52

0

Если вы хотите увеличить(уменьшить) скорость передвижения или вращения, измените значение переменных в соответствующую сторону.

proVIDec 28.06.11 в 08:54

0

Другие две переменные(mToggle и mMouseDown) контролируют входные данные.

В этом туториале мы будем использовать "небуферизованные" входные данные (буферизованный входные данные мы рассмотрим в следующем туториале)

proVIDec 28.06.11 в 14:32

0

Две другие переменные(mToggle и mMouseDown) контролируют входные данные.

Мы будем использовать "небуферизованные" входные данные мыши и клавиатуры (буферизованный входные данные мы рассмотрим в следующем уроке)

wuffur 26.07.11 в 06:15

0

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

proVIDec 29.06.11 в 07:09

0

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

wuffur 26.07.11 в 06:17

0

Мы столкнулись с интересной проблемой, когда пытались использовать клавиатуру для изменения состояния какого-либо объекта на сцене.

proVIDec 29.06.11 в 07:01

-1

Мы столкнулись с интересной проблемой, когда пытались использовать клавиатуру для изменения состояния какого-либо объекта на экране.

wuffur 26.07.11 в 06:17

0

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

proVIDec 28.06.11 в 14:38

0

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

wuffur 26.07.11 в 06:18

0

В следующем фрейме мы видим, что та же клавиша нажата и выполняем тоже самое действие.

В каких то случая(например движение при зажатой клавише) нам нужно именно это.

Однако, давайте рассмотрим вариант, когда мы хотим переключать свет, нажимая на клавишу "T".

proVIDec 28.06.11 в 18:10

0

Видим ли мы, что та же клавиша нажата и выполняется то же действие?

В некоторых случаях(таких как передвижение с помощью arrow keys(клавиши стрелки)), это то, что мы хочем сделать.

Однако, давайте скажем, что мы хотим, чтобы клавиша "T" переключала свет из положения включено в выключено и обратно.

wuffur 26.07.11 в 06:20

0

Зажали клавишу "T". В первом фрейме нужная клавиша нажата, свет переключается, в следующем фрейме клавиша "T" до сих пор зажата, и свет снова переключается... и снова и снова, пока клавишу не отпустят.

proVIDec 29.06.11 в 06:50

0

В первом кадре клавиша T нажимается, свет переключается, а в следующим кадре кадре клавиша T все еще нажата, поэтому свет переключается снова... и снова, и снова, пока клавишу не отпустят.

wuffur 26.07.11 в 06:23

0

Что бы избежать этой проблемы, нам нужно отслеживать состояние клавиши между фреймами.

proVIDec 03.07.11 в 03:26

0

Что бы избежать этой проблемы, нам нужно отслеживать состояние клавиши между кадрами.

wuffur 26.07.11 в 06:24

0

Для реализации этого, нам нужно два отдельных метода.

proVIDec 03.07.11 в 03:33

0

Для решения этой проблемы, мы представим два отдельных метода.

wuffur 26.07.11 в 06:25

0

Переменная mMouseDown отслеживает была ли нажата мышь в предыдущем кадре (итак, если mMouseDown принимает значение true,то пока кнопка мыши не будет отпущена, мы не будем выполнять те же действия).

proVIDec 08.07.11 в 06:13

0

Переменная mToggle определяет время, до конца которого мы не можем выполнять действие снова.

proVIDec 29.06.11 в 13:13

0

То есть, когда кнопка нажата, mToggle задается определенное количество времени, до истечения которого никакого другого действия выполнить нельзя.

proVIDec 03.07.11 в 03:34

0

Статичные локальные переменные в основном для удобства.

proVIDec 08.07.11 в 06:15

0

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

proVIDec 08.07.11 в 15:53

0

Открытая система ввода (OIS) принимает ввод от трех классов: клавиатура, мышь и джойстик.

proVIDec 28.06.11 в 10:07

0

В этом туториале мы изучим только как манипулировать мышью и клавиатурой.

proVIDec 28.06.11 в 09:16

0

Если вы заинтересованны в использование джойстика(или геймпада) с помощью Ogre, можете заглянуть в класс Joystick.

proVIDec 28.06.11 в 09:19

0
+1

Прежде чем продолжить, давайте взглянем на BaseApplication::frameRenderingQueued.

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

proVIDec 29.06.11 в 07:28

0
+1

Для этого следующие методы добавляются в BaseApplication::frameRenderingQueued:

proVIDec 28.06.11 в 14:33

0

Это происходит, когда эти две линии находятся в BaseApplication::frameRenderingQueued:

wuffur 28.07.11 в 07:10

0

Не добавляйте это в нашу функцию!

proVIDec 28.06.11 в 06:06

0

Первое, что мы хотим сделать - это переключение света нажатием кнопки мыши.

Мы можем узнать нажата ли кнопка мыши, вызвав метод getMouseButton с нужной нам кнопкой в параметре.

proVIDec 28.06.11 в 15:14

0

Обычно "0" это левая кнопка мыши, "1" правая, и "2" средняя.

proVIDec 28.06.11 в 06:06

0

В некоторых системах клавиша "1" - это средняя кнопка, а "2" правая.

proVIDec 28.06.11 в 10:02

0

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

Добавьте это в функцию BasicTutorial4::processUnbufferedInput:

proVIDec 28.06.11 в 10:04

0

Переменная currMouse будет возвращать значение "true", если кнопка мыши нажата.

proVIDec 28.06.11 в 09:59

0
+1

Теперь мы будем переключать свет в независимости от того, возвращает ли currMouse значение true. Но мы будем брать во внимание, была ли кнопка нажата в предыдущем фрейме (мы ведь хотим переключить свет один раз за одно нажатие).

Заметим также, что именно метод setVisible класса Light определяет будет ли объект излучать свет.

proVIDec 29.06.11 в 11:55

0
Минутку...

← Предыдущая страница

Следующая страница →