Глава 26. Рисование на glcanvas 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Глава 26. Рисование на glcanvas



 

GLCanvas — это аналог обычного дельфийского Canvas, но работает намного быстрее. Итак, подключите модули GLCanvas и OpenGL1x, в инспекторе объектов GLScene добавьте TGLDirectOpenGL. Создайте событие OnRender, и добавьте в него следующие строчки:

procedure TForm1.GLDirectOpenGL1Render(Sender: TObject;

var rci: TRenderContextInfo);

var

glc: TGLCanvas;

begin

glc:=TGLCanvas.Create(GLSceneViewer1.Width,GLSceneViewer1.Height);

with glc do

begin

// Команды рисования на канве

end;

glc.Free;

end;

 

Свойства GLCanvas практически совпадают со свойствами Canvas. Упомянем только свойства InvertYAxis — оно меняет направление оси Y на снизу вверх — и PenAlpha — меняет прозрачность рисования, меняется от 0 до 1.


Глава 27. Звуки

Проигрывание звуков с помощью BASS

 

Поместите на форму GLSMBASS и GLSoundLibrary (здесь и дальше будет подразумеваться, что основные компоненты, такие как GLScene, GLCadencer, GLSceneViewer уже находятся на форме). Для работы потребуется файл bass.dll, скопируйте его в папку с вашим проектом из System32.

У GLSMBASS установите свойства Cadencer = GLCadencer1; Active = True.

Добавить звуковой файл в GLSoundLibrary можно через инспектор объектов или так:

GLSoundLibrary1.Samples.AddFile('имя файла');

Учтите, что для формата MP3 в uses надо добавить GLFileMP3.

Далее нам потребуется два объекта: один издает звук, а другой слушает. Пусть слушателем будет сфера:

GLSMBASS1.Listener:=GLSphere1;

А звучать будет куб (GetOrCreateSoundEmitter находится в модуле GLSound):

with GetOrCreateSoundEmitter(GLCube1) do

begin

Source.SoundLibrary:=GLSoundLibrary1;

Source.SoundName:='имя файла.wav';

Playing:= True;

end;

Некоторые свойства GLSMBASS (и других звуковых менеджеров):

Свойство Описание
DistanceFactor Указывает менеджеру масштаб сцены (сколько units в 1 м)
RollOffFactor Фактор затухания
DopplerFactor Насколько ощутим будет эффект Доплера (изменение частоты звука при относительном движении источника и слушателя).
Environment Окружение. Несколько влияет на результат.
MasterVolume Общая громкость, изменяет настройки системного микшера
Algorithm3D Насколько точно будет рассчитываться звук

 

Проигрывание звуков с помощью FMOD

 

Работает почти также, как и BASS. Для работы потребуется файл fmod.dll, а на форму нужно поместить не GLSMBASS, а GLSMFMOD.

Проигрывание звуков с помощью OpenAL

 

OpenAL (Open Audio Library) — свободно распространяемый аппаратно-программный интерфейс (API) для работы с аудиоданными. Ключевой особенностью является работа со звуком в 3D пространстве и использование эффектов окружающей среды (EAX). Поддерживается компанией Creative.

Для проигрывания звуков с помощью OpenAL есть специальный компонент GLSMOpenAL.

Хорошую демку можно посмотреть в стандартной папке Demos по адресу sound\3Dsound.

 

Эмиттеры будут работать, если активен, хотя бы один из звуковых менеджеров, в противном случае будет возникать ошибка. Если она возникнет, то проверьте в окне Creation Order (вызывается в контекстном меню формы), что менеджер создается раньше, чем сцена. При создании менеджера и эмиттеров программно это тоже следует учесть.


Глава 28. GUI в GLScene

Основные положения

 

Для создания интерфейса вначале необходимо создать рисунок, на котором будут нарисованы все будущие используемые компоненты (разные кнопки, флажки и т.д.). В Demos\media предусмотрен образец — DefaultSkin.bmp. Затем следует указать, что есть что на рисунке. Для этого нужно создать файл разметки в, например, GUI Layout Maker’e, который лежит на сайте glscene.ru в Демонстрационные программы — Прочее. В Demos\media есть и он — Default.layout.

Большинство компонентов могут иметь разные размеры, что создает некоторые проблемы. Например, у кнопок и панелей толщина фаски должна быть одинаковой при любом размере, а значит нельзя просто растягивать или сжимать один и тот же рисунок. Чтобы решить этот вопрос, в GLScene предусмотрено разбиение рисунка компонента на части с разным выравниванием. Части с разным выравниванием и масштабируются по разному (одни — только по вертикали, другие имеют постоянный размер, и т.д.). Например:

Простейшая GL-форма

 

Поместим на форму GLScene, GLSceneViewer и GLCadencer, и, как обычно, создадим камеру и настроим связи. Далее добавим GLMaterialLibrary, GLWindowsBitmapFont и собственно GLGUILayoutManager и установим шрифт в соответствующее поле менеджера.

