Журнал LinuxFormat - перейти на главную

LXF100-101:Ни строчки кода!

Материал из Linuxformat
Перейти к: навигация, поиск
Игрострой: Ни строчки кода!
Игрострой: Шейдеры

Ни строчки кода!

ЧАСТЬ 1 Наслышаны о том, что создание игр – это тяжелый труд? Так оно и есть – но виртуоз Blender Андрей Прахов знает обходной путь!

Большинство поклонников открытых систем хорошо знакомы с прекрасной программой для 3D-моделирования и анимации – Blender (http://www.blender3d.org). Но мало кто знает, что Blender – это еще и игровой конструктор со встроенным движком. Обладая мощными возможностями по моделированию в совокупности со средой программирования игр, Blender позволяет создавать вполне современные по визуальным возможностям приложения. Помимо графической составляющей, редактор предоставляет разработчику возможность программирования на высокоуровневом языке – Python, интеграцию с физическими библиотеками Bullet и Sumo, создание двоичного файла для разных операционных систем, а также режим непосредственного кодирования процесса «одной мышью». Заинтересовались?

На протяжении четырех уроков мы с вами пройдем все этапы разработки игры, не прибегая к программированию в полном смысле этого слова. Оказывается, вполне возможно создать нечто работающее и в режиме «выдели и щелкни». Конечно, в серьезных, масштабных проектах без знания Python и его реализации в Blender не обойтись, но мы оставим эту тему для будущих уроков профессиональной серии.

Прежде чем приступить к непосредственному рассмотрению темы урока, советую положить рядом с собой подшивку номеров LXF87/88-LXF91, где рассматривались основы работы с Blender и установить последнюю версию программы (на момент написания статьи это 2.45). Можно, конечно, использовать и более старые сборки, однако велика вероятность, что некоторые интерфейсные элементы конструктора не будут совпадать. Уж очень любят разработчики тасовать данные элементы от версии к версии, как карты в колоде! Кроме того, последняя версия Blender отличается завидным быстродействием получаемых в итоге исполняемых файлов с игрой.

В первом выпуске «Игростроя» я говорил о пользе и, мало того, о необходимости разработки дизайн-документа для каждого проекта. К счастью, наша игра предполагает быть достаточно простой, поэтому ограничусь перечислением задач и особенностей проекта – этакий примитивный концепт-план.

Проект, над которым мы с вами будем работать, является простым имитатором игры в боулинг. Ради упрощения, правила игры будут изменены:

  1. Количество кеглей осталось без изменения, т.е. 10 штук;
  2. Количество попыток бросания шара ограничено тремя;
  3. Игра имеет начальное меню с двумя пунктами: «start», «end game»;
  4. Управление в игре: курсорные клавиши – передвижение указателя направления броска; Пробел – бросок; Esc – выход в меню;
  5. Перемещение указателя возможно вправо и влево, сила броска – постоянная;
  6. Визуальный интерфейс игры включает в себя отображение всех кеглей, которые исчезают при попадании, и трех шаров, демонстрирующих количество имеющихся у игрока попыток;
  7. При выигрыше или проигрыше выводится соответствующая надпись, и по нажатию «any key» происходит возврат в меню.

Вот и все. Просто? Просто, увы, только на бумаге. На протяжении всей серии мы с вами познакомимся с построением игровой логики, реализацией физических законов, правилами игрового текстурирования, с некоторыми интересными визуальными эффектами. Приступим к делу!

Расставляем кегли

Откройте файл lesson1_begin – его можно найти в разделе Журнал/Blender на LXFDVD. Полюбуйтесь появившейся картинкой… и переходите к теории.

Основы визуального программирования заложены в так называемых логических кирпичиках, которые вы сможете увидеть, если нажмете F4. Специфику работы можно легко понять, проведя аналогию с живым организмом. Существует некий раздражитель на который реагируют наши органы чувств, затем идет анализирование полученной информации и подается команда выполнить то или иное действие. В качестве «органов чувств» в Blender выступает закладка Sensors [Сенсоры], решение принимается логическим блоком Controllers [Контроллеры], а само выполнение лежит на Активаторах [Actuators]. После выбора нужных кирпичиков (это можно сделать, нажав кнопку Add в каждой закладке) и настройки параметров, необходимо соединить их между собой. Возле каждого кирпичика находится маленькая шашечка. Просто ухватитесь за нее и тяните появившуюся линию к следующему объекту. Удалить соединение можно, указав курсором на нужную линию (при этом она должна выделиться другим цветом) и затем нажав клавишу x. Естественно, любой объект в Blender может иметь свою логическую цепочку.

Возвращаемся к уже, надеюсь, открытому проекту. Как было сказано чуть выше, именно стрелка в игре указывает направление производимого броска, а управление осуществляется с помощью соответствующих курсорных клавиш. Итак, выделите объект arr (стрелка), нажмите F4, если вы еще не находитесь в режиме Логика [Logic]. Появившееся окно можно условно разделить на четыре зоны (слева направо): управление физикой объекта и его переменными плюс три логических блока (sensors, controllers, actuators). Пока нас не интересует самый первый блок, физикой мы займемся чуть позже, а вот во всех оставшихся нажмите кнопку Add, тем самым создав для каждой области по новому кирпичику.

Обратите внимание на поля с надписями Always [Всегда], And [И] и Motion [Движение]. Именно здесь вы можете указать конкретную функцию текущего блока. Просто щелкните на них и выберите нужный пункт из меню. Так, для сенсора замените Always на Keyboard [Клавиатура]. Поля рядом позволят вам переименовать эти кирпичики – лучше давать осмысленные названия. Используйте только латиницу и помните о чувствительности Blender к регистру букв. Дело в том, что это повышает не только информативность, но и дает возможность обращаться к кирпичикам из Pyhton. Кнопки с нарисованными треугольниками закрывают и открывают поля для редактирования.

Итак, наш сенсор сейчас настроен на работу с клавиатурой. Щелкните мышкой по полю рядом с надписью Key [Клавиша] – должна появится надпись Press a key, нажмите курсорную клавишу Left [Влево]. Теперь, если в игре будет нажата эта клавиша, сенсор тут же выдаст импульс.

Блок Controllers ответственен за принятие решения. Оставьте имеющееся там значение по умолчанию, а вот Motion рассмотрим поподробнее.

Данный кирпичик позволяет изменять местоположение и векторы направления движения, задавать повороты объекта. Поэтому все данные расположены в трех столбиках, по имеющимся осям XYZ. Первые два пункта, Force [Сила] и Torque [Момент], отвечают за перемещение объекта, если он использует физический движок. Для стрелки это не актуально, поэтому обратите внимание на dLoc и dRot. По названию понятно, что за что отвечает. Введите значение -0.05 для dLoc по оси Y (средняя колонка) и отожмите справа кнопку L для данного поля, тем самым указав, что нам необходимо работать с глобальными координатами.

Соедините шашечки между всеми тремя блоками для завершения логической цепочки (Рис. 1). Чтобы просмотреть результат нашего тяжкого труда, просто нажмите клавишу P, тем самым запустив игровой движок (да, да – Blender позволяет полноценно работать с полученной игрой без предварительной компиляции). Теперь, если вы все правильно сделали, нажатие левой курсорной клавиши заставит стрелку послушно ползти влево. Для выхода из режима игры просто нажмите Escape.

Добавьте самостоятельно логику для движения стрелки в другом направлении, а я перехожу к работе с физическим движком. Заставим шар сбивать кегли!

(thumbnail)
Рис. 1. Логическая цепочка для стрелки.

Страйк!

Работать с физикой в Blender – просто одно удовольствие. Для придания сфере физических свойств, выделите ее и в окне Логика [Logic] нажмите кнопку Actor [Действующий объект] на панели слева. Откроются еще две дополнительные кнопки: Ghost [Невидимость] и Dynamic [Динамика]. Активируйте кнопку Dynamic.

(thumbnail)
Рис. 2. Параметры объекта с точки зрения движка Blender.

Появившиеся параметры стоит рассмотреть повнимательнее (рис. 2). Поле Mass [Масса] никаких вопросов вызывать не должно, а вот Radius [Радиус] указывает на область чувствительности объекта (отсчитывается от его центра) к столкновениям. Дело в том, что по умолчанию Blender создает для каждого физического объекта сферу, которая и принимается в расчет при вычислениях коллизий. Платой за высокую скорость работы служит низкая точность вычислений. К счастью, редактор имеет еще несколько заготовок, в том числе и точный расчет коллизий по всем полигонам объекта. Выбрать подходящий режим можно, нажав кнопку Bounds [Границы]. Из выпадающего списка выберите Convex Hull Polytope [Выпуклый многоугольник].

Ради любопытства можете запустить игру и полюбоваться на падающий шар. Однако настройка его на этом не закончена. Для более реалистичного движения… стоп, у нас и самого движения пока что нет! Давайте исправим этот недочет.

Самые наблюдательные, наверное, уже заметили, что падение шара начинается сразу же с момента запуска программы. Нам же необходимо совершать это действие по нажатию определенной клавиши. Особенностью Blender Engine является то, что отследить момент запуска физики вручную не представляется возможным, поэтому прибегнем к некоторым ухищрениям.

Перенесите сферу в любой другой слой, нажав клавишу M и выбрав соответствующую ячейку. Обратите внимание на dummy-объект Emp_boul [главный слой]. Именно к нему мы привяжем наш код. Задача его очень простая – по нажатию клавиши Пробел создать объект boul, вследствие чего он должен появится на экране и… совершить падение (пока что без движения).

(thumbnail)
Рис. 3. Легкий способ визуализации копии объекта.

Выделите Emp_boul и создайте по одному кирпичику в каждой области кода. Для Sensors выберите пункт Keyboard и настройте его на реагирование на клавишу Пробел, точно так же, как вы делали это для стрелки чуть выше. В качестве Активатора у нас сейчас выступит кирпичик Edit Object [Правка объекта]. По умолчанию там уже активна функция Add Object [Добавить объект], осталось вписать название создаваемого объекта, т.е. boul, в поле OB: (Рис. 3). Соедините шашечки между группами и проверьте результат: на этот раз мы можем произвольно генерировать неисчислимое множество копий шара по нажатию пробела.

И вот теперь настало время придать нашему шарику движение. Для этого познакомимся с еще одним сенсором – Always. Его задача состоит в постоянной генерации импульса, и использовать его можно, скажем, для опроса состояния объекта. В нашем случае, мы настроим сферу на автоматическое движение вперед к кеглям, но работать это будет только после создания самого объекта кодом dummy.

Создайте, как обычно, стандартные кирпичики для сферы и соедините их между собой. Так как сфера работает с применением физического движка, то для перемещения ее по одной из осей необходимо использовать параметр Force кирпичика Motion. Поместите в первую ячейку значение -150 и отожмите кнопку справа, выбрав использование глобальных координат.

(thumbnail)
Рис. 4. Заставьте кегли чувствовать шарик.

Теперь при нажатии пробела шар послушно заскользит вперед. Для более естественного подобия движения необходимо заставить сферу вращаться при качении. Для этого всего лишь необходимо активировать кнопочку Rigid Body [Твердое тело] в окне Actor. Тем самым, включаются продвинутые возможности имитации физического движения – естественно, за счет дополнительной нагрузки на процессор. Вот только кегли у нас при этом никак не реагируют на столкновения. Исправить это можно, в свою очередь, подключив их к физическому движку. Для этого настройте каждую из кеглей в соответствии с рис. 4.

Ничего сложного, не правда ли? Всего за полчаса мы создали прототип работающей игры, пусть без текстуры, без меню, без системы подсчета и вывода результата, но это работает!

Персональные инструменты
купить
подписаться
Яндекс.Метрика