Докуметация Cтарт Статьи Форум Лента Вход
Не официальное русскоязычное сообщество
Главная
    Документация jMonkeyEngine
        jMonkeyEngine Уроки и Документация
            Вклады
                Лемур GUI
                    Модули

Модули

Опубликованно: 03.08.2017, 22:25
Последняя редакция, Andry: 01.09.2017 13:09
  • Мышь и сенсорная обработка
    • События мыши и события курсора
    • Прямое использование
    • Target(Цель) и Capture(Захват)
  • InputMapper
  • Поддержка стиля
  • Mesh библиотека
  • Версии объектов
  • Управление фокусом

Lemur построен поверх многих подмодулей, каждый из которых может использоваться самостоятельно без остальных частей элементов GUI или других частей. Любой из них является самостоятельной полезной утилитой, которую также можно объединять с другими по мере необходимости. В этом разделе описываются эти модули и то как самостоятельно их настроить. Он также кратко озвучивает, как и где Лемур их настраивает по умолчанию.

Standard GUI Elements

Мышь и сенсорная обработка

События мыши и касания могут обрабатываться MouseAppState и TouchAppState (соответственно). Они могут быть настроены со списком корневых узлов сцены, для выполнения выбора, а различные события мыши и курсора будут предоставлены любому выбранному Spatial, который имеет MouseEventControl или CursorEventControl.

Большинство приложений выбирают одно состояние приложения или другое, в зависимости от среды. Например, MouseAppState для настольных компьютеров и TouchAppState для мобильных устройств. Эти два могут использоваться и совместно, если система поддерживает оба типа событий (например, настольный компьютер с сенсорным экраном или планшет с мышью).

Для сенсорных событий мультитач поддерживается, если платформа поддерживает его (например, мобильные устройства), и состояние каждого пальца отслеживается отдельно для событий ввода/выхода, перетаскивания/отпускания и.т.д. Это означает, что без какой-либо специальной обработки, такие вещи как несколько ползунков можно перетаскивать одновременно несколькими пальцами.

События мыши(Mouse Events) и события курсора (Cursor Events)

В JME уже есть классы MouseEvent и MouseButtonEvent, и они были повторно использованы для передачи событий мыши в MouseEventControls. Однако часто слушателям событий полезно узнать больше о событии. У MouseEvent есть такая вещь, как положение экрана, и оно не будет включать в себя ничего о местоположении 3D-клика или даже в окне просмотра в котором осуществлялся выбор. CursorEvent исправит это, включив эту дополнительную информацию.

В общем, MouseEvents проще и для простых типов ввода/выхода/кликов он будет работать в 99% случаев. В других случаях, когда необходимо знать местоположение 3D-выбора, положение, нормали поверхности, настройку viewport/камеру и.т.д., следует использовать CursorEventControl.

Базовые свойства событий курсора:

  • Viewport: окно просмотра, в котором произошел выбор. MouseAppState и TouchAppState поддерживают множество окон просмотра и корневых узлов. Эта информация часто необходима для правильной интерпретации информации о выборе (например, при передаче событий через 2D-портал или при непроектировании 3D точки).
  • Target: spatial, который был «выбран» этим событием.
  • x,y: двумерное местоположение события.
  • Collision: реальный объект JME CollisionResult события выбора. Включает Геометрию по которой был осуществлен щелчёк, нормали поверхности, и.т.д.

Прямое использование

Использовать MouseAppState или TouchAppState в вашем приложении очень просто. Настройка для обоих состояний приложения подобная, поэтому для краткости будет обсуждаться только MouseAppState.

Шаг 1: Прикрепите MouseAppState к вашему приложению во время инициализации. Например, в simpleInitApp() это будет выглядеть так:

public void simpleInitApp() {
    appStateManager.attach(new MouseAppState(this));
}

По умолчанию основной viewport приложения и viewport GUI будут добавлены как Collision с корнями. Другими словами, выбор на GUI и 3D-сцене будет автоматическим. Если вы хотите отключить это и добавить только viewport и/или корни, просто вызовите setIncludeDefaultCollisionRoots(false) в созданном MouseAppState или TouchAppState.

Шаг 2: Добавьте слушателей в свои spatials объекты. (Да, это действительно так).

Для Spatial получающего события необходимо иметь либо MouseEventControl, либо CursorEventControl с зарегистрированными слушателями. Для каждого типа событий требуется только один элемент control, поэтому для удобства были добавлены некоторые методы, чтобы упростить настройку control. (То есть: он добавит только control, если необходимо, как то иначе повторное использование уже существующий).

Вот простой пример добавления слушателя событий мыши в spatial:

MouseEventControl.addMouseListeners(spatial, new DefaultMouseListener() {
    @Override
    protected void click( MouseButtonEvent event, Spatial target, Spatial capture ) {
        System.out.println("I've been clicked:" + target);
    }
});

См. MouseListener javadoc для получения более подробной информации.

Target(Цель) и Capture(Захват)

В событиях, связанных с мышью, между событием цель(Target) и событием захват(Capture) существует различие. Наличие двух таких событий могут быть очень полезны для определения жизненного цикла серии событий, таких как операция перетаскивания.

  • Target: это текущий spatial получающий это событие. Другими словами, курсор мыши или коснувшийся палец данный момент указывают на этот spatial. Если событие обрабатывается каким-то слушателем, и это событие было событием нажатия кнопки (или касанием), то эта цель становится захваченной для последующих событий.
  • Capture: для событий движения, этого spatial, которая начала все это. Захват это spatial объект, который сначала получил обработку событие нажатия. Захваченные Spatials также всегда получают первый crack в событии движения мыши и событии отпускания клавиши. Они могут выбирать, чтобы не обрабатывали их, но они получают первый crack.

Почему это полезно? Ну, по многим причинам.

Пример 1: Отмененный фокус. Например, когда пользователь совершая клик нажимает на кнопку в GUI, а затем перемещает мышь прежде чем он отпускать кнопку, очень важно знать всю информацию. Лемур мог бы просто доставить все события перетаскивания в исходное «захват(capture)» spatial, но тогда это было бы до того как слушатели событий смогли бы выяснить, находилась ли мышь над этой кнопкой когда пользователь отпустил кнопку мыши, и должно ли осуществится выполнение действия этой кнопки или нет. Кроме того, слушатель может захотеть узнать, где находится мышь.

Пример 2: Перетаскивание. Когда щелкнул по элементу для его перетаскивания, он может поглотить событие и стать capture. Он будет первый слушателем, который будет получат любые последующие события до тех пор, пока не будет завершено перетаскивание … и он может не использовать эти события, даже если он их обрабатывает. Таким образом, перетаскиваемый объект получит эти события движения и это объект будет перемещаться при перетаскивании. Если пользователь перетаскивает его очень быстро, и курсор мыши больше не наложен на перетаскиваемый объект, тогда он все равно получит события движения, потому что он «захвачен(capture)». Что еще более важно для перетаскивания, это если исходный слушатель не использует эти события, тогда они могут свободно распространяться на другие spatial объекты, например контейнер для приема(сбрасывания). Затем базовые объекты контейнера будут по-прежнему получать события ввода/вывода мыши и соответственно изменять их состояние видимости.

На самом деле, этот пример просто перемещение по поверхности, но нижняя строка заключается в том, что при операции перетаскивания важно продолжить предавать события на объект с первоначальным щелчком, но также важны дополнительные события выбора. Параметры «захвата(capture)» и «цели(target)» отражают это состояние.

InputMapper

В разработке.

Поддержка стиля

Модуль стиля может поддерживать общие «стилизованные» атрибуты для любых классов Java, а не только элементы базового GUI Лемура. В этом разделе обсуждается, как эта библиотека может использоваться для обычных классов Java или ваших собственных пользовательских элементов GUI, не относящихся к Лемуру. Документацию о создании стилей см. В документации по стилю.

В разработке.

Mesh библиотека

В разработке.

Версии объектов

В разработке.

Управление фокусом

В разработке.


Переведено для jmonkeyengine.ru, оригинал
Автор перевода: Andry

Добавить комментарий

jMonkeyEngine.ru © 2017. Все права сохранены.