Ogre3D Basic Tutorials / Базовые туториалы Ogre3D: Basic Tutorial 5: Buffered Input

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

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

Мы можем получить код нажатой клавиши (KC_*) из переменной "key" объекта.

alexx_x 13.07.11 в 13:22

1

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

alexx_x 13.07.11 в 13:24

0

С помощью конструкции switch на этом значении мы определим обработчики для всех клавиш, используемых в приложении.

Mingun 22.07.11 в 16:55

0
+1

Найдите метод keyPressed и замените его содержимое на этот код:

alexx_x 13.07.11 в 13:24

2
+1

Также надо добавить следующий код в функцию frameRenderingQueued для того чтобы приложение реагировало на нажатия клавиш.

alexx_x 13.07.11 в 13:25

0
+1

Это гарантирует что программа завершится когда значение переменной mShutDown будет true.

alexx_x 13.07.11 в 13:26

0

Это гарантирует что программа завершится когда значение переменной mShutDown станет равно true (ее значение переключится нажатием escape, как вы можете видеть в коде выше).

Mingun 22.07.11 в 16:59

0
+2

mKeyboard->capture и mMouse->capture обеспечивают захват событий от клавиатуры и мыши.

alexx_x 13.07.11 в 13:28

0

mKeyboard->capture() и mMouse->capture() гарантируют, что и клавиатура, и мышь захвачены нашим приложением.

Mingun 22.07.11 в 17:05

0

И наконец mTrayMgr->frameRenderingQueued(evt) гарантирует то что наш трей будет корректно отрендерен.

alexx_x 13.07.11 в 13:28

0
+1

Убедитесь в том что ваше приложение компилируется и запускается перед тем как продолжать дальше.

alexx_x 13.07.11 в 13:29

1

Сейчас нам надо добавить обработку других клавиш в наш switch.

alexx_x 13.07.11 в 13:31

1
+1

Первое что нам надо сделать это позволить пользователю переключатся между viewpoints нажимая клавиши 1 и 2.

alexx_x 13.07.11 в 13:32

0

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

Mingun 22.07.11 в 17:11

0
+1

Код выполняющий это (который необходимо добавить в switch) тот же самый что и в предыдущей статье, исключая тот момент что мы больше не работаем с переменной mToggle.

alexx_x 13.07.11 в 13:33

0

Код для этого (который необходимо добавить в оператор switch) тот же самый, что и в предыдущем уроке, исключая тот момент, что мы больше не работаем с переменной mToggle:

Mingun 22.07.11 в 17:12

0

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

alexx_x 13.07.11 в 13:34

0

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

Mingun 22.07.11 в 17:15

0

Следующее что мы добавим, это управление передвижением с клавиатуры.

alexx_x 13.07.11 в 13:35

1

Каждый раз когда пользователь нажимает клавишу которая отвечает за движение, мы будем прибавлять или убавлять к значению mMove (в зависимости от направления) значение корректной ориентации в векторе.

alexx_x 13.07.11 в 13:38

1

Каждый раз, когда пользователь нажимает клавишу, которая отвечает за движение, мы будем прибавлять значение mMove (в зависимости от направления) к правильному направлению или вычитать его значение из правильного направления в этом векторе.

wuffur 14.07.11 в 12:20

0
+2

Сейчас нам необходимо "отменить" изменения вектора mDirection в тот момент когда клавиша отпущена, чтобы остановится.

alexx_x 13.07.11 в 13:41

0

Теперь нам необходимо при отпускании клавиши "отменить" изменение mDirection, чтобы остановить перемещение.

Mingun 22.07.11 в 17:22

1

Найдите метод keyReleased и добавьте в него следующий код:

proVIDec 29.06.11 в 11:59

1

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

wuffur 14.07.11 в 12:27

0

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

Mingun 22.07.11 в 17:25

0

Этот код в точности такой, как мы ожидали в последней части руководства, мы двигаем вершину камеры вместо объекта ninja, поэтому добавьте эту это в функцию frameRenderingQueued:

wuffur 14.07.11 в 13:44

0

Этот код такой же, как в предыдущем уроке, исключая то, что мы двигаем узел камеры вместо узла ниндзя, так что добавим нижеследующее в функцию frameRenderingQueued:

Mingun 22.07.11 в 17:28

0

Скомпилируйте и запустите это приложение.

wuffur 14.07.11 в 13:45

1

Скомпилируем и запустим приложение.

Mingun 22.07.11 в 17:28

1

Теперь вы реализовали движение при помощи клавиш, используя буферизованный ввод!

wuffur 14.07.11 в 13:45

1

И вот вы реализовали движение при помощи клавиш, используя буферизованный ввод! Поздравьте себя, а мы переходим к следующей части.

Mingun 22.07.11 в 17:30

1

БИНДИНГИ НА МЫШЬ

wuffur 14.07.11 в 14:21

0

СВЯЗЫВАНИЕ КОМАНД С МЫШЬЮ

Mingun 22.07.11 в 17:30

2
+1

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

wuffur 14.07.11 в 14:22

0

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

Mingun 22.07.11 в 17:36

0

Мы начнем с включения и выключения света левой кнопкой мыши.

wuffur 14.07.11 в 14:23

2

Найдите функцию mousePressed и взгляните на параметры.

wuffur 14.07.11 в 14:24

1

Вместе с OIS у нас есть доступ как к MouseEvent, так и к MouseButtonID.

wuffur 14.07.11 в 14:24

1
+1

Мы можем переключиться на MouseButtonID, чтобы определить, какая кнопка была нажата.

wuffur 14.07.11 в 14:25