Теперь откроем сцену и добавим объект GUI Objects — GLBaseControl. Он играет роль DummyCube для GUI компонентов. В нем создайте GLForm, а в ней GLButton, GLLabel и GLEdit, и у всех четверых укажите свойство GuiLayout. Вообще говоря, этого уже достаточно для вывода надписей – для этого укажем им какие-нибудь Caption. Изменения применятся при активизации VCL-формы, а текст GLEdit’а можно будет увидеть только в запущенной программе. Теперь выставим Position для GLButton в, например, (100; 80), GLLabel (100; 120), а GLEdit (100; 220). Также переместим форму в (100; 160). Важно, что при перемещении родителя дети не перемещаются вместе с ним!

Как видим, компоненты пока не имеют оформления, т.к. GLScene не знает, как именно их рисовать. Чтобы это исправить, создадим в библиотеке новый материал и загрузим в него упомянутый выше DefaultSkin.bmp (Texture.Disabled = false!), а GLGUILayout’у установим этот материал. Теперь загрузим разметку — в свойстве GLGUILayout. Filename укажем полный путь к Default.layout (для простоты его можно положить в корень диска). Он загрузится сразу же, в чем можно убедиться, открыв коллекцию GuiComponents. В ней появились настройки компонентов. Открыв свойство Elements любого из них, увидим набор частей, названных по их выравниваниям (свойство Align). Свойства TopLeft и BottomRight – координаты в пикселах соответствующих границ части на рисунке.

После всего этого вернемся в сцену и установим свойство GuiLayoutName форме в ‘form’, кнопке в ‘button_up’, а полю ввода в ‘edit’ после чего они наконец появятся на экране в надлежащем виде. Осталось только указать им нужные размеры.

Обработка мыши и клавиатуры

 

С этим все просто — мы должны эти события при получении передавать GL-форме, а она уже сама передаст их нужным компонентам. Запишем в GLSceneViewer1.OnMouseMove:

GLForm1.MouseDown(Sender, Shift, X, Y);

в GLSceneViewer1.OnMouseDown/Up:

GLForm1.MouseDown/Up(Sender, TGLMouseButton(Button), Shift, X,Y);

в Form1.OnKeyPress:

GLForm1.KeyPress(Sender, Key);

наконец, в GLCadencer1.OnProgress:

GLForm1.DoChanges;

и в GLButton1.OnButtonClick:

GLButton1.Caption:=GLButton1.Caption+’*’;

Также для наглядности кнопке установим GuiLayoutNamePressed в ‘button_down’. Запустим и испробуем полученную форму. Все должно быть почти как с VCL.

Демки: Demos\interface\GUIDemo и GUIPaint.

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

   
Игровое меню

 

В GLScene есть специальный объект, отвечающий за создание меню: GLGameMenu (HUD objects — GameMenu). Свойства:

Свойство Описание
Items Содержит пункты меню
ActiveColor Цвет текста активного пункта меню
BackColor Цвет фона
DisabledColor Цвет недоступного в данный момент пункта
Font Указывает шрифт текста (о шрифтах см. гл. 11)
InactiveColor Цвет текста неактивных пунктов меню
MarginHorz, MarginVert На сколько пикселей дополнительно нужно расширить фон по горизонтали и вертикали
MenuScale Может принимать два значения: gmsNormal и gms1024x768. Если gms1024x768, то меню получается мельче, и оно масштабируется при изменении размера GLSceneViewer’а
Position Положение центра меню, причем ось X направлена слева направо, а ось Y сверху вниз. Z задает порядок отрисовки
Selected Номер выделенного пункта меню, нумерация начинается с нуля
Spacing Расстояние между пунктами меню
TitleMaterialName Имя материала используемого в качестве заголовка (не забудьте заполнить поле MaterialLibrary)
TitleHeight, TitleWidth Высота и ширина заголовка
Enabled[index: Integer]: Boolean Указывает, доступен ли пункт меню с номером index или нет. Это свойство доступно только программно
SelectNext Перейти к следующему пункту меню;
SelectPrev Перейти к предыдущему пункту меню;
MouseMenuSelect Выделяет пункт меню, которому принадлежат координаты (X, Y).

Пример:

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

begin

if Key=VK_ESCAPE then

GLGameMenu1.Visible:=not GLGameMenu1.Visible;

 

if GLGameMenu1.Visible then

case key of

VK_UP: GLGameMenu1.SelectPrev;

VK_DOWN: GLGameMenu1.SelectNext;

VK_RETURN: work(GLGameMenu1.Selected); // выполнить какое-то действие в зависимости от того, какой пункт меню выделен

end;

end;

 

procedure TForm1.GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

GLGameMenu1.MouseMenuSelect(X, Y);

end;



Поделиться:


Последнее изменение этой страницы: 2016-04-19; просмотров: 476; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.138.123.238 (0.019 с.)