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

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

Материал из Linuxformat
(Различия между версиями)
Перейти к: навигация, поиск
(Новая: {{Цикл/Ни строчки кода}} == Не желаете ли меню? == : ''ЧАСТЬ 4 Здравствуйте, уважаемые телезрители! В эфире п...)
 
 
Строка 1: Строка 1:
 
{{Цикл/Ни строчки кода}}
 
{{Цикл/Ни строчки кода}}
 
== Не желаете ли меню? ==
 
== Не желаете ли меню? ==
: ''ЧАСТЬ 4 Здравствуйте, уважаемые телезрители! В эфире программа «Смак» с Андреем... простите, рубрика «Игрострой» с Андреем Праховым. И сегодня мы займемся игровым меню.''
+
: ''ЧАСТЬ 4 Здравствуйте, уважаемые телезрители! В эфире программа «Смак» с Андреем... простите, рубрика «Игрострой» с '''Андреем Праховым'''. И сегодня мы займемся игровым меню.''
  
Вот мы и вышли на финишную пря-
+
Вот мы и вышли на финишную прямую – осталось доделать совсем
мую – осталось доделать совсем
+
 
чуть-чуть, и наша игра будет готова
 
чуть-чуть, и наша игра будет готова
 
увидеть белый свет. Давайте приступим к
 
увидеть белый свет. Давайте приступим к
 
созданию игрового меню. Как вы, наверное,
 
созданию игрового меню. Как вы, наверное,
помните, в концепт-плане программы глав-
+
помните, в концепт-плане программы главное и единственное меню игры состояло
ное и единственное меню игры состояло
+
 
всего из двух элементов: Start и End game.
 
всего из двух элементов: Start и End game.
 
Пунктов, конечно, чертовски мало, и они
 
Пунктов, конечно, чертовски мало, и они
не
+
не отражают всего того, что хотелось бы
отражают всего того, что хотелось бы
+
видеть, однако для понятия самой идеи реализации их вполне хватит.
видеть, однако для понятия самой идеи реа-
+
лизации их вполне хватит.
+
  
Прежде чем начать кодирование, необ-
+
Прежде чем начать кодирование, необходимо разобраться, как мы планируем
ходимо разобраться, как мы планируем
+
выводить меню на экран. Имеется два варианта. Первый – выделить область на игровом пространстве и добавить туда еще одну
выводить меню на экран. Имеется два вари-
+
анта. Первый – выделить область на игро-
+
вом пространстве и добавить туда еще одну
+
 
камеру, а далее, в нужный момент, просто
 
камеру, а далее, в нужный момент, просто
переключаться с игровой камеры на добавочную. Второй вариант – воспользоваться тем, что Blender уме-
+
переключаться с игровой камеры на добавочную. Второй вариант – воспользоваться тем, что Blender умеет создавать различные сцены и работать с ними. Что это такое?
ет создавать различные сцены и работать с ними. Что это такое?
+
Вкратце можно объяснить так: в пределах одного проекта возможно существование подпроектов с уникальными свойствами, но
Вкратце можно объяснить так: в пределах одного проекта воз-
+
можно существование подпроектов с уникальными свойствами, но
+
 
общими глобальными настройками. Если смотреть на это сквозь
 
общими глобальными настройками. Если смотреть на это сквозь
призму игростроя, то концепция сцен позволяет реализовать меха-
+
призму игростроя, то концепция сцен позволяет реализовать механизм игровых уровней. А чем меню не игровой уровень?
низм игровых уровней. А чем меню не игровой уровень?
+
  
 
[[Изображение:LXF107 95 1.png|center|frame|Рис. 1. Концепция сцен позволяет по максимуму использовать пространство и создавать уровни.]]
 
[[Изображение:LXF107 95 1.png|center|frame|Рис. 1. Концепция сцен позволяет по максимуму использовать пространство и создавать уровни.]]
  
Чтобы создать новую сцену, необходимо выбрать соответству-
+
Чтобы создать новую сцену, необходимо выбрать соответствующий пункт из выпадающего меню вверху программы (рис. 1).
ющий пункт из выпадающего меню вверху программы (рис. 1).
+
 
Естественно, там же вы можете переключаться с одной сцены на
 
Естественно, там же вы можете переключаться с одной сцены на
 
другую. Но запомните, что при генерации двоичного файла игры
 
другую. Но запомните, что при генерации двоичного файла игры
активная в текущий момент сцена считается главной и запускает-
+
активная в текущий момент сцена считается главной и запускается первой.
ся первой.
+
  
 
При добавлении сцены вам будет предложено несколько вариантов ее создания:
 
При добавлении сцены вам будет предложено несколько вариантов ее создания:
Строка 46: Строка 34:
 
* Full Copy [Полная копия] – создается независимая копия текущей сцены.
 
* Full Copy [Полная копия] – создается независимая копия текущей сцены.
  
В нашем случае оптимальным вариантом является пустая сце-
+
В нашем случае оптимальным вариантом является пустая сцена. Для нормального функционирования движка необходимо создать хотя бы одну камеру и один источник света. Как это сделать,
на. Для нормального функционирования движка необходимо соз-
+
дать хотя бы одну камеру и один источник света. Как это сделать,
+
 
описывалось в предыдущих уроках по Blender. Поэтому не будем
 
описывалось в предыдущих уроках по Blender. Поэтому не будем
 
отвлекаться, а займемся созданием основы нашего меню. Итак,
 
отвлекаться, а займемся созданием основы нашего меню. Итак,
добавьте камеру, свет и примитив Plane. Расположите их пример-
+
добавьте камеру, свет и примитив Plane. Расположите их примерно так, как показано на рис. 2. Источник, для лучшего освещения,
но так, как показано на рис. 2. Источник, для лучшего освещения,
+
желательно поместить вблизи от камеры. Впрочем, это несущественно, и вы сами сможете отрегулировать его интенсивность и
желательно поместить вблизи от камеры. Впрочем, это несуще-
+
ственно, и вы сами сможете отрегулировать его интенсивность и
+
 
местоположение. Теперь необходимо расположить примитив так,
 
местоположение. Теперь необходимо расположить примитив так,
 
чтобы он занимал всю активную область, отмеченную в проекции
 
чтобы он занимал всю активную область, отмеченную в проекции
камеры пунктирными линиями. Запустите движок и удостоверь-
+
камеры пунктирными линиями. Запустите движок и удостоверьтесь, что цвет примитива закрасил всю видимую область игрового
тесь, что цвет примитива закрасил всю видимую область игрового
+
 
пространства.
 
пространства.
 +
 +
[[Изображение:LXF107 96 1.jpg|center|frame|Рис. 2. Что ж, бывают и лежачие меню.]]
  
 
Чтобы наше меню выглядело не столь уж унылым, я создал
 
Чтобы наше меню выглядело не столь уж унылым, я создал
 
простой фон (mainmenu.tga), который вы сможете найти в каталоге
 
простой фон (mainmenu.tga), который вы сможете найти в каталоге
textures файлов этого урока, расположенных на LXFDVD. Для раз-
+
textures файлов этого урока, расположенных на LXFDVD. Для размещения его на плоскости воспользуйтесь режимом Face Select и
мещения его на плоскости воспользуйтесь режимом Face Select и
+
 
редактором UVEditor. Более подробно о работе с текстурами в BGE
 
редактором UVEditor. Более подробно о работе с текстурами в BGE
рассказывалось в LXF105.
+
рассказывалось в [[LXF105:Ни строчки кода!|LXF105]].
Вот теперь заготовка для меню почти готова, но стоп... отсут-
+
 
ствует самое главное – текст.
+
Вот теперь заготовка для меню почти готова, но стоп... отсутствует самое главное – текст.
  
 
=== Да будет текст! ===
 
=== Да будет текст! ===
Строка 77: Строка 61:
 
статичным содержимым можно использовать стандартный способ
 
статичным содержимым можно использовать стандартный способ
 
работы с титрами Blender.
 
работы с титрами Blender.
 +
 
Создайте заготовку, выбрав из меню, вызываемого по клавише
 
Создайте заготовку, выбрав из меню, вызываемого по клавише
 
Пробел, функцию Text. На экране должна появится строка Text,
 
Пробел, функцию Text. На экране должна появится строка Text,
Строка 83: Строка 68:
 
необходимые для работы (рис. 3). Возможности, предлагаемые
 
необходимые для работы (рис. 3). Возможности, предлагаемые
 
программой, достаточно широки для комфортной правки текста.
 
программой, достаточно широки для комфортной правки текста.
Вы можете выбрать подходящий шрифт, воспользовавшись кла-
+
 
вишей Load, загрузить сторонний текст из файла командой Insert
+
[[Изображение:LXF107 96 2.png|center|frame|Рис. 3. Встроенный текстовый редактор позволяет максимально удобно работать с текстовой заготовкой.]]
 +
 
 +
{{Врезка
 +
|Заголовок=Скорая помощь
 +
|Содержание=После конвертирования текста
 +
в mesh вполне
 +
могут появиться артефакты,
 +
искажающие прорисовку полученного объекта. Это
 +
связанно с неправильными расчетами нормалей.
 +
Исправить ситуацию можно либо
 +
пересчитав нормали командой
 +
Mesh > Normals >
 +
Recalculate, либо
 +
просто перевернув их командой
 +
Mesh > Normals >
 +
Flip. Естественно,
 +
подобные манипуляции должны проводиться в режиме
 +
редактирования.
 +
|Ширина=200px}}
 +
