Главная » Статьи » Учебник: теория

DirectGUI

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Рельеф объекта frameSUNKEN, 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)
geomgeom визуальное представление объекта
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-edit0 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 корневого объекта позволит так же корректно удалить и все стоящие ниже по иерархии.

Категория: Учебник: теория | Добавил: ninth (27.02.2009)
Просмотров: 5462 | Комментарии: 11 | Рейтинг: 5.0/2
Всего комментариев: 11
1 3dmax  
0
ООО хорошая штука.Потом пригодиться.
А что есть еще в панде чего мы не используем.
Может что-то что облегчит создание игры smile

2 ninth  
1
А ты скажи в какую сторону смотреть? )

3 3dmax  
0
ну даже не знаю, хоть что-то biggrin

4 ninth  
0
Могу по интервалам перевод сделать - может пригодиться.

5 Dimon3D  
0
Пригодится ВСЁ ! cheesygrin

6 MNSE  
0
По подробнее бы про импорт из 3ds max, про материалы и текстуры, которые можно сделать в максе, а потом импортировать, не плохо было бы небольшой пример про загрузку сцены из макса, и еще интересно было бы узнать как найчить персонажа "стрелять" и "умирать" при попадании. wink

7 WT45  
0
пример бы расжували по GUI... Что то у меня не выходит запустить ничего похожего... Я раньше работал на языках типа Javascript и т.п., работал на 3D Max дизайнером, а вот с 3D программированием (именно программированием) не связывался... Хотелось бы пример ... плиззз

8 WT45  
0
import direct.directbase.DirectStart
from direct.gui.DirectGui import *

class World():
def __init__(self):
myObj = DirectLabel(text = "Label X 01",scale = 0.5)

w = World()
run()

--------------------------------------------------------------------------------- ----------
Перевел с английского файлы помощи и плюс перевод примера музыкальной шкатулки.
biggrin


10 ninth  
0
Извиняюсь за игнор комментариев - до этого тяжело было следить за появлением новых комментов, сейчас пытаюсь исправить ситуацию. А по делу - трёхмерный движок лучше изучать с основ, а не с работы GUI, т.к. здесь GUI носит утилитарную функцию, в отличие от большинства языков, предназначенных для разработки настольно-прикладных программ.

9 dis_node  
0
geom, еси не ошибась, это не NodePath, это именованый блок геометрии из NodePath, который нужно специально указать т.к. их может быть куча (пример http://www.panda3d.org/manual/index.php/DirectButton )

11 ninth  
0
Ты имеешь ввиду вот это?
Code
geom = (maps.find('**/button_ready'),
  maps.find('**/button_click'),
  maps.find('**/button_rollover'),
  maps.find('**/button_disabled'))

Если да, то в данном случае просто один NodePath "раздёргивается" на более мелкие, т.к. метод find так же возвращает NodePath. Точно так же можно было загрузить 4 разных модельки и использовать их, но показанный способ более компактен ) Вообще, NodePath своим названием "кагбе намекает" ) он является путём к определённому куску сцены - так же как путь в операционной системе к директории, которая в свою очередь может содержать поддиректории, к которым так же можно добраться используя некоторый путь.

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Онлайн всего: 1
Гостей: 1
Пользователей: 0