Издание второе, переработанное и дополненное
Данный урок расскажет вам, как с нуля (ну, в Blender, естественно) создать простую трехмерную игру. Совершенно без какого-либо программирования на языках, хотя это возможно. Вам необходимо иметь
базовые знания о Blender. Я рассчитываю на то, что вы уже неплохо разбираетесь в интерфейсе, и на мелочах вроде наведения курсора, нажатия левой кнопки мыши, отпускания левой кнопки мыши, нажатия и отпускания кнопки G для перемещения и последующего щелчка и т.п. я задерживаться не буду.
Организационные моменты. Чтобы получить доступ к функциям игрового движка, нужно переключить рендер на игровой движок.
Далее вы можете сделать удобный вам интерфейс, но в Blender уже всё заготовлено. Выбрав макет «Game Logic», вы получите удобный интерфейс.
Включите режим отображения Текстура (Texture), чтобы игра выглядела как нам надо.
Запустить игру вы можете, наведя курсор на нужный 3D-вид (если вы успели сделать их несколько) и нажав P (английскую, по-русски З, между Щ и Х :) ). Можно запустить игру и через меню Игра - Запустить игровой движок (Game - Start Game Engine). Если вы попробуете запустить игру сейчас, то ничего интересного не произойдёт, будет лишь серый кубик на сером фоне. Нажмите Esc, чтобы выйти из игры. Но это не поможет, если вы задействуете в игре эту клавишу, так то будьте осторожны ;)
Перед запуском игры вы можете нажать Shift+Пробел или Ctrl+Вверх/Вниз, чтобы развернуть окно, над которым находится курсор, во весь экран и чтобы не проверять игру на маленьком, еле-заметном 3D-окошке. Также вы можете нажать T или N, чтобы скрыть левую и правую панель 3D-вида соответственно.
Вы можете спрятать «мусор» вроде пустышек, 3D-курсора, сетки и пр., нажав N (предварительно наведя курсор на 3D-вид) и в появившейся панели во вкладке Отображение (Display) выбрав Только визуализируемое (Only Render). При этом фон изменит цвет на тот, что установлен в настройках мира (World).
В этой же панели через меню Затенение (Shading) вы можете включить GLSL вместо мультитекстурного, позволяющий делать более красивую графику (например, тени).
Создание материалов для игры в целом совпадает с созданием для Blender Internal Render (пока что это рендер по умолчанию, но скоро его заменит Cycles), но есть ограничения. Например, не работают все процедурные текстуры, трассировка лучей (и, как следствие, нет теней у некоторых ламп), гало. Рекомендуется создавать UV-текстуры. Нет частиц, но их можно имитировать с помощью большого количества объектов (нет, копировать вручную не надо; их добавление во время игры рассматривается ниже). Без GLSL ограничений ещё больше, а освещение совсем уже некрасивое.
Как всё работает. Сенсоры, контроллёры и актуаторы. Вся игра в Blender Game Engine строится на логических блоках aka «кирпичиках» (Logic Bricks). Панель их редактирования вы можете увидеть в редакторе логики (Logic Editor) (обычно располагают его внизу окна Блендера). Имеется три типа логических блоков (слева направо): сенсоры (Sensors), контроллёры (Controllers) и
актуатор (Actuators) (в русском переводе называется «Активатор»). Они добавляются нажатием соответствующей кнопки (Add Sensor/Controller/Actuator), а удаляются соответствующим крестиком.
Сенсоры (Sensors) — датчики объекта, его глаза, нос и уши. Если очень захотеть, то и «интуиция». :)
Актуаторы (Actuators) — «ноги и руки» объекта. Они выполняют какие-либо действия (передвигают объект, меняют его форму, меняют массу, выключают игру, включают другую игру, отправляют сообщение другим объектам, устраивают самоубийство объекта).
Контроллёры (Controllers) — «мозг» объекта. Именно они решают, когда запускать актуаторы, «считывая показания» с сенсоров.
Логические блоки связываются друг с другом путем соединения соответствующих шариков. Сенсоры можно соединять только с контроллёрами, контроллеры — только с актуаторами. К одному контроллеру можно присоединить несколько сенсоров и несколько актуаторов. Зажмите левую кнопку мыши на одном из «шариков», протяните курсор до другого и отпустите кнопку. Шарики свяжутся соответствующей «ниточкой». Чтобы отцепить блоки друг от друга, повторите процедуру.
Логические блоки, как и 3D-вид (и вообще любую часть окна), можно развернуть на весь экран сочетанием клавиш Ctrl+Вверх. Это пригодится, так как при построении игры количество «кирпичиков» быстро растёт, они занимают много места, а «ниточки» превращаются в запутанный клубок.
Hello, World! Сделаем хелловорлд из наиболее часто используемых логических блоков. Добавьте сенсор Всегда (Always) (Add Sensor - Always). Это сенсор срабатывает, соответственно, всегда. Зажмите на нем левую кнопочку с тремя точечками. Так сенсор будет посылать контроллёру сигнал с сообщением, что он активен, на протяжении всей игры, на каждом кадре, а не только единожды при запуске.
Потом добавьте контроллер И (And) и соедините их. Данный контроллер запускает актуаторы только тогда, когда все сенсоры, присоединенные к нему, активированы. Для сравнения: контроллер ИЛИ (Or) срабатывает тогда, когда хотя бы один присоединенный сенсор сработал.
Теперь добавьте актуатор Движение (Motion) и соедините его с контроллёром. Данный актуатор перемещает объект. В нем содержится три столбика цифр — оси X, Y и Z — и две строчки: положение (Loc) и вращение (Rot). В четвёртом столбике расположены кнопочки L; если какая-либо включена, то действие (движение или поворот в зависимости от того, на какой строчке эта кнопка расположена) будет идти по локальным координатам объекта, если отключена — по глобальным. Я надеюсь, вы знаете разницу между ними. Напишите в первой строчке во втором столбике цифру 0.1 (обратите внимание, что именно точка, а не запятая).
Теперь запустите игру (Наведите курсор на 3D-вид и нажмите P). И куб внезапно куда-то уезжает. Hello World готов :)
Нажмите Esc, чтобы выйти из игры.
Во второй строчке в третьем столбике напишите 2.
Это задаст поворот объекта в градусах. Всё там по-математически: положительный угол поворачивает против часовой стрелки (вспоминаем школьный курс тригонометрии), отрицательный — по часовой.
Теперь результат при запуске игры должен быть примерно таким:
А теперь попробуйте отжать верхнюю (напротив Loc) кнопочку L и посмотрите, что получится.
Подробнее о сенсорах. Каждый сенсор имеет следующие параметры:
-имя. По умолчанию равно названию самого сенсора плюс число, если название уже занято. Рекомендуется переименовывать сенсоры согласно их функциям, чтобы потом не путаться.
-импульсный режим (pulse mode) — две кнопки с тремя точечками. Если они зажаты, то сенсор будет отправлять сигнал о срабатывании (первая кнопка) или об отключении (вторая кнопка) не единожды при самом возникновении события, а постоянно до тех пор, пока сигнал не изменится. Важно для таких актуаторов, как Свойство (Property), Действие (Action), Правка объекта (Edit Object) и для скриптов.
-Частота (Freq): промежуток между отправками сигналов в импульсном режиме. Задаётся в логических кадрах (один кадр выполняется перед рисованием одного обычного кадра), то есть по умолчанию 60 — промежуток в одну секунду.
-Разово (Tap) — если включено, то при срабатывании сенсор отправляет сигнал и сразу после него отправляет сигнал об отключении.
-Инвертировать (Invert) — инвертирует значение сигнала.
Контроллёры. Их немного, поэтому опишу каждый.
-И (And). Активируется, если все присоединённые к нему сенсоры сработали.
-И-НЕ (NAND). Активируется, если хотя бы один присоединённый к нему сенсор
не сработал.
-ИЛИ (OR). Активируется, если хотя бы один присоединённый к нему сенсор сработал.
-ИЛИ-НЕ (NOR). Активируется, если ни один сенсор не сработал.
-Искл. ИЛИ (XOR). Срабатывает, если из всех подключенных сенсоров сработал только один.
-Искл. ИЛИ-НЕ (XNOR). Не срабатывает, если из всех подключенных сенсоров сработал только один. Если сработало ноль, два, или любое другое количество сенсоров, то срабатывает.
-Python. Запускает скрипт, если какой-то сенсор отправил какой-то сигнал. Далее скрипт, воспользовавшись модулем bge, должен прочитать сигналы сенсоров и включить нужные актуаторы (можно не все сразу). В режиме Модуль (Module) нужно указать имя модуля, потом точку и имя функции, которая будет вызвана из модуля. Функции передаётся единственный параметр — текущий контроллёр. Как писать скрипты, здесь рассказываться не будет, мы делаем игру совершенно без программирования :)
-Выражение (Expression). Это уже почти программирование. Позволяет писать разные логические выражения с использованием значений сенсоров и параметров (Property).
Можно поставлять значения сигналов сенсоров и свойств (Property; в данном уроке они рассматриваться не будут, но можете сами разобраться с соответвующими сенсором и актуатором), используя их имена. Если указанное имя принадлежит и сенсору, и свойству, то берётся сенсор. Если свойство не ноль или просто строка (даже пустая), то оно даёт True, иначе False.
Можно писать целые и дробные (с точкой) числа, строки в двойных кавычках.
Значения сенсоров и свойств с логическим типом записываются с помощью True и False (регистр не имеет значения).
С любыми двумя выражениями (сенсоры, свойства, числа, строки) проводить следующие операции сравнения: and, or, != (xor, не равно), == (xnor, равно, также можно записать как просто =, но лучше не надо).
Любое выражение можно инвертировать, написав перед ним слово not.
Допустимо применение скобок.
Примеры выражений (правильные при условии, что есть соответствующие сенсоры и свойства):
Always and Keyboard
(S1 and S2) or S3
life == 100 and Keyboard
title != "Hello, World!"
W and A and not S and not D
1
0
5==5
5!=6
time < 1.0 and time > 2.5
Если написать «not 1», Блендер попросит отправить багрепорт :)
Типы физики. Границы столкновения. Удалите куб. Добавьте плоскость и обезьяну Сюзанну над ней. Поверните её лицом вперед (вдоль оси Y). Рекомендую нажать Ctrl+A и выбрать Повернуть (Rotation), чтобы применить поворот. Угол поворота после этого станет нулевым, и это позволит меньше думать и гадать, в каком столбике Motion написать нужное значение. Добавьте им какой-нибудь материал для красоты.
На панели свойств (Properties) откройте вкладку Физика (Physics). Найдите там меню Тип физики (Physics Type) и выставьте в нём значение Динамически (Dynamic).
Запустите игру. И — о чудо! — обезьянка
с грохотом пока без грохота шмякнулась об плоскость. :) Чтобы она шмякнулась лучше, вы можете в вышеописанном меню выставить Твёрдое тело (Rigid body), а в нижней части панели Физика (Physics) найти галочку Границы столкновения (Collision Bounds) и в меню выставить Выпуклая оболочка (Convex Hull). Но нам это сейчас не нужно.
Описание некоторых пунктов Physics Type:
-Сенсор (Sensor) — используется, если объект нужен только для отслеживания чего-нибудь (как сенсор); объект имеет границы столкновения, но другие объекты с ним не сталкиваются, а проходят сквозь него.
-Перекрывание (Occlude): никакой физики у объекта, получается только как «декоративный» объект. Что, правда, не мешает работать некоторым сенсорам и актуаторам. Основная фича данного режима в том, что если какой-либо объект целиком спрятался за другой объект с данным режимом, то Блендер его не будет прорисовывать. (
Пример. Добавляется куча кубиков. Как только FPS упадёт и всё задёргается — стрелками влево-вправо закрываем кубики плоскостью и наблюдаем прирост производительности.)
-Мягкое тело (Soft Body). При применении объект падает и «расплывается» по поверхности. Уровень «расплыва» регулируется параметрами Итерации положения (Position Iterations), Линейная жесткость (Linear Stiffness), Трение (Friction), Отступ (Margin, что-то вроде невидимой границы, иногда увеличение данного параметра спасает от глюков), Столкновение кластеров (Cluster Collision, указание, с чем будет сталкиваться Soft Body, позволяет более грамотно просчитать физику и иногда спасает от «провала» сквозь пол).
-Твердое тело (Rigid Body). Вместе с Collision Bounds - Convex Hull или Triangle Mesh реалистично падает и отскакивает.
-Динамически (Dynamic): что-то вроде упрощенного Rigid Body.
-Неподвижно (Static). Стоит, где поставят. Об нее тоже могут сталкиваться другие объекты, но «статик» не сдвинется с места.
-Нет столкновения (No Collision): то же, что и Occlude, только без фичи.
Параметры границы столкновения:
Отступ (Margin) — «невидимая граница» объекта. Рекомендую ставить небольшое значение (0.060): и не заметно, и избавляет от глюков вроде прохождения объектов друг в друга.
Типы границы:
-Куб (Box). Объект будет вести себя, соответственно, как кубик.
-Сфера (Sphere). Объект будет способен катиться.
-Цилиндр (Cylinder).
-Конус (Cone).
-Выпуклая оболочка (Convex Hull). Дает достаточно реалистичную физику. Но «впуклости» объекта в данном типе не учитываются. Увидеть эту границу можно, включив Soft Body (лучше всего на Сюзанне) и выставив этот тип границы.
-Полисетка из треугольников (Triangle Mesh) — в точности повторяет форму объекта, но и неслабо пожирает ресурсы процессора.
Управление с клавиатуры. Добавьте Сюзанне четыре сенсора Клавиатура (Keyboard), четыре контроллера И и четыре актуатора Движение. Соедините их соответственно. В первом сенсоре выберите пункт Ключ (Key) и нажмите стрелку вверх (или W, по вашему усмотрению). То же самое проделайте и со следующими сенсорами, но нажимайте вниз, влево и вправо (A, S и D) соответственно. Должно получиться что-то вроде этого (сенсоры и актуаторы свернуты для экономии места).
Теперь в первом актуаторе найдите строчку Сила (Force) и где-нибудь (во втором столбике?) напишите цифру 5. Вообще, эти новые строчки появились с включением физики (которая Dynamic). Если Полож. и Вращ. просто перемещают/поворачивают объект на заданные метры/градусы, то Force — это сила, с которой объект будет толкаться, а Мом. вращ. (Torque) — поворачиваться. Естественно, это всё зависит от массы (параметр Mass, который где-то под меню выбора типа физики). Нет смысла задавать силу, меньшую или равную массе. Такая сила не сможет сдвинуть «такой тяжеленный» объект. Запустите игру и нажмите стрелку вверх. Обезьянка поехала вперёд? Поздравляю, всё хорошо. Поехала не туда? Поздравляю, вы ошиблись столбиком :) Вообще не поехала? Проверьте, написали ли вы силу вообще и настроили ли все логические блоки. А возможно, обезьянка просто пытается ехать вниз, в «пол», и такое бывает. ;) Всё зависит от того, как вы повернули объект.
Повторите то же самое со следующим актуатором Motion, но только напишите отрицательное значение. Запустите игру и погоняйте Сюзанну, радуясь тому, что вы уже, в принципе, создали свою первую игру.
А в третьем актуаторе мучайте уже не силу, а момент вращения (Torque). Напишите где-нибудь (в третьем столбике?) число 5. С такой силой будет поворачиваться объект. А в четвёртом актуаторе напишите -5.
Теперь обезьянка должна уметь ходить где угодно и куда угодно.
Долой управление в воздухе! Сенсор Touch. Если вы поднимите Сюзанну повыше, то можете заметить, что вам получается управлять ей еще при полете. Однако в реальности такое без крыльев невозможно (хотя и ног-то у нее нет, но этим сейчас можно пренебречь :) ). Поэтому это надо исправить.
Добавьте сенсор Касание (Touch) и соедините его со всеми контроллёрами.
Вот и всё. Однако если вы смените контроллеры And на Or, то это не сработает и вообще может вызвать глюки. Всё правильно: «в воздухе» срабатывают клавиши, а «на земле» срабатывает Touch, а для Or, как было указано выше, необходим хотя бы один работающий сенсор, чтобы включить актуаторы.
С данным сенсором можно без труда научить героя прыгать. Добавьте сенсор Клавиатура, назначьте на него кнопку Пробел, добавьте контроллер И и актуатор Движение, в котором напишите силу по глобальной оси Z примерно 200 (для тех, кто ничего не понял: строчка Force, третий столбик, кнопочка L не нажата). Всё друг с другом соедините, и к контроллёру прикрепите еще сенсор Touch.
Теперь Сюзанна может прыгать. Но при такой конструкции есть одна ошибочка: если добавить стену, подойти к ней вплотную и зажать пробел, то из Сюзанны получится Гагарин. :) В таком случае частично спасёт нажатие кнопочки Разово (Tap) в сенсоре Клавиатура (Keyboard).
Слежение за объектом, вариант 1. Связь Родитель-Потомок в BGE. Вершина как родитель. Медленный родитель. Если кто-то не понял, про что это, то это Ctrl+P и Alt+P. Если опять не поняли, почитайте учебников. При использовании Parent в BGE есть одна особенность: соединение объектов разного размера порождает разнообразные глюки. Поэтому перед использованием Ctrl+P настоятельно рекомендую сбросить размер всех объектов к 1, выделив каждый из них, нажав Ctrl+A и выбрав в появившемся меню параметр Масштабировать (Scale). Это касается в том числе таких «безразмерных» объектов, как пустышки и камеры.
Vertex Parent (привязка к вершине, для тех, кто не знает: перед Ctrl+P переходим в режим редактирования (Edit Mode), выделяем нужную вершину и только тогда нажимаем Ctrl+P) тоже не обошелся без глюков. При такой связи не работает Медленный родитель (Slow Parent). Но это можно обойти: для этого к вершине привяжите пустышку, а уже к ней прикрепляйте другие объекты с любыми Slow Parent.
При включении Медленного родителя (Slow Parent) потомок следует за родителем не безостановочно и резко, а с некой заданной задержкой. Он прячется в панели Объект (Object) во вкладке Дополнительные отношения (Relations Extras).
Поставьте камеру сзади нашей Сюзанны. Выделите её и, зажав Shift, выделите Сюзанну. (На заметку: последний выделенный объект обводится более светлой оранжевой линией.) Нажмите Ctrl+P и выберите в появившемся меню Объект (Object). Тем самым вы создадите связь родитель-потомок. Между центрами объектов должна появиться пунктирная линия.
Запустите игру с видом из камеры. Если вы всё сделали правильно, то теперь камера должна двигаться за Сюзанной.
Выделите камеру. Включите вышеописанный Slow Parent и задайте смещение (Offset) около 20. Это даст более «гладкую» и приятную картинку.
Тень от объекта. Vertex Parent на практике. Включите режим GLSL, если вы его ещё не включили. Добавьте прожектор (Add - Lamp - Spot). Отрегулируйте его так, чтобы он светил на обезьянку. Задайте ему параметры, указанные на рисунке.
Теперь от Сюзанны должна падать тень. Если тень слишком чёрная, попробуйте уменьшить энергию (Energy). Можете поиграться с параметрами для достижения лучшего качества тени.
Выделите Сюзанну, перейдите в режим редактирования. Создайте вершину в её центре. Я обычно делаю так: выделить всё (A) - дублировать (Shift+D и Esc) уменьшить размер до нуля (S - 0 - Enter) - сделать из кучи вершин одну (T (включает левую боковую панель) - вкладка Удаление (Remove) - Удалить двойные вершины (Remove Doubles). Теперь вернитесь в объектный режим, выделите лампочку и, зажав Shift, выделите Сюзанну. Не снимая выделения, перейдите в режим редактирования, выделите эту вершину посередине и нажмите Ctrl+P, не забыв выбрать единственный пункт в появившемся меню.
Теперь в игре Сюзанна всегда будет с тенью.
Почему нельзя прикреплять лампочку простым Parent? Потому что тогда она будет не только передвигаться за Сюзанной, но и вертеться так же, как она, и будет получаться всегда одинаковая тень. Вершина же имеет только координаты, соответственно, за ней поворачиваться не получится, только передвигаться, и лампочка всегда будет светить только с одной стороны.
Слежение за объектом, вариант 2. Актуатор Камера. Есть еще вариант привязки камеры к объекту. Создайте сенсор Всегда с зажатыми левыми «тремя точками» (импульсный режим), присоедините его к контроллеру И, контроллер привяжите к актуатору Камера (Camera). В поле Объект камеры (Camera Object) найдите объект, за которым вы следите (Suzanne, если вы творите это с Сюзанной (не забудьте тогда убрать связь Родитель-Потомок нажатием Alt+P), или Cube, если вы издеваетесь над кубиком, или еще что нибудь). В списке Ось (Axis) выберите +Y. В поле Высота (Height) напишите 2, в поле Min (минимальное расстояние от объекта) — 4, в поле Max — 7.
Посмотрите, как это работает в игре. Если вас устраивает, можете оставить этот вариант. Не устраивает — удалите всё и вернитесь к Parent. Или просто переоткройте файл, если вы его не сохраняли.
Немного динамики. Добавьте в сцену кубик (Add - Mesh - Cube). Задайте ему тип физики Твёрдое тело. Измените его массу на 0.2. Чуть ниже найдите и включите галочку Границы столкновения и в списке выберите Куб. Размножьте его нажатием Alt+D.
Запустите игру и повеселитесь.
Слежение за объектом, вариант 3. Сенсор Рядом, актуатор Редактирование объекта. Свойства. Добавьте новую Сюзаннку (Add - Mesh - Monkey). Сделайте её примерно в два раза меньше нашего героя. Поверните ее лицом вперёд (так же, как и Сюзанну) и нажмите Ctrl+A - Повернуть (Rotation). Установите тип физики Динамически, Установите границу столкновения — куб. Задайте массу 0.1. Добавьте сенсор Всегда (всё с теми же «точечками», ага), свяжите с контроллером И. Создайте актуатор Правка объекта и свяжите его с тем же контроллером. В списке у актуатора выберите Слежение (Track to). В поле Объект (Object) выберите Suzanne, в поле Time напишите 30.
Что это вообще даёт? Track to заставляет объект смотреть на другой объект. Время задаёт задержку: это что-то вроде смещения в Медленном родителе. Если нажать кнопочку 3D, то Сюзаннка будет прям «смотреть в центр» объекту, а не просто поворачиваться за ним.
Запустите игру. На Сюзанну должны постоянно смотреть чьи-то глаза. :)
Выделите большую Сюзанну. В редакторе логики найдите слева кнопку Добавить игровое свойство (Add Game Property). Нажмите её. Вместо prop напишите название Parent (или любое другое, по вашему желанию). Параметру можно задавать различные значения, но это нас сейчас не интересует.
Вернитесь к маленькой Сюзанне и добавьте ей сенсор Рядом (Near), где в поле Свойство (Property) впишите имя того параметра (Parent). В поле Расстояние (Distance) напишите 2, в поле Расстояние сброса (Reset Distance) — 3.
Сенсор Рядом — некий радар объекта. Он просматривает, есть ли объект с данным свойством на заданном расстоянии. Если такой объект появится, то он будет срабатывать до тех пор, пока объект не отдалится на расстояние сброса.
Нажмите в сенсоре кнопку Инвертировать (Invert). С этой кнопкой сенсор будет работать наоборот: вместо срабатывания он будет молчать, а вместо молчания — срабатывать. Для сенсора Рядом получится, что он будет сигнализировать, что объектов с данным свойством возле сенсора нет.
Добавьте контроллер И и соедините его с сенсором Рядом. Добавьте актуатор Движение, где в строчке Полож. во втором столбике напишите 0.05.
Запустите игру. Если вы всё сделали правильно, то теперь за Сюзанной должна постоянно бегать маленькая обезьянка. :) Сенсор Рядом нужен для того, чтобы она не толкала большую Сюзанну.
Добавление объектов во время игры. Перенесите маленькую Сюзанну на второй слой, нажав M и выбрав слой. Для удобства можете так же перенести и лампочки, но с зажатым Shift.
А в первом слое добавьте пустышку, ей добавьте сенсор Всегда (на этот раз без «точечек»!), контроллер И и актуатор Правка объекта (тип Добавить объект (Add Object)). В этом актуаторе в поле Объект выберите нашу маленькую Сюзанну (скорее всего, она называется Suzanne.001). Можете с помощью Alt+D создать несколько таких пустышек.
Теперь при запуске игры на месте таких пустышек появятся наши маленькие Сюзаннки. Но сами пустышки останутся!
Параметр Time в актуаторе задаёт время жизни добавляемого объекта. Значение 60 — одна секунда (при установленной частоте кадров 60). 0 — бесконечно. Вместе с зажатыми «точечками» в сенсоре Всегда и параметром Freq (частота срабатывания сенсора), отличным от нуля (15, 30, 60), можно создать что-то типа дождя, снега, летящих листьев, прочего мусора. Можно задать линейную (Linear) и угловую (Angular) скорости (Velocity).
Генератор обезьян. Сенсоры Столкновение, Сообщение. Актуатор Сообщение. Создайте что-то подобное (три объекта) (освещение изменено для наглядности):
Скопируйте (Shift+D) одну из пустышек, добавляющих обезьянок, и поместите её внутрь трубы. Измените сенсор Всегда на Сообщение и в поле Тема напишите Add New. Запомните название пустышки: оно нам пригодится. В актуаторе измените линейную скорость (Linear Velocity) во втором столбике на -10 (или 10, или вообще в другом столбике — в зависимости от того, как вы издевались над пустышкой, дальше, в общем, посмотрите и разберетесь).
Выделите «кнопку» (которая красный цилиндр) и добавьте ей сенсор Столкновение. В поле Свойство (Property) пропишите имя свойства, которое вы писали большой Сюзанне (которое Parent, которое в Near писали).
Что это? Это то же самое Касание, но только вместо материала он реагирует на свойство. Соедините его с контроллёром, контроллёр — с актуатором Сообщение (Message). В актуаторе в поле Тема (Subject) напишите Add New (то же самое, что писали в сенсор пустышке). Далее по желанию в поле Объект (Object) можете выбрать эту самую пустышку.
Как это работает? При соприкосновении героя с «кнопкой» срабатывает актуатор, который отправляет сообщение нашей пустышке (или всем объектам, если вы не задавали объект). В пустышке сенсор принимает сообщение и сравнивает Тему (Subject) с тем, что в него прописали. Поле Тело (Body) в логических блоках не используется, но его можно использовать в скриптах, но это уже программирование, выходящее за рамки данного урока.
Запустите игру и попробуйте «ткнуть кнопку». Сюзаннка вылетела из трубы? Отлично. Застряла в трубе? Мучаем линейную или делаем трубу побольше. Вообще не вылетела? Скачиваем blend-файл и сравниваем.
Анимация в BGE. Актуатор Действие. Выделите «кнопку». Стрелками влево-вправо-вверх-вниз выставьте первый кадр (текущий кадр показывается в левом нижнем углу, см. рис.) Нажмите I и в появившемся меню выберите Положение (Location).
Это создаст ключевой кадр положения объекта в анимации. (Вообще про анимацию вы можете почитать другие учебники.) После этого цвет имени объекта и номера кадра должен стать оранжевым. Это показывает, что на данном кадре у выделенного объекта что-то записано (в нашем случае положение).
Перейдите в 15 кадр и снова нажмите I - Положение. Перейдите в 7 кадр. Передвиньте «кнопку» внутрь кубика (G - X - подвигайте курсор мышки - Enter) и нажмите I - Положение.
Вернитесь в первый кадр. Нажмите Alt+A. Вы должны увидеть что-то вроде этого:
Нажмите Esc.
Добавьте актуатор Действие (Action). В списке выберите созданную анимацию (CylinderAction) В поле Нач. кадр (Start Frame) напишите 1, в поле Кон. кадр (End Frame) — 15. Присоедините его к уже имеющемуся контроллеру.
Теперь в игре при нажатии кнопки она должна реально нажиматься.
Звук. Добавление звука без объёмного звучания очень просто. Нужно всего лишь добавить актуатор Звук (Sound) и выбрать нужный файл, по желанию можно поменять громкость или высоту звука.
Настройку 3D-звука я рассматривать не буду, так как она далеко не так очевидна, как кажется из названий.
Описание типов/режимов воспроизведения (в выпадающем списке) для Действия и Звука:
-Остановка воспроизведения (Play Stop) — выполнение действия прекращается сразу же после того, как контроллер отключил данный актуатор. Воспроизводится один раз.
-Завершение воспроизведения (Play End) — после отключения проигрываемая анимация/проигрываемый звук играет до конца и более не выполняется. Если контроллер актуатор не отключал, проигрывается один раз.
-Остановка цикла (Loop Stop) — повторяет анимацию/звук всё время, пока актуатор включен. При отключении резко останавливается.
-Конец цикла (Loop End) — при отключении играет оставшееся до конца и останавливается.
-Двунаправленный цикл (Loop Bidirectional, для звука) — один раз играет с начала до конца, второй раз играет с конца до начала. При отключении доигрывает всё до конца.
-Остановка двунаправленного цикла (Loop Bidirectional Stop, для звука) — то же самое, но при отключении резко останавливается.
-Флиппер (Flipper, для действия) — при включении играет анимацию, при отключении играет анимацию с места, на котором отключили, до начала (в обратную сторону).
-Свойство (Property, для действия) — отображает кадр, который установлен в заданном свойстве.
На этом создание игры в рамках данного урока закончено. Используя полученные знания, прямые руки и хорошее воображение, вы можете уже построить неплохую мини-игру.
Сохранение игры в исполняемый файл. Необязательно вместе с игрой таскать Блендер. Он имеет отдельную программку blenderplayer, которая сразу запускает blend-файл как игру. Вы его можете найти в папке с Блендером. Чтобы почитать справку по использованию, запустите её в консоли.
Чтобы из самого blend-файла создать исполняемый, нужно сперва включить адд-он Save As Game Engine Runtime. Зайдите в меню Файл - Пользовательские настройки (File - User Preferences) и во вкладке Дополнения (Addons) найдите и включите его. После этого в меню появится пункт Файл - Экспортировать - Save As Game Engine Runtime (File - Export - Save As Game Engine Runtime). Выберите этот пункт меню. Сохраните игру где-нибудь. Рекомендую создать отдельную папку, так как вместе с игрой потянутся еще библиотеки и Python. Теперь вы можете запустить игру без Блендера.
Перед сохранением можно настроить, как будет отображаться игра. Найдите панель Визуализация (Render).
Некоторые параметры:
Полноэкранный режим (Fullscreen) — запускает игру во весь экран.
Разрешение (Resolution) — размер окна.
Затенение (Shading) — тут прячется наш GLSL.
Отображение (Display):
-FPS и профиль (Framerate and Profile) — показывает в углу экрана информацию о нагрузке и частоту кадров.
-Визуализация физики (Physics Visualization) — показывает всю физику. Можно наглядно увидеть границы столкновения у объектов, как работают сенсоры.
-Курсор мыши (Mouse Cursor) — показывает курсор мыши.
Скачать готовый blend-файл