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

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

Материал из Linuxformat
Перейти к: навигация, поиск


Не желаете ли меню?

ЧАСТЬ 4 Здравствуйте, уважаемые телезрители! В эфире программа «Смак» с Андреем... простите, рубрика «Игрострой» с Андреем Праховым. И сегодня мы займемся игровым меню.

Вот мы и вышли на финишную прямую – осталось доделать совсем чуть-чуть, и наша игра будет готова увидеть белый свет. Давайте приступим к созданию игрового меню. Как вы, наверное, помните, в концепт-плане программы главное и единственное меню игры состояло всего из двух элементов: Start и End game. Пунктов, конечно, чертовски мало, и они не отражают всего того, что хотелось бы видеть, однако для понятия самой идеи реализации их вполне хватит.

Прежде чем начать кодирование, необходимо разобраться, как мы планируем выводить меню на экран. Имеется два варианта. Первый – выделить область на игровом пространстве и добавить туда еще одну камеру, а далее, в нужный момент, просто переключаться с игровой камеры на добавочную. Второй вариант – воспользоваться тем, что Blender умеет создавать различные сцены и работать с ними. Что это такое? Вкратце можно объяснить так: в пределах одного проекта возможно существование подпроектов с уникальными свойствами, но общими глобальными настройками. Если смотреть на это сквозь призму игростроя, то концепция сцен позволяет реализовать механизм игровых уровней. А чем меню не игровой уровень?

(thumbnail)
Рис. 1. Концепция сцен позволяет по максимуму использовать пространство и создавать уровни.

Чтобы создать новую сцену, необходимо выбрать соответствующий пункт из выпадающего меню вверху программы (рис. 1). Естественно, там же вы можете переключаться с одной сцены на другую. Но запомните, что при генерации двоичного файла игры активная в текущий момент сцена считается главной и запускается первой.

При добавлении сцены вам будет предложено несколько вариантов ее создания:

  • Empty [Пустая] – равноценно сбросу Blender для нового проекта;
  • Link Objects [Присоединить объекты] – содержание копируется, однако изменения в одной сцене отражаются и в других, созданных таким способом;
  • Link ObData [Присоединить данные объектов] – в отличие от Link Objects, вы можете перемещать объекты, но изменения самих mesh’ей или материалов отразится во всех сценах;
  • Full Copy [Полная копия] – создается независимая копия текущей сцены.

В нашем случае оптимальным вариантом является пустая сцена. Для нормального функционирования движка необходимо создать хотя бы одну камеру и один источник света. Как это сделать, описывалось в предыдущих уроках по Blender. Поэтому не будем отвлекаться, а займемся созданием основы нашего меню. Итак, добавьте камеру, свет и примитив Plane. Расположите их примерно так, как показано на рис. 2. Источник, для лучшего освещения, желательно поместить вблизи от камеры. Впрочем, это несущественно, и вы сами сможете отрегулировать его интенсивность и местоположение. Теперь необходимо расположить примитив так, чтобы он занимал всю активную область, отмеченную в проекции камеры пунктирными линиями. Запустите движок и удостоверьтесь, что цвет примитива закрасил всю видимую область игрового пространства.

(thumbnail)
Рис. 2. Что ж, бывают и лежачие меню.

Чтобы наше меню выглядело не столь уж унылым, я создал простой фон (mainmenu.tga), который вы сможете найти в каталоге textures файлов этого урока, расположенных на LXFDVD. Для размещения его на плоскости воспользуйтесь режимом Face Select и редактором UVEditor. Более подробно о работе с текстурами в BGE рассказывалось в LXF105.

Вот теперь заготовка для меню почти готова, но стоп... отсутствует самое главное – текст.

Да будет текст!

Спешу обрадовать любителей трудностей: работа с текстом в Blender, а тем более в GE, изобилует непонятными моментами. Да и литературу по этой части отыскать весьма сложно. Опять-таки имеется несколько вариантов. Например, для меню и контента со статичным содержимым можно использовать стандартный способ работы с титрами Blender.

Создайте заготовку, выбрав из меню, вызываемого по клавише Пробел, функцию Text. На экране должна появится строка Text, сигнализирующая о запуске встроенного текстового редактора. Одновременно на панели управления откроются инструменты, необходимые для работы (рис. 3). Возможности, предлагаемые программой, достаточно широки для комфортной правки текста.

(thumbnail)
Рис. 3. Встроенный текстовый редактор позволяет максимально удобно работать с текстовой заготовкой.


Вы можете выбрать подходящий шрифт, воспользовавшись клавишей Load, загрузить сторонний текст из файла командой Insert text, форматировать начинку, как вам заблагорассудится, и многое другое. Но запомните следующий момент: все манипуляции с текстом можно проводить только в режиме редактирования. Однако, если вы попробуете запустить игровой движок, то на экране вас встретит кромешная пустота. Дело в том, что GE не умеет работать с тем форматом, в котором в данный момент хранится наш текст. Единственный вариант – преобразовать его в обычный mesh. Естественно, в этом случае отредактировать текст будет уже невозможно. Для конвертации выйдите из режима редактирования клавишей Tab и нажмите Alt+C. Из предложенных пунктов меню выберите Mesh.

