Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник по GLScene.doc
Скачиваний:
255
Добавлен:
16.12.2018
Размер:
7.18 Mб
Скачать

Глава 29. Игровое меню.

В GLScene есть специальный объект, отвечающий за создание меню: GLGameMenu (Scene Objects-

>Add object->HUD objects->GameMenu).

Свойства:

Items – содержит пункты меню;

ActiveColor цвет текста активного пункта меню;

BackColor это цвет фона;

DisabledColor цвет недоступного в данный момент пункта меню;

Font указывает шрифт текста (как настраивать шрифт я писал в 11 главе);

InactiveColor цвет текста неактивных пунктов меню;

MarginHorz – показывает, насколько пикселей дополнительно нужно расширить фон по горизонтали;

MarginVert показывает, на сколько пикселей нужно расширить фон по вертикали;

MenuScale – может принимать два значения: gmsNormal и gms1024x768. Если стоит параметр gms1024x768, то меню получается мельче, и оно масштабируется при изменении размера GLSceneViewer’а;

Position – координаты X и Y указывают положение центра меню, причем ось X направлена слева направо, а ось Y сверху вниз. Z – задает порядок отрисовки;

Selected номер выделенного пункта меню, нумерация начинается с нуля;

Spacing расстояние между пунктами меню;

TitleMaterialName – имя материала используемого в качестве заголовка (не забудьте заполнить поле MaterialLibrary);

TitleHeight высота заголовка;

TitleWidth ширина заголовка;

Enabled[index : Integer]:Boolean – указывает, доступен ли пункт меню с номером index или нет. Это свойство доступно только программно.

Методы:

SelectNext – перейти к следующему пункту меню;

SelectPrev перейти к предыдущему пункту меню;

MouseMenuSelect(const X, Y: integer) - выделяет пункт меню, если ему принадлежат координаты (X, Y).

Пример:

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

begin

// скрывает/показывает меню при нажатии на ESCAPE

if Key=VK_ESCAPE then GLGameMenu1.Visible:=not(GLGameMenu1.Visible);

if GLGameMenu1.Visible then //Если меню видно

begin

case key of

VK_UP: GLGameMenu1.SelectPrev; //на пункт вверх

VK_DOWN: GLGameMenu1.SelectNext;//на пункт вниз

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

end;

end;

end;

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

begin GLGameMenu1.MouseMenuSelect(X, Y); end;

Глава 30. Примитивная физика dce.

DCE - самое элементарное, что есть из физики. Для начала подумаем, зачем он нам нужен - для проработки простейшей физики и для обработки столкновений (чтобы персонажи не проходили сквозь стены ну и просто для определения столкновения). Переходим к основной части, постараюсь объяснить всё коротко и ясно. Как сделать так чтобы персонаж не проходил сквозь стены? Объясняю. Для этого заходим в GLScene editor (двойной щелчок по Glscene на Glsceneviewer-е) Выбираем нужный объект, справа над окошком Behaviours нажимаем на Behaviours, далее в списке смотрим - там есть две нужные нам вещи - это DCE STATIC COLLIDER и DCE DYNAMIC COLLIDER. Сейчас объясню, что это такое и чем они вообще отличаются. STATIC, само слово говорит за себя, т. е. для статичных объектов (которые в нашей сцене двигаться не будут, но в них будет упираться персонаж - здания, стены, всевозможные препятствия). DYNAMIC, тоже говорящее слово, соответственно для динамичных объектов (которые будут свободно перемещаться по сцене, и упираться в статичные объекты). Идём дальше. Когда мы уже выбрали DCE STATIC COLLIDER или DCE DYNAMIC COLLIDER то эта строчка соответственно появится в окошке Behaviours, нажимаем по этой строчке, слева в Object inspector-е появляются новые пункты, что нам нужно выбрать из них. Active - проще говоря - включить или выключить, Bounce factor - прыгучесть, Friction - трение с данным объектом, Manager - здесь надо обязательно выбрать DCE MANAGER, а для этого нужно поместить его на форме (Gldcemanager), установили. Смотрим дальше. В поле Shape устанавливаем форму объекта, ну тут всё понятно - если сфера, то CSELLIPSOID, GLFreeform - CSFREEFORM, Terrainrenderer - CSTERRAIN, ну и куб - CSCUBE. SIZE - это если используется сфера, то нужно указать её размеры (найти параметры SCALE или RADIUS). SOLID - это плотность, если стоит True, то объект будет "непроходимым", False соответственно наоборот. Всё это нужно в основном для DCE STATIC COLLIDER. В DCE DYNAMIC COLLIDER отличий практически нет, единственное, что появляется USE GRAVITY подчинять ли этот объект гравитации или нет, SLIDERORBOUNCE это значит, объект будет прыгучим или скользящим дословно и SHAPE выбирать не придётся, на всех динамических объектах устанавливается форма CSELLIPSOID. Переходим к коду. Всё вышесказанное можно всё сделать с помощью кода. Делается это так - WithGetOrCreateDCEDynamic(имя нужного объекта) do //Могут возникнуть проблемы, если объект

//поворачивался (см. “Замечание”) 'для статичных' begin Manager := GLDCEManager1; BounceFactor := 0.75; Friction := 10; Shape := csFreeform; end; 'для динамичных' begin Manager := GLDCEManager1; BounceFactor := Friction := SlideOrBounce := Size.Assign(объект.Scale); end;

На Glactor наложить DCE DYNAMIC COLLIDER не получится, поэтому помещаем его в Даммикуб, и уже на него накладываем DCE DYNAMIC COLLIDER и подгоняем размеры. Далее для передвижения Даммикуба по сцене обрабатываем процедуру в Каденсере. procedure TForm1.HandleKeys;

var Force: TAffineVector;

begin Force := NullVector; if IsKeyDown('w') or IsKeyDown('z') then Force[2] := 200; if IsKeyDown('s') then Force[2] := -200; if IsKeyDown('a') or IsKeyDown('q') then Force[0] := 200; if IsKeyDown('d') then Force[0] := -200; GetOrCreateDCEDynamic(Player).ApplyAccel(Force); 'Player - Даммикуб, с помещённым в него Glactor' end; Пример взят из DCE DEMO. Всё вышеописанное можете просмотреть в DCE демке, прилагающейся к стандартному набору демок, поставляемых с GLSCENE.