Вы можете выбрать подходящий шрифт, воспользовавшись клавишей Load, загрузить сторонний текст из файла командой Insert
 
text, форматировать начинку, как вам заблагорассудится, и многое
 
text, форматировать начинку, как вам заблагорассудится, и многое
 
другое. Но запомните следующий момент: все манипуляции с текстом
 
другое. Но запомните следующий момент: все манипуляции с текстом
 
можно проводить только в режиме редактирования. Однако, если вы
 
можно проводить только в режиме редактирования. Однако, если вы
попробуете запустить игровой движок, то на экране вас встретит кро-
+
попробуете запустить игровой движок, то на экране вас встретит кромешная пустота. Дело в том, что GE не умеет работать с тем форматом, в котором в данный момент хранится наш текст. Единственный
мешная пустота. Дело в том, что GE не умеет работать с тем форма-
+
том, в котором в данный момент хранится наш текст. Единственный
+
 
вариант – преобразовать его в обычный mesh. Естественно, в этом
 
вариант – преобразовать его в обычный mesh. Естественно, в этом
случае отредактировать текст будет уже невозможно. Для конвер-
+
случае отредактировать текст будет уже невозможно. Для конвертации выйдите из режима редактирования клавишей Tab и нажмите
тации выйдите из режима редактирования клавишей Tab и нажмите
+
 
Alt+C. Из предложенных пунктов меню выберите Mesh.
 
Alt+C. Из предложенных пунктов меню выберите Mesh.
 +
 
Полученные титры будут выглядеть гораздо эффективнее, если
 
Полученные титры будут выглядеть гораздо эффективнее, если
 
придать им объем. Обычная функция Extrude позволит достичь
 
придать им объем. Обычная функция Extrude позволит достичь
 
задуманного. Войдите в режим редактирования, затем выделите
 
задуманного. Войдите в режим редактирования, затем выделите
весь объект и нажмите клавишу E. Именно подобным образом сде-
+
весь объект и нажмите клавишу E. Именно подобным образом сделаны титры в меню демонстрационной версии игры.
ланы титры в меню демонстрационной версии игры.
+
 
 
Второй вариант использования текста завязан исключительно
 
Второй вариант использования текста завязан исключительно
 
на игровой движок. В качестве исходного шрифта используется
 
на игровой движок. В качестве исходного шрифта используется
 
обычный файл .tga, содержащий все необходимые изображения
 
обычный файл .tga, содержащий все необходимые изображения
букв. Пример такого файла – font.tga – вы опять же сможете най-
+
букв. Пример такого файла – font.tga – вы опять же сможете найти в подкаталоге textures файлов этого урока. Подобный подход
ти в подкаталоге textures файлов этого урока. Подобный подход
+
 
используют многие игровые движки, так что сложностей с поиском
 
используют многие игровые движки, так что сложностей с поиском
 
подходящего шрифта у вас возникнуть не должно. Как говорится,
 
подходящего шрифта у вас возникнуть не должно. Как говорится,
 
Google вам в помощь!
 
Google вам в помощь!
 +
 
После проведения необходимых манипуляций (см. врезку
 
После проведения необходимых манипуляций (см. врезку
Создаем текст в стиле BGE) необходимо создать текстовую пере-
+
Создаем текст в стиле BGE) необходимо создать текстовую переменную с именем Text (именно так и не иначе!), а в качестве ее
менную с именем Text (именно так и не иначе!), а в качестве ее
+
 
содержания впечатать желаемый текст. Естественно, используя
 
содержания впечатать желаемый текст. Естественно, используя
 
логические блоки работы с переменными, вы можете с легкостью,
 
логические блоки работы с переменными, вы можете с легкостью,
 
динамически, изменять это содержимое в процессе игры. Давайте
 
динамически, изменять это содержимое в процессе игры. Давайте
 
рассмотрим это на простом примере.
 
рассмотрим это на простом примере.
Итак, предположим, вы создали заготовку по приведенной схе-
+
 
ме. По нажатию клавиши Пробел текущее содержание необходимо
+
Итак, предположим, вы создали заготовку по приведенной схеме. По нажатию клавиши Пробел текущее содержание необходимо
 
изменить на фразу Start game. Для этого добавьте к объекту Plane
 
изменить на фразу Start game. Для этого добавьте к объекту Plane
 
логическую цепочку, состоящую из кирпичиков Keyboard > AND
 
логическую цепочку, состоящую из кирпичиков Keyboard > AND
Строка 125: Строка 126:
  
 
=== Реализация меню ===
 
=== Реализация меню ===
 +
<gallery perrow=2 align=right caption="Создаем текст в стиле BGE">
 +
Изображение:LXF107 97 1.png|Основой для текста служит примитив Plane. Добавьте его стандартным образом: Add > Mesh > Plane.
 +
Изображение:LXF107 97 2.png|В режиме Face Select (клавиша F) необходимо расположить первый образ символа «@» так, чтобы он занял всю область примитива. Заметьте, что по умолчанию символ располагается в перевернутом состоянии. Этим можно воспользоваться, чтобы выводить текст, скажем, вертикально. Однако для правильного горизонтального отображения необходимо развернуть область выделения в Image Editor так, чтобы символ «@» располагался точно так же, как в файле font.tga.
 +
Изображение:LXF107 97 3.png|Следующим шагом необходимо указать GE, что данный примитив является основой для вывода текста. Войдите в режим Face Select и активируйте пункты Text и Alpha Blend Mode в меню Face > Active Draw Mode. Последний заставляет программу выводить буквы с использованием альфа-канала (т.е. с прозрачным фоном).
 +
Изображение:LXF107 97 4.png|Последний штрих – настройка переменной String для базового объекта. Имя переменной должно быть «Text». Таким образом мы указываем программе, что значение данной переменной следует вывести на экран. В поле значения переменной введите необходимое содержание. Теперь смело нажимайте клавишу P для запуска игрового движка и наслаждайтесь результатом!
 +
</gallery>
 +
 
На данном этапе у вас уже должна быть заготовка, состоящая
 
На данном этапе у вас уже должна быть заготовка, состоящая
 
из новой сцены с текстурированным объектом Plane, текстом и
 
из новой сцены с текстурированным объектом Plane, текстом и
настроенной камерой. Надеюсь, вы уже дали значащие имена име-
+
настроенной камерой. Надеюсь, вы уже дали значащие имена имеющимся сценам? Если нет, то сделайте это, так как в дальнейшем
ющимся сценам? Если нет, то сделайте это, так как в дальнейшем
+
нам придется как-то обращаться к ним! В нашем примере они обозначены как сцены game и mainmenu, соответственно.
нам придется как-то обращаться к ним! В нашем примере они обо-
+
значены как сцены game и mainmenu, соответственно.
+
  
 
В качестве указателя мы будем использовать обычную сферу.
 
В качестве указателя мы будем использовать обычную сферу.
Расположите ее между основой и камерой так, чтобы она по умол-
+
Расположите ее между основой и камерой так, чтобы она по умолчанию указывала на первый пункт меню.
чанию указывала на первый пункт меню.
+
 
 
Рассмотрим логику работы. Для перемещения курсора будем
 
Рассмотрим логику работы. Для перемещения курсора будем
 
использовать однокадровую ключевую анимацию, настроенную
 
использовать однокадровую ключевую анимацию, настроенную
таким образом, чтобы в начальном кадре сфера указывала на пер-
+
таким образом, чтобы в начальном кадре сфера указывала на первый пункт меню, а в следующем – на второй (подробно о ключевой
вый пункт меню, а в следующем – на второй (подробно о ключевой
+
анимации рассказывалось в статьях серии «Blender для начинающих», публиковавшихся в [[LXF87-88:Blender|LXF87/88]]-[[LXF91:Blender|LXF91]]). Управлять анимацией можно посредством активатора Ipo, а именно – его подфункции
анимации рассказывалось в статьях серии «Blender для начинающих», публиковавшихся в [[LXF87-88:Blender|LXF87/88]]-[[LXF91:Blender|LXF91]]). Управлять анимаци-
+
Property. Весь смысл заключается в том, что изменяя значение числовой переменной с 1 до 2, мы указываем программе, какой кадр
ей можно посредством активатора Ipo, а именно – его подфункции
+
Property. Весь смысл заключается в том, что изменяя значение чис-
+
ловой переменной с 1 до 2, мы указываем программе, какой кадр
+
 
является активным.
 
является активным.
 +
 
Для более точного понимания работы логики воспользуемся
 
Для более точного понимания работы логики воспользуемся
 
псевдокодом:
 
псевдокодом:
//Пусть указателю присвоена переменная Integer с названием Count,
+
<pre>//Пусть указателю присвоена переменная Integer с названием Count, тогда
тогда
+
 
Sphera.Count = 1 // активен первый пункт меню
 
Sphera.Count = 1 // активен первый пункт меню
 
ЕСЛИ нажата клавиша «Down» ТО
 
ЕСЛИ нажата клавиша «Down» ТО
Строка 156: Строка 159:
 
выполнить анимацию
 
выполнить анимацию
 
ЕСЛИ нажата клавиша «Enter» AND Sphera.Count ==1 ТО запуск игры
 
ЕСЛИ нажата клавиша «Enter» AND Sphera.Count ==1 ТО запуск игры
ЕСЛИ нажата клавиша «Enter» AND Sphera.Count ==2 ТО выход из
+
ЕСЛИ нажата клавиша «Enter» AND Sphera.Count ==2 ТО выход из игры</pre>
игры
+
 
Реализация проверки курсорных клавиш и действий по ним не
 
Реализация проверки курсорных клавиш и действий по ним не
должна представлять для вас особенных сложностей. Для настрой-
+
должна представлять для вас особенных сложностей. Для настройки Ipo-активатора необходимо выбрать подфункцию Property и
ки Ipo-активатора необходимо выбрать подфункцию Property и
+
 
указать в качестве переменной Count. Естественно, этот кирпичик
 
указать в качестве переменной Count. Естественно, этот кирпичик
должен быть подсоединен к обоим логическим цепочкам, прове-
+
должен быть подсоединен к обоим логическим цепочкам, проверяющим курсорные клавиши.
ряющим курсорные клавиши.
+
 
 
Куда интереснее обстоит дело с проверкой нажатия на Enter.
 
Куда интереснее обстоит дело с проверкой нажатия на Enter.
 
Нам необходимо проверить условие равенства переменной Count
 
Нам необходимо проверить условие равенства переменной Count
 
значениям 1 и 2. Для этого создайте еще две логические цепочки:
 
значениям 1 и 2. Для этого создайте еще две логические цепочки:
 
Keyboard > AND > Scene и Keyboard > AND > Game, но так, чтобы
 
Keyboard > AND > Scene и Keyboard > AND > Game, но так, чтобы
сенсор Keyboard являлся общим для обоих цепочек. Измените кон-
+
сенсор Keyboard являлся общим для обоих цепочек. Измените контроллер AND на Expression [Выражение] и для каждого, соответственно, введите строки count == 1 и count == 2. Для активаторов,
троллер AND на Expression [Выражение] и для каждого, соответ-
+
ственно, введите строки count == 1 и count == 2. Для активаторов,
+
 
в случае c кирпичиком Scene, выберите подфункцию Set Scene
 
в случае c кирпичиком Scene, выберите подфункцию Set Scene
 
[Установить сцену] и в поле SCE: укажите название сцены с самой
 
[Установить сцену] и в поле SCE: укажите название сцены с самой
Строка 176: Строка 175:
 
выбрать пункт Quit this game [Выйти из игры] (рис. 4).
 
выбрать пункт Quit this game [Выйти из игры] (рис. 4).
  
ной сцене игры: это должно приводить к выходу обратно в меню.
+
[[Изображение:LXF107 96 5.png|center|frame|Рис. 4. Немного запутанно, но работает!]]
 +
 
 +
Осталось только добавить проверку нажатия на Escape в главной сцене игры: это должно приводить к выходу обратно в меню.
 
Думаю, здесь вы справитесь и сами, так что цикл уроков по BGE
 
Думаю, здесь вы справитесь и сами, так что цикл уроков по BGE
на этом завершается. И хотя созданная нами игра не отличает-
+
на этом завершается. И хотя созданная нами игра не отличается каким-то изыском и крутизной – рассматривайте ее как плацдарм для более продвинутых проектов. Впрочем, если добавить к ней визуальные эффекты, поработать над оптимизацией и самим
ся каким-то изыском и крутизной – рассматривайте ее как плац-
+
дарм для более продвинутых проектов. Впрочем, если добавить к
+
ней визуальные эффекты, поработать над оптимизацией и самим
+
 
игровым концептом, может получится интересная игрушка. Так что
 
игровым концептом, может получится интересная игрушка. Так что
 
дерзайте!
 
дерзайте!

Текущая версия на 18:23, 19 апреля 2009


[править] Не желаете ли меню?

ЧАСТЬ 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 на этом завершается. И хотя созданная нами игра не отличается каким-то изыском и крутизной – рассматривайте ее как плацдарм для более продвинутых проектов. Впрочем, если добавить к ней визуальные эффекты, поработать над оптимизацией и самим игровым концептом, может получится интересная игрушка. Так что дерзайте!

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