Полученные титры будут выглядеть гораздо эффективнее, если придать им объем. Обычная функция Extrude позволит достичь задуманного. Войдите в режим редактирования, затем выделите весь объект и нажмите клавишу E. Именно подобным образом сделаны титры в меню демонстрационной версии игры.

Второй вариант использования текста завязан исключительно на игровой движок. В качестве исходного шрифта используется обычный файл .tga, содержащий все необходимые изображения букв. Пример такого файла – font.tga – вы опять же сможете найти в подкаталоге textures файлов этого урока. Подобный подход используют многие игровые движки, так что сложностей с поиском подходящего шрифта у вас возникнуть не должно. Как говорится, Google вам в помощь!

После проведения необходимых манипуляций (см. врезку Создаем текст в стиле BGE) необходимо создать текстовую переменную с именем Text (именно так и не иначе!), а в качестве ее содержания впечатать желаемый текст. Естественно, используя логические блоки работы с переменными, вы можете с легкостью, динамически, изменять это содержимое в процессе игры. Давайте рассмотрим это на простом примере.

Итак, предположим, вы создали заготовку по приведенной схеме. По нажатию клавиши Пробел текущее содержание необходимо изменить на фразу Start game. Для этого добавьте к объекту Plane логическую цепочку, состоящую из кирпичиков Keyboard > AND > Property. Как настраивать сенсор клавиатуры, говорилось уже не раз, а сама реализация заключается в подстановке в свойстве Assign названия переменной и необходимого значения. В нашем случае это будут: prop: Text и Value: Start game. Вот и все!

Реализация меню

На данном этапе у вас уже должна быть заготовка, состоящая из новой сцены с текстурированным объектом Plane, текстом и настроенной камерой. Надеюсь, вы уже дали значащие имена имеющимся сценам? Если нет, то сделайте это, так как в дальнейшем нам придется как-то обращаться к ним! В нашем примере они обозначены как сцены game и mainmenu, соответственно.

В качестве указателя мы будем использовать обычную сферу. Расположите ее между основой и камерой так, чтобы она по умолчанию указывала на первый пункт меню.

Рассмотрим логику работы. Для перемещения курсора будем использовать однокадровую ключевую анимацию, настроенную таким образом, чтобы в начальном кадре сфера указывала на первый пункт меню, а в следующем – на второй (подробно о ключевой анимации рассказывалось в статьях серии «Blender для начинающих», публиковавшихся в LXF87/88-LXF91). Управлять анимацией можно посредством активатора Ipo, а именно – его подфункции Property. Весь смысл заключается в том, что изменяя значение числовой переменной с 1 до 2, мы указываем программе, какой кадр является активным.

Для более точного понимания работы логики воспользуемся псевдокодом:

//Пусть указателю присвоена переменная Integer с названием Count, тогда
Sphera.Count = 1 // активен первый пункт меню
ЕСЛИ нажата клавиша «Down» ТО
Sphera.Count = 2
выполнить анимацию
ЕСЛИ нажата клавиша «Up» ТО
Sphera.Count = 1
выполнить анимацию
ЕСЛИ нажата клавиша «Enter» AND Sphera.Count ==1 ТО запуск игры
ЕСЛИ нажата клавиша «Enter» AND Sphera.Count ==2 ТО выход из игры

Реализация проверки курсорных клавиш и действий по ним не должна представлять для вас особенных сложностей. Для настройки Ipo-активатора необходимо выбрать подфункцию Property и указать в качестве переменной Count. Естественно, этот кирпичик должен быть подсоединен к обоим логическим цепочкам, проверяющим курсорные клавиши.

Куда интереснее обстоит дело с проверкой нажатия на Enter. Нам необходимо проверить условие равенства переменной Count значениям 1 и 2. Для этого создайте еще две логические цепочки: Keyboard > AND > Scene и Keyboard > AND > Game, но так, чтобы сенсор Keyboard являлся общим для обоих цепочек. Измените контроллер AND на Expression [Выражение] и для каждого, соответственно, введите строки count == 1 и count == 2. Для активаторов, в случае c кирпичиком Scene, выберите подфункцию Set Scene [Установить сцену] и в поле SCE: укажите название сцены с самой игрой (у меня SCE: game), а вот для кирпичика Game необходимо выбрать пункт Quit this game [Выйти из игры] (рис. 4).

(thumbnail)
Рис. 4. Немного запутанно, но работает!

Осталось только добавить проверку нажатия на Escape в главной сцене игры: это должно приводить к выходу обратно в меню. Думаю, здесь вы справитесь и сами, так что цикл уроков по BGE на этом завершается. И хотя созданная нами игра не отличается каким-то изыском и крутизной – рассматривайте ее как плацдарм для более продвинутых проектов. Впрочем, если добавить к ней визуальные эффекты, поработать над оптимизацией и самим игровым концептом, может получится интересная игрушка. Так что дерзайте!

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