Panda3D идёт с набором инструментов для построения графического интерфейса ваших программ. DirectGui используется для создания кнопок, надписей, текстовых полей, и фреймов. Все эти элементы могут содержать текст,изображения, и 3D графику. Естественно, с этими элементами можно ассоциировать команды. Эти объекты являются потомками NodePath и соответственно наследуют его методы такие как show()/hide(), setPos(), posInterval(), и т.д. Так же объекты DirectGui по умолчанию крепятся к aspect2d, что позволяет им постоянно оставаться на экране, независимо от того, как перемещается камера внутри трёхмерного пространства.
Опция direct-gui-edit в Config.prc позволяет пользователю использовать среднюю кнопку мыши для перемещения виджетов по экрану, и изменять их размер при нажатой клавише control. Это может помочь в оптимизации интерфейса во время разработки. Если необходимо отключить это свойство у отдельных объектов, нужно установить ключ enableEdit в False.
Все объекты DirectGui создаются схожим образом:
from direct.gui.DirectGui import * myObject = Directxxxxxx(keyword=value, keyword=value, ...)
Каждый объект DirectGui может содержать четыре фундаментальных части. Это может быть text, geom, image, и frame.
DirectGui text - строка, автоматически создаваемая с использованием OnscreenText и распологаемая по центру объекта. Вы можете определить значение строки, используя ключ text . Вы так же можете определить для текста дополнительные параметры, используя text_parameter , где parameter - любой существующий ключ конструктора OnscreenText.
DirectGui geom может быть любым NodePath который будет использоваться для визуального представления объекта. Обычно это модель, созданная через egg-команду egg-texture-cards , основанная на текстуре, назначаемой вручную. Используя этот интерфейс вы можете как угодно изменить внешний вид GUI объектов. Определяется объект geom используя ключ geom , аналогично тексту. Так же аналогично тексту можно использовать дополнительные параметры geom_parameter .
image - это имя фала с текстурой или уже загруженный объект Texture. Используется для отображения рисунка для которого не создавалась отдельная модель. Вы можете позиционировать и масштабировать картинку с помошью ключей image_pos и image_scale . Так же можно использовать свойства OnscreenImage
В заключение, DirectGui может создавать frame. Обычно это серый фоновый прямоугольник, опционально может иметь рельеф. Вы можете использовать ключ relief для установки типа рельефа, значения - SUNKEN, RAISED, GROOVE, or RIDGE. Так же можно определить relief = None . Общий размер объекта DirectGui контролируется ключом frameSize . Это кортеж из четырёх значений (лево, право, верх, низ), которые определяют границу объекта. Значения указывают координаты от центра прямоугольника. Например, установка размера в (-0.1, 0.1, -0.1, 0.1), определит квадрат со стороной 0.2 .
Ключ frameSize опционален. Если он отсутствует, то по-умолчанию frameSize на основе эелементов text, geom, и/или image.
Ниже представлен список лючей, обычно доступных всем типам объектов DirectGui. Отдельные элементы могут содержать больший список, но они будут рассмотренны индивидуально
Ключ | Определение | Значение |
text | Отображаемый текст
| String |
text_bg | Фоновый цвет текста
| (R,G,B,A) |
text_fg | Цвет текста
| (R,G,B,A) |
text_pos | Позиция текста
| (x,z) |
text_roll | Поворот текста
| Number |
text_scale | Масштаб текста
| (sx,sz) |
frameSize | Размер объекта
| (Left,Right,Bottom,Top) |
frameVisibleScale | зависимый масштаб видимого рамера объекта к размеру части, реагирующей на щелчок мыши. | (hscale, vscale) |
frameColor | Цвет объекта frame | (R,G,B,A) |
relief | Рельеф объекта frame | SUNKEN, RAISED, GROOVE, RIDGE, FLAT, or None |
invertedFrames | Если true, то меняет местами приподнятый и утопленный тип рельефа
| 0 or 1 |
borderWidth | Если рельеф SUNKEN, RAISED, GROOVE, или RIDGE, изменяет размер скоса
| (Width,Height) |
image | Изображение image
| имя файла или Texture object |
image_pos | Позиция изображения
| (x,y,z) |
image_hpr | Поворот изображения
| (h,p,r) |
image_scale | Масштаб изображения
| (sx,sy,sz) |
geom | geom визуальное представление объекта
| NodePath |
geom_pos | Позиция geom | (x,y,z) |
geom_hpr | Поворот geom | (h,p,r) |
geom_scale | Масштаб geom | (sx,sy,sz) |
pos | Позиция объекта
| (X,Y,Z) |
hpr | Поворот объекта
| (H,P,R) |
scale | Масштаб | Number |
pad | Если параметр frameSize опущен, определяет пространство вокруг geom или text до которого будет расширен frame | (Width,Height) |
state | Начальное состояние объекта
| NORMAL или DISABLED |
frameTexture | Текстура, применяемая к frame если рельеф установлен в FLAT | имя файла или Texture object |
enableEdit | Доступность для редактирования в режиме direct-gui-edit | 0 or 1 |
suppressKeys | Если 1, то подавляет глобальные события клавиатуры, зарегестрированные в панде
| 0 or 1 |
suppressMouse | Если 1, то подавляет глобальные события мыши, зарегестрированные в панде | 0 or 1 |
sortOrder | Определяет порядок отрисовки для перекрывающихся объектов.
| Number |
textMayChange | Определяет может ли быть изменён текст объекта после создания
| 0 or 1 |
Помните, что оси координат Panda3D используются следующим образом: x лево и право, y вперёд - назад, и z - вверх и вниз. Объект frame всегда фоновый; geomпоказывается поверх фрейма, а text - поверх geom.
Большинство значений может быть изменено после создания объекта:
myDirectObject['keyword'] = value
Однако, попытка изменить таким образом позицию или сделать другую трансформацию, окончится неудачей. Для этого нужно использовать методы NodePath.
Некоторые изменения, такие как изменение text или geom, могут так же повлечь изменение размера объекта. Поэтому, после изменения необходимо переопределить размер:
myDirectObject.resetFrameSize()
Иначе могут возникнуть некоторые проблемы - например клавиша не среагирует на нажатие мыши.
Удаление объекта DirectGUI:
myDirectObject.destroy()
Недостаточно вызвать только removeNode(), т.к.
DirectGUI некоторые события, которые должны быть очищены. Тем не менее, если ваши объекты имеют некоторую иерархию, то вызов метода destroy корневого объекта позволит так же корректно удалить и все стоящие ниже по иерархии.
|