Ogre3D Basic Tutorials / Базовые туториалы Ogre3D: Basic Tutorial 5: Buffered Input
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Мы можем получить код нажатой клавиши (KC_*) из переменной "key" объекта. alexx_x 13.07.11 в 13:22 |
|
|
Мы создадим обработчик для всех назначенных клавиш которые мы используем в приложении на основе значения этой переменной. alexx_x 13.07.11 в 13:24 С помощью конструкции switch на этом значении мы определим обработчики для всех клавиш, используемых в приложении. Mingun 22.07.11 в 16:55 |
+1 | |
|
Найдите метод keyPressed и замените его содержимое на этот код: alexx_x 13.07.11 в 13:24 |
+1 | |
|
Также надо добавить следующий код в функцию frameRenderingQueued для того чтобы приложение реагировало на нажатия клавиш. alexx_x 13.07.11 в 13:25 |
+1 | |
|
Это гарантирует что программа завершится когда значение переменной mShutDown будет true. alexx_x 13.07.11 в 13:26 Это гарантирует что программа завершится когда значение переменной mShutDown станет равно true (ее значение переключится нажатием escape, как вы можете видеть в коде выше). Mingun 22.07.11 в 16:59 |
+2 | |
|
mKeyboard->capture и mMouse->capture обеспечивают захват событий от клавиатуры и мыши. alexx_x 13.07.11 в 13:28 mKeyboard->capture() и mMouse->capture() гарантируют, что и клавиатура, и мышь захвачены нашим приложением. Mingun 22.07.11 в 17:05 |
||
|
И наконец mTrayMgr->frameRenderingQueued(evt) гарантирует то что наш трей будет корректно отрендерен. alexx_x 13.07.11 в 13:28 |
+1 | |
|
Убедитесь в том что ваше приложение компилируется и запускается перед тем как продолжать дальше. alexx_x 13.07.11 в 13:29 |
||
|
Сейчас нам надо добавить обработку других клавиш в наш switch. alexx_x 13.07.11 в 13:31 |
+1 | |
|
Первое что нам надо сделать это позволить пользователю переключатся между viewpoints нажимая клавиши 1 и 2. alexx_x 13.07.11 в 13:32 Первое, что мы сделаем, это позволим пользователю переключатся между областями просмотра нажимая клавиши 1 и 2. Mingun 22.07.11 в 17:11 |
+1 | |
|
Код выполняющий это (который необходимо добавить в switch) тот же самый что и в предыдущей статье, исключая тот момент что мы больше не работаем с переменной mToggle. alexx_x 13.07.11 в 13:33 Код для этого (который необходимо добавить в оператор switch) тот же самый, что и в предыдущем уроке, исключая тот момент, что мы больше не работаем с переменной mToggle: Mingun 22.07.11 в 17:12 |
||
|
Это гораздо удобнее чем работать со временными переменными для того чтобы отслеживать события и время нажатия клавиш. alexx_x 13.07.11 в 13:34 Как вы сами видите, это гораздо понятнее, чем работать с временной переменной для отслеживания момента нажатия. Mingun 22.07.11 в 17:15 |
||
|
Следующее что мы добавим, это управление передвижением с клавиатуры. alexx_x 13.07.11 в 13:35 |
||
|
Каждый раз когда пользователь нажимает клавишу которая отвечает за движение, мы будем прибавлять или убавлять к значению mMove (в зависимости от направления) значение корректной ориентации в векторе. alexx_x 13.07.11 в 13:38 Каждый раз, когда пользователь нажимает клавишу, которая отвечает за движение, мы будем прибавлять значение mMove (в зависимости от направления) к правильному направлению или вычитать его значение из правильного направления в этом векторе. wuffur 14.07.11 в 12:20 |
+2 | |
|
Сейчас нам необходимо "отменить" изменения вектора mDirection в тот момент когда клавиша отпущена, чтобы остановится. alexx_x 13.07.11 в 13:41 Теперь нам необходимо при отпускании клавиши "отменить" изменение mDirection, чтобы остановить перемещение. Mingun 22.07.11 в 17:22 |
||
|
Найдите метод keyReleased и добавьте в него следующий код: proVIDec 29.06.11 в 11:59 |
||
|
Поскольку мы обновили mDirection, используя ввод с клавиш, теперь нам нужно сделать так, чтобы произошло перемещение. wuffur 14.07.11 в 12:27 Теперь, когда мы имеем mDirection, обновляемую на основе ввода с клавиатуры, нам нужно произвести фактическое перемещение. Mingun 22.07.11 в 17:25 |
||
|
Этот код в точности такой, как мы ожидали в последней части руководства, мы двигаем вершину камеры вместо объекта ninja, поэтому добавьте эту это в функцию frameRenderingQueued: wuffur 14.07.11 в 13:44 Этот код такой же, как в предыдущем уроке, исключая то, что мы двигаем узел камеры вместо узла ниндзя, так что добавим нижеследующее в функцию frameRenderingQueued: Mingun 22.07.11 в 17:28 |
||
|
Скомпилируйте и запустите это приложение. wuffur 14.07.11 в 13:45 Скомпилируем и запустим приложение. Mingun 22.07.11 в 17:28 |
||
|
Теперь вы реализовали движение при помощи клавиш, используя буферизованный ввод! wuffur 14.07.11 в 13:45 И вот вы реализовали движение при помощи клавиш, используя буферизованный ввод! Поздравьте себя, а мы переходим к следующей части. Mingun 22.07.11 в 17:30 |
||
|
БИНДИНГИ НА МЫШЬ wuffur 14.07.11 в 14:21 СВЯЗЫВАНИЕ КОМАНД С МЫШЬЮ Mingun 22.07.11 в 17:30 |
+1 | |
|
Теперь, когда у нас есть биндинги на клавиши, нам нужно поработать над тем, чтобы заставить работать мышь. wuffur 14.07.11 в 14:22 Теперь, когда мы завершили связывание команд с клавишами, нам нужно поработать над тем, чтобы заставить мышь работать. Mingun 22.07.11 в 17:36 |
||
|
Мы начнем с включения и выключения света левой кнопкой мыши. wuffur 14.07.11 в 14:23 |
||
|
Найдите функцию mousePressed и взгляните на параметры. wuffur 14.07.11 в 14:24 |
||
|
Вместе с OIS у нас есть доступ как к MouseEvent, так и к MouseButtonID. wuffur 14.07.11 в 14:24 |
+1 | |
|
Мы можем переключиться на MouseButtonID, чтобы определить, какая кнопка была нажата. wuffur 14.07.11 в 14:25 Используя значение MouseButtonID, мы можем определить, какая кнопка была нажата. Mingun 22.07.11 в 18:01 |
+3 | |
|
Замените этот код функцией the mousePressed со следующим содержимым: wuffur 14.07.11 в 14:25 Замените код функции mousePressed следующим: Mingun 22.07.11 в 18:03 |
||
|
Скомпилируйте и запустите приложение. proVIDec 03.07.11 в 03:28 |
||
|
Вуаля! Теперь, когда это работает, единственной вещью, которой нам нужно сделать осталось забиндить правую кнопку мыши на режим просмотра мыши. wuffur 14.07.11 в 14:27 Вуаля! Теперь, когда это работает, единственной вещью, которую нам осталось сделать, это связать правую кнопку мыши с режимом осмотра мышью. Mingun 22.07.11 в 18:05 |
||
|
Каждый раз, когда мышь подвинется, мы будем проверять были ли нажата правая кнопка мыши. wuffur 14.07.11 в 14:27 Каждый раз, когда мышь двигается, мы будем проверять состояние правой кнопки. Mingun 22.07.11 в 18:06 |
||
|
Если была, мы перевернем камеру в соответствии с ее относительным перемещением. wuffur 14.07.11 в 14:30 Если она нажата, мы повернем камеру, основываясь на относительном перемещении мыши. Mingun 22.07.11 в 18:07 |
||
|
Мы можем получить доступ к относительному перемещению мыши из объекта MouseEvent, переданного в эту функцию. wuffur 14.07.11 в 14:31 |
+1 | |
|
Она содержат переменную "state"(состояние), которая содержит MouseState (которая в основном содержит подробную информации о мыши). wuffur 14.07.11 в 14:32 |
+4 | |
|
MouseState::buttonDown сообщит, нажата или нет определенная кнопка мыши, и переменный "X" и "Y" сообщат нам об относительном перемещении мыши. wuffur 14.07.11 в 14:49 |
+1 | |
|
Найдите функцию mouseMoved и замените код в ней следующим: wuffur 14.07.11 в 14:49 |
||
|
Скомпилируйте и запустите ваше приложение и камеру которая будет действовать в режиме свободного просмотра, когда нажата правая кнопка мыши. wuffur 14.07.11 в 14:50 Скомпилируйте и запустите приложение и камера будет действовать в режиме свободного обзора, пока зажата правая кнопка мыши. Mingun 22.07.11 в 18:16 |
||
|
ДРУГИЕ СИСТЕМЫ ВВОДА chmel7 13.07.11 в 19:58 |
||
|
Система OIS в основном очень хороша и должна вас устраивать при достижении большинства целей, которые вы ставили перед своим приложением. wuffur 14.07.11 в 14:51 |
+3 | |
|
С учетом сказанного, существуют альтернативы если вы пожелаете использовать что-то другое. wuffur 14.07.11 в 14:52 |
||
|
Некоторые системы выведения окон могут быть тем, что вы ищите, такие как wxWidgets, которую люди с успехом игнтегрируют в Ogre. wuffur 14.07.11 в 16:04 Некоторые оконные системы могут быть тем, что вы ищите, такие, как wxWidgets, которую люди с успехом интегрировали с Ogre. Mingun 22.07.11 в 18:28 |
||
|
Вы можете использовать стандартную систему сообщений Windows или один из многих GUI-инструментариев под Linux для обработки ввода, если вы не возражаете против того, что ваше приложение станет зависеть от платформы (вы в своем уме?!). Mingun 22.07.11 в 18:30 |
||
|
Вы также можете попробовать SDL, которая предоставляет, не только кроссплатформенные системы окон/ввода, но и ввода с джойстика/геймпада. wuffur 14.07.11 в 16:08 Вы также можете попробовать SDL (Simple DirectMedia Layer - библиотека для работы с мультимедиа), которая предоставляет не только кроссплатформенную оконую систему и систему ввода, но также ввод с джойстика/геймпада. Mingun 22.07.11 в 18:33 |
||
|
Хотя я и не могу дать вам рекомендации по установке wx/gtk/qt/других вместе с Ogre (поскольку я никогда раньше это не делал), у меня много раз хорошо получалось успешно состыковать функции ввода из SDL для джойстика/геймпада для работы с Ogre. wuffur 14.07.11 в 16:15 |
+3 | |
|
Чтобы запустить систему SDL для работы с джойстиком, оберните ваше приложение исходными стартовыми вызовами SDL_Init и SDL_Quit(Она может находится в главной функции вашего приложения или, возможно, в объекте вашего приложения): wuffur 14.07.11 в 16:24 Чтобы начать работать с джойстиком системы SDL, оберните код инициализации приложения вызовами SDL_Init и SDL_Quit (это можно сделать в функции main или, возможно, в объекте вашего приложения): Mingun 22.07.11 в 18:40 |
||
|
Чтобы установить Joystick, вызовите функцию SDL_JoystickOpen с числом объектов Joystick (вы можете создать много объектов Joystick, вызвав 0,1,2...) wuffur 14.07.11 в 16:25 Для настройки джойстика вызовите SDL_JoystickOpen с номером джойстика (вы можете указать несколько джойстиков, вызвав функцию с аргументами 0, 1, 2,...) Mingun 22.07.11 в 18:42 |
||
|
Если SDL_JoystickOpen возвращает NULL, то была проблема в открытии объекта Joystick . wuffur 14.07.11 в 16:27 Если SDL_JoystickOpen вернёт NULL, значит возникла проблема открытия джойстика. Mingun 22.07.11 в 18:43 |
||
|
Это практически означает, что джойстик, который вы запросили не существует. wuffur 14.07.11 в 16:27 Это почти всегда означает, что джойстик, который вы запросили, не существует. Mingun 22.07.11 в 18:44 |
||
|
Используейте SDL_NumJoysticks, чтобы узнать, сколько джойстиков подключено к вашей системе. wuffur 14.07.11 в 16:28 |
+1 | |
|
После исползования вам нужно закрыть объект Joystic: wuffur 14.07.11 в 16:28 Вы также должны закрыть джойстик после того, как закончили с ним работать: Mingun 22.07.11 в 18:46 |
||
|
Для использования джойстика, вызовите методы SDL_JoystickGetButton и SDL_JoystickGetAxis. wuffur 14.07.11 в 16:29 |
+1 |