0

Используя значение MouseButtonID, мы можем определить, какая кнопка была нажата.

Mingun 22.07.11 в 18:01

2
+3

Замените этот код функцией the mousePressed со следующим содержимым:

wuffur 14.07.11 в 14:25

0

Замените код функции mousePressed следующим:

Mingun 22.07.11 в 18:03

0

Скомпилируйте и запустите приложение.

proVIDec 03.07.11 в 03:28

1

Вуаля! Теперь, когда это работает, единственной вещью, которой нам нужно сделать осталось забиндить правую кнопку мыши на режим просмотра мыши.

wuffur 14.07.11 в 14:27

0

Вуаля! Теперь, когда это работает, единственной вещью, которую нам осталось сделать, это связать правую кнопку мыши с режимом осмотра мышью.

Mingun 22.07.11 в 18:05

1

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

wuffur 14.07.11 в 14:27

0

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

Mingun 22.07.11 в 18:06

0

Если была, мы перевернем камеру в соответствии с ее относительным перемещением.

wuffur 14.07.11 в 14:30

0

Если она нажата, мы повернем камеру, основываясь на относительном перемещении мыши.

Mingun 22.07.11 в 18:07

0

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

wuffur 14.07.11 в 14:31

1
+1

Она содержат переменную "state"(состояние), которая содержит MouseState (которая в основном содержит подробную информации о мыши).

wuffur 14.07.11 в 14:32

0
+4

MouseState::buttonDown сообщит, нажата или нет определенная кнопка мыши, и переменный "X" и "Y" сообщат нам об относительном перемещении мыши.

wuffur 14.07.11 в 14:49

1
+1

Найдите функцию mouseMoved и замените код в ней следующим:

wuffur 14.07.11 в 14:49

1

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

wuffur 14.07.11 в 14:50

0

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

Mingun 22.07.11 в 18:16

2

ДРУГИЕ СИСТЕМЫ ВВОДА

chmel7 13.07.11 в 19:58

2

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

wuffur 14.07.11 в 14:51

1
+3

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

wuffur 14.07.11 в 14:52

0

Некоторые системы выведения окон могут быть тем, что вы ищите, такие как wxWidgets, которую люди с успехом игнтегрируют в Ogre.

wuffur 14.07.11 в 16:04

0

Некоторые оконные системы могут быть тем, что вы ищите, такие, как wxWidgets, которую люди с успехом интегрировали с Ogre.

Mingun 22.07.11 в 18:28

1

Вы можете использовать стандартную систему сообщений Windows или один из многих GUI-инструментариев под Linux для обработки ввода, если вы не возражаете против того, что ваше приложение станет зависеть от платформы (вы в своем уме?!).

Mingun 22.07.11 в 18:30

1

Вы также можете попробовать SDL, которая предоставляет, не только кроссплатформенные системы окон/ввода, но и ввода с джойстика/геймпада.

wuffur 14.07.11 в 16:08

0

Вы также можете попробовать SDL (Simple DirectMedia Layer - библиотека для работы с мультимедиа), которая предоставляет не только кроссплатформенную оконую систему и систему ввода, но также ввод с джойстика/геймпада.

Mingun 22.07.11 в 18:33

0

Хотя я и не могу дать вам рекомендации по установке wx/gtk/qt/других вместе с Ogre (поскольку я никогда раньше это не делал), у меня много раз хорошо получалось успешно состыковать функции ввода из SDL для джойстика/геймпада для работы с Ogre.

wuffur 14.07.11 в 16:15

0
+3

Чтобы запустить систему SDL для работы с джойстиком, оберните ваше приложение исходными стартовыми вызовами SDL_Init и SDL_Quit(Она может находится в главной функции вашего приложения или, возможно, в объекте вашего приложения):

wuffur 14.07.11 в 16:24

0

Чтобы начать работать с джойстиком системы SDL, оберните код инициализации приложения вызовами SDL_Init и SDL_Quit (это можно сделать в функции main или, возможно, в объекте вашего приложения):

Mingun 22.07.11 в 18:40

1

Чтобы установить Joystick, вызовите функцию SDL_JoystickOpen с числом объектов Joystick (вы можете создать много объектов Joystick, вызвав 0,1,2...)

wuffur 14.07.11 в 16:25

0

Для настройки джойстика вызовите SDL_JoystickOpen с номером джойстика (вы можете указать несколько джойстиков, вызвав функцию с аргументами 0, 1, 2,...)

Mingun 22.07.11 в 18:42

0

Если SDL_JoystickOpen возвращает NULL, то была проблема в открытии объекта Joystick .

wuffur 14.07.11 в 16:27

0

Если SDL_JoystickOpen вернёт NULL, значит возникла проблема открытия джойстика.

Mingun 22.07.11 в 18:43

0

Это практически означает, что джойстик, который вы запросили не существует.

wuffur 14.07.11 в 16:27

0

Это почти всегда означает, что джойстик, который вы запросили, не существует.

Mingun 22.07.11 в 18:44

0

Используейте SDL_NumJoysticks, чтобы узнать, сколько джойстиков подключено к вашей системе.

wuffur 14.07.11 в 16:28

1
+1

После исползования вам нужно закрыть объект Joystic:

wuffur 14.07.11 в 16:28

0

Вы также должны закрыть джойстик после того, как закончили с ним работать:

Mingun 22.07.11 в 18:46

0

Для использования джойстика, вызовите методы SDL_JoystickGetButton и SDL_JoystickGetAxis.

wuffur 14.07.11 в 16:29

1
+1
Минутку...

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

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