- •Учебник
- •Оглавление
- •Введение
- •Глава 1
- •I. Установка
- •II. Удаление
- •Глава 2. Первый проект
- •Глава 3. Создание сцены в режиме design time
- •Создание объектов:
- •Глава 4. Примитивные объекты. Вкладка Basic geometry.
- •Глава 5. Ориентация, координаты.
- •Глава 6. Движение.
- •Глава 7. Как узнать, сколько сейчас fps?
- •Глава 8. Полноэкранный режим.
- •Глава 9. Работа с материалами.
- •I. Прямое обращение к .Material
- •Глава 10. Использование 3d моделей.
- •I. Форматы моделей
- •Глава 11. Прокси объекты.
- •Глава 12. Создание земной поверхности с glTerrainRenderer.
- •Глава 13. Создание земной поверхности с glFreeForm.
- •Глава 14. Итоги работы с glTerainrender и glFreeForm.
- •Глава 15. Создание земной поверхности с glHeightField.
- •Глава 15. Создание неба.
- •Глава 16. GlAtmosphere.
- •Глава 17. Спецэффекты.
- •I. Огонь
- •II. Молния
- •III. Дождь
- •IV. Снег
- •VI. Блики от источников света
- •Глава 18. Растительность.
- •I. Деревья и кустарники
- •II. Трава
- •Глава 19. Работа со шрифтами и вывод надписей.
- •I. Вывод текста через компонент glWindowsBitmapFont
- •II. Проблема с glWindowsBitmapFont в Windows Vista
- •Глава 20. Выделение объекта мышкой.
- •Глава 21. Создание сцены в режиме runtime.
- •Глава 22. Тени.
- •Глава 23. Туман.
- •Глава 24. Vbo или расширение arb_vertex_buffer_object в OpenGl.
- •Глава 25. Fbo или расширение ext_framebuffer_object в OpenGl.
- •Глава 26. Рисование на канве.
- •Глава 27. Использование чистого OpenGl.
- •Глава 28. Звуки.
- •I. Проигрывание звуков с помощью bass
- •II. Проигрывание звуков с помощью fmod
- •III. Проигрывание звуков с помощью OpenAl
- •Глава 29. Игровое меню.
- •Глава 30. Примитивная физика dce.
- •Глава 31. Физика ode.
- •II. Основы библиотеки ode(: tglodeManager и tglodeJointList) на примере создания подобия боулинга.
- •Глава 32. Физика Newton.
- •Глава 33. Ручная проверка коллизий.
- •V. Ручная проверка коллизии
- •Глава 34. Шейдеры. Терменология.
- •Глава 35. Шейдеры. История и компоненты.
- •Глава 36. Шейдеры glsl. Введение.
- •Глава 37. Шейдеры glsl. Использование без компонентов. Самый примитивный шейдер.
- •Глава 38. Шейдеры glsl. Немного о спецификации. Типы данных и переменные
- •Стандартные функции
- •Поддерживаемые компоненты векторов
- •Глава 40. Шейдеры glsl. Текстурирование.
- •Глава 41. Шейдеры glsl. Использование без компонентов. Мультитекстурирование. Смешение трёх цветов по базовой карте.
- •Глава 42. Шейдеры glsl. Использование через компонент glslShader. Часть первая – Первые шаги.
- •Глава 43. Шейдеры glsl. Использование через компонент glslShader. Часть вторая – знакомимся со светом. Передача параметров в шейдер.
- •Глава 44. Шейдеры glsl. Использование через компонент glslShader. Часть третья – текстуры.
- •Глава 45. RenderMonkey.
- •Глава 46. Оптимизация программы.
- •Глава 47. Практика. Создание мира
- •Приложение
- •I. Типы векторов и матриц
- •II. Работа с векторами
- •III. Работа с матрицами
- •IV. Методы объектов glScene
- •Предметный указатель по компонентам glScene
Глава 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.