<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="http://wiki2.linuxformat.ru/skins/common/feed.css?97"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki2.linuxformat.ru/index.php?action=history&amp;feed=atom&amp;title=LXF100-101%3A%D0%9D%D0%B8_%D1%81%D1%82%D1%80%D0%BE%D1%87%D0%BA%D0%B8_%D0%BA%D0%BE%D0%B4%D0%B0%21</id>
		<title>LXF100-101:Ни строчки кода! - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki2.linuxformat.ru/index.php?action=history&amp;feed=atom&amp;title=LXF100-101%3A%D0%9D%D0%B8_%D1%81%D1%82%D1%80%D0%BE%D1%87%D0%BA%D0%B8_%D0%BA%D0%BE%D0%B4%D0%B0%21"/>
		<link rel="alternate" type="text/html" href="http://wiki2.linuxformat.ru/index.php?title=LXF100-101:%D0%9D%D0%B8_%D1%81%D1%82%D1%80%D0%BE%D1%87%D0%BA%D0%B8_%D0%BA%D0%BE%D0%B4%D0%B0%21&amp;action=history"/>
		<updated>2026-05-13T21:32:13Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.11.1</generator>

	<entry>
		<id>http://wiki2.linuxformat.ru/index.php?title=LXF100-101:%D0%9D%D0%B8_%D1%81%D1%82%D1%80%D0%BE%D1%87%D0%BA%D0%B8_%D0%BA%D0%BE%D0%B4%D0%B0%21&amp;diff=7288&amp;oldid=prev</id>
		<title>Yaleks: Новая: {{Цикл/Ни строчки кода}} == Ни строчки кода! == : ''ЧАСТЬ 1 Наслышаны о том, что создание игр – это тяжелый тр...</title>
		<link rel="alternate" type="text/html" href="http://wiki2.linuxformat.ru/index.php?title=LXF100-101:%D0%9D%D0%B8_%D1%81%D1%82%D1%80%D0%BE%D1%87%D0%BA%D0%B8_%D0%BA%D0%BE%D0%B4%D0%B0%21&amp;diff=7288&amp;oldid=prev"/>
				<updated>2009-03-15T14:08:53Z</updated>
		
		<summary type="html">&lt;p&gt;Новая: {{Цикл/Ни строчки кода}} == Ни строчки кода! == : ''ЧАСТЬ 1 Наслышаны о том, что создание игр – это тяжелый тр...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая статья&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Цикл/Ни строчки кода}}&lt;br /&gt;
== Ни строчки кода! ==&lt;br /&gt;
: ''ЧАСТЬ 1 Наслышаны о том, что создание игр – это тяжелый труд? Так оно и есть – но виртуоз Blender '''Андрей Прахов''' знает обходной путь!''&lt;br /&gt;
&lt;br /&gt;
Большинство поклонников открытых систем&lt;br /&gt;
хорошо знакомы с прекрасной программой для&lt;br /&gt;
3D-моделирования и анимации – Blender (http://www.blender3d.org). Но мало кто знает, что Blender – это&lt;br /&gt;
еще и игровой конструктор со встроенным движком.&lt;br /&gt;
Обладая мощными возможностями по моделированию в&lt;br /&gt;
совокупности со средой программирования игр, Blender&lt;br /&gt;
позволяет создавать вполне современные по визуальным возможностям приложения. Помимо графической&lt;br /&gt;
составляющей, редактор предоставляет разработчику&lt;br /&gt;
возможность программирования на высокоуровневом&lt;br /&gt;
языке – Python, интеграцию с физическими библиотеками Bullet и Sumo, создание двоичного файла для&lt;br /&gt;
разных операционных систем, а также режим непосредственного кодирования процесса «одной мышью».&lt;br /&gt;
Заинтересовались?&lt;br /&gt;
&lt;br /&gt;
На протяжении четырех уроков мы с вами пройдем&lt;br /&gt;
все этапы разработки игры, не прибегая к программированию в полном смысле этого слова. Оказывается,&lt;br /&gt;
вполне возможно создать нечто работающее и в режиме&lt;br /&gt;
«выдели и щелкни». Конечно, в серьезных, масштабных&lt;br /&gt;
проектах без знания Python и его реализации в Blender&lt;br /&gt;
не обойтись, но мы оставим эту тему для будущих уроков профессиональной серии.&lt;br /&gt;
&lt;br /&gt;
Прежде чем приступить к непосредственному рассмотрению темы урока, советую положить рядом с&lt;br /&gt;
собой подшивку номеров [[LXF87-88:Blender|LXF87/88]]-[[LXF91:Blender|LXF91]], где рассматривались основы работы с&lt;br /&gt;
Blender и установить последнюю версию программы&lt;br /&gt;
(на момент написания статьи это 2.45). Можно, конечно, использовать и более старые сборки, однако велика&lt;br /&gt;
вероятность, что некоторые интерфейсные элементы&lt;br /&gt;
конструктора не будут совпадать. Уж очень любят разработчики тасовать данные элементы от версии к версии, как карты в колоде! Кроме того, последняя версия&lt;br /&gt;
Blender отличается завидным быстродействием получаемых в итоге исполняемых файлов с игрой.&lt;br /&gt;
&lt;br /&gt;
В первом выпуске «Игростроя» я говорил о пользе&lt;br /&gt;
и, мало того, о необходимости разработки дизайн-документа для каждого проекта. К счастью, наша игра предполагает быть достаточно простой, поэтому ограничусь&lt;br /&gt;
перечислением задач и особенностей проекта – этакий&lt;br /&gt;
примитивный концепт-план.&lt;br /&gt;
&lt;br /&gt;
Проект, над которым мы с вами будем работать,&lt;br /&gt;
является простым имитатором игры в боулинг. Ради&lt;br /&gt;
упрощения, правила игры будут изменены:&lt;br /&gt;
# Количество кеглей осталось без изменения, т.е. 10 штук;&lt;br /&gt;
# Количество попыток бросания шара ограничено тремя;&lt;br /&gt;
# Игра имеет начальное меню с двумя пунктами: «start», «end game»;&lt;br /&gt;
# Управление в игре: курсорные клавиши – передвижение указателя направления броска; Пробел – бросок; Esc – выход в меню;&lt;br /&gt;
# Перемещение указателя возможно вправо и влево, сила броска – постоянная;&lt;br /&gt;
# Визуальный интерфейс игры включает в себя отображение всех кеглей, которые исчезают при попадании, и трех шаров, демонстрирующих количество имеющихся у игрока попыток;&lt;br /&gt;
# При выигрыше или проигрыше выводится соответствующая надпись, и по нажатию «any key» происходит возврат в меню.&lt;br /&gt;
Вот и все. Просто? Просто, увы, только на бумаге.&lt;br /&gt;
На протяжении всей серии мы с вами познакомимся с&lt;br /&gt;
построением игровой логики, реализацией физических законов, правилами игрового текстурирования, с&lt;br /&gt;
некоторыми интересными визуальными эффектами.&lt;br /&gt;
Приступим к делу!&lt;br /&gt;
&lt;br /&gt;
=== Расставляем кегли ===&lt;br /&gt;
Откройте файл lesson1_begin – его можно найти в&lt;br /&gt;
разделе Журнал/Blender на LXFDVD. Полюбуйтесь&lt;br /&gt;
появившейся картинкой… и переходите к теории.&lt;br /&gt;
&lt;br /&gt;
Основы визуального программирования заложены&lt;br /&gt;
в так называемых логических кирпичиках, которые&lt;br /&gt;
вы сможете увидеть, если нажмете F4. Специфику&lt;br /&gt;
работы можно легко понять, проведя аналогию с&lt;br /&gt;
живым организмом. Существует некий раздражитель&lt;br /&gt;
на который реагируют наши органы чувств, затем идет&lt;br /&gt;
анализирование полученной информации и подается&lt;br /&gt;
команда выполнить то или иное действие. В качестве «органов чувств» в Blender выступает закладка&lt;br /&gt;
Sensors [Сенсоры], решение принимается логическим&lt;br /&gt;
блоком Controllers [Контроллеры], а само выполнение лежит на Активаторах [Actuators]. После выбора&lt;br /&gt;
нужных кирпичиков (это можно сделать, нажав кнопку Add в каждой закладке) и настройки параметров,&lt;br /&gt;
необходимо соединить их между собой. Возле каждого кирпичика находится маленькая шашечка. Просто&lt;br /&gt;
ухватитесь за нее и тяните появившуюся линию к следующему объекту. Удалить соединение можно, указав&lt;br /&gt;
курсором на нужную линию (при этом она должна&lt;br /&gt;
выделиться другим цветом) и затем нажав клавишу&lt;br /&gt;
x. Естественно, любой объект в Blender может иметь&lt;br /&gt;
свою логическую цепочку.&lt;br /&gt;
&lt;br /&gt;
Возвращаемся к уже, надеюсь, открытому проекту. Как было сказано чуть выше, именно стрелка в&lt;br /&gt;
игре указывает направление производимого броска,&lt;br /&gt;
а управление осуществляется с помощью соответствующих курсорных клавиш. Итак, выделите объект&lt;br /&gt;
arr (стрелка), нажмите F4, если вы еще не находитесь&lt;br /&gt;
в режиме Логика [Logic]. Появившееся окно можно условно разделить на четыре зоны (слева направо): управление физикой объекта и его переменными плюс три логических блока (sensors, controllers,&lt;br /&gt;
actuators). Пока нас не интересует самый первый блок,&lt;br /&gt;
физикой мы займемся чуть позже, а вот во всех оставшихся нажмите кнопку Add, тем самым создав для&lt;br /&gt;
каждой области по новому кирпичику.&lt;br /&gt;
&lt;br /&gt;
Обратите внимание на поля с надписями Always&lt;br /&gt;
[Всегда], And [И] и Motion [Движение]. Именно здесь&lt;br /&gt;
вы можете указать конкретную функцию текущего&lt;br /&gt;
блока. Просто щелкните на них и выберите нужный&lt;br /&gt;
пункт из меню. Так, для сенсора замените Always&lt;br /&gt;
на Keyboard [Клавиатура]. Поля рядом позволят вам&lt;br /&gt;
переименовать эти кирпичики – лучше давать осмысленные названия. Используйте только латиницу и помните о чувствительности Blender к регистру букв. Дело&lt;br /&gt;
в том, что это повышает не только информативность,&lt;br /&gt;
но и дает возможность обращаться к кирпичикам из&lt;br /&gt;
Pyhton. Кнопки с нарисованными треугольниками&lt;br /&gt;
закрывают и открывают поля для редактирования.&lt;br /&gt;
&lt;br /&gt;
Итак, наш сенсор сейчас настроен на работу с клавиатурой. Щелкните мышкой по полю рядом с надписью Key [Клавиша] – должна появится надпись Press a&lt;br /&gt;
key, нажмите курсорную клавишу Left [Влево]. Теперь,&lt;br /&gt;
если в игре будет нажата эта клавиша, сенсор тут же&lt;br /&gt;
выдаст импульс.&lt;br /&gt;
&lt;br /&gt;
Блок Controllers ответственен за принятие решения. Оставьте имеющееся там значение по умолчанию,&lt;br /&gt;
а вот Motion рассмотрим поподробнее.&lt;br /&gt;
&lt;br /&gt;
Данный кирпичик позволяет изменять местоположение и векторы направления движения, задавать&lt;br /&gt;
повороты объекта. Поэтому все данные расположены&lt;br /&gt;
в трех столбиках, по имеющимся осям XYZ. Первые&lt;br /&gt;
два пункта, Force [Сила] и Torque [Момент], отвечают&lt;br /&gt;
за перемещение объекта, если он использует физический движок. Для стрелки это не актуально, поэтому&lt;br /&gt;
обратите внимание на dLoc и dRot. По названию понятно, что за что отвечает. Введите значение -0.05 для&lt;br /&gt;
dLoc по оси Y (средняя колонка) и отожмите справа&lt;br /&gt;
кнопку L для данного поля, тем самым указав, что нам&lt;br /&gt;
необходимо работать с глобальными координатами.&lt;br /&gt;
&lt;br /&gt;
Соедините шашечки между всеми тремя блоками&lt;br /&gt;
для завершения логической цепочки (Рис. 1). Чтобы&lt;br /&gt;
просмотреть результат нашего тяжкого труда, просто&lt;br /&gt;
нажмите клавишу P, тем самым запустив игровой движок (да, да – Blender позволяет полноценно работать&lt;br /&gt;
с полученной игрой без предварительной компиляции). Теперь, если вы все правильно сделали, нажатие&lt;br /&gt;
левой курсорной клавиши заставит стрелку послушно&lt;br /&gt;
ползти влево. Для выхода из режима игры просто&lt;br /&gt;
нажмите Escape.&lt;br /&gt;
&lt;br /&gt;
Добавьте самостоятельно логику для движения&lt;br /&gt;
стрелки в другом направлении, а я перехожу к работе&lt;br /&gt;
с физическим движком. Заставим шар сбивать кегли!&lt;br /&gt;
&lt;br /&gt;
[[Изображение:LXF 100-101 103 1.png|frame|center|Рис. 1. Логическая цепочка для стрелки.]]&lt;br /&gt;
&lt;br /&gt;
=== Страйк! ===&lt;br /&gt;
Работать с физикой в Blender – просто одно удовольствие. Для придания сфере физических свойств,&lt;br /&gt;
выделите ее и в окне Логика [Logic] нажмите кнопку Actor [Действующий объект] на панели слева.&lt;br /&gt;
Откроются еще две дополнительные кнопки: Ghost&lt;br /&gt;
[Невидимость] и Dynamic [Динамика]. Активируйте&lt;br /&gt;
кнопку Dynamic.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:LXF 100-101 103 2.png|frame|Рис. 2. Параметры объекта с точки зрения движка Blender.]]&lt;br /&gt;
Появившиеся параметры стоит рассмотреть повнимательнее (рис. 2). Поле Mass [Масса] никаких вопросов вызывать не должно, а вот Radius [Радиус] указывает на область чувствительности объекта (отсчитывается от его центра) к столкновениям. Дело в&lt;br /&gt;
том, что по умолчанию Blender создает для каждого&lt;br /&gt;
физического объекта сферу, которая и принимается&lt;br /&gt;
в расчет при вычислениях коллизий. Платой за высокую скорость работы служит низкая точность вычислений. К счастью, редактор имеет еще несколько&lt;br /&gt;
заготовок, в том числе и точный расчет коллизий по&lt;br /&gt;
всем полигонам объекта. Выбрать подходящий режим&lt;br /&gt;
можно, нажав кнопку Bounds [Границы]. Из выпадающего списка выберите Convex Hull Polytope [Выпуклый&lt;br /&gt;
многоугольник].&lt;br /&gt;
&lt;br /&gt;
Ради любопытства можете запустить игру и полюбоваться на падающий шар. Однако настройка его на&lt;br /&gt;
этом не закончена. Для более реалистичного движения… стоп, у нас и самого движения пока что нет!&lt;br /&gt;
Давайте исправим этот недочет.&lt;br /&gt;
&lt;br /&gt;
Самые наблюдательные, наверное, уже заметили, что падение шара начинается сразу же с момента&lt;br /&gt;
запуска программы. Нам же необходимо совершать&lt;br /&gt;
это действие по нажатию определенной клавиши.&lt;br /&gt;
Особенностью Blender Engine является то, что отследить момент запуска физики вручную не представляется возможным, поэтому прибегнем к некоторым&lt;br /&gt;
ухищрениям.&lt;br /&gt;
&lt;br /&gt;
Перенесите сферу в любой другой слой, нажав клавишу M и выбрав соответствующую ячейку. Обратите&lt;br /&gt;
внимание на dummy-объект Emp_boul [главный слой].&lt;br /&gt;
Именно к нему мы привяжем наш код. Задача его&lt;br /&gt;
очень простая – по нажатию клавиши Пробел создать&lt;br /&gt;
объект boul, вследствие чего он должен появится&lt;br /&gt;
на экране и… совершить падение (пока что без&lt;br /&gt;
движения).&lt;br /&gt;
&lt;br /&gt;
[[Изображение:LXF 100-101 103 3.png|frame|Рис. 3. Легкий способ визуализации копии объекта.]]&lt;br /&gt;
Выделите Emp_boul и создайте по одному кирпичику в каждой области кода. Для Sensors выберите пункт&lt;br /&gt;
Keyboard и настройте его на реагирование на клавишу&lt;br /&gt;
Пробел, точно так же, как вы делали это для стрелки&lt;br /&gt;
чуть выше. В качестве Активатора у нас сейчас выступит кирпичик Edit Object [Правка объекта]. По умолчанию там уже активна функция Add Object [Добавить&lt;br /&gt;
объект], осталось вписать название создаваемого объекта, т.е. boul, в поле OB: (Рис. 3). Соедините шашечки&lt;br /&gt;
между группами и проверьте результат: на этот раз мы&lt;br /&gt;
можем произвольно генерировать неисчислимое множество копий шара по нажатию пробела.&lt;br /&gt;
&lt;br /&gt;
И вот теперь настало время придать нашему шарику движение. Для этого познакомимся с еще одним&lt;br /&gt;
сенсором – Always. Его задача состоит в постоянной&lt;br /&gt;
генерации импульса, и использовать его можно, скажем, для опроса состояния объекта. В нашем случае,&lt;br /&gt;
мы настроим сферу на автоматическое движение&lt;br /&gt;
вперед к кеглям, но работать это будет только после&lt;br /&gt;
создания самого объекта кодом dummy.&lt;br /&gt;
&lt;br /&gt;
Создайте, как обычно, стандартные кирпичики для&lt;br /&gt;
сферы и соедините их между собой. Так как сфера&lt;br /&gt;
работает с применением физического движка, то для&lt;br /&gt;
перемещения ее по одной из осей необходимо использовать параметр Force кирпичика Motion. Поместите в&lt;br /&gt;
первую ячейку значение -150 и отожмите кнопку справа, выбрав использование глобальных координат.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:LXF 100-101 104 1.png|frame|Рис. 4. Заставьте кегли чувствовать шарик.]]&lt;br /&gt;
Теперь при нажатии пробела шар послушно&lt;br /&gt;
заскользит вперед. Для более естественного подобия&lt;br /&gt;
движения необходимо заставить сферу вращаться при&lt;br /&gt;
качении. Для этого всего лишь необходимо активировать кнопочку Rigid Body [Твердое тело] в окне Actor.&lt;br /&gt;
Тем самым, включаются продвинутые возможности&lt;br /&gt;
имитации физического движения – естественно, за&lt;br /&gt;
счет дополнительной нагрузки на процессор.&lt;br /&gt;
Вот только кегли у нас при этом никак не реагируют на столкновения. Исправить это можно, в свою&lt;br /&gt;
очередь, подключив их к физическому движку. Для&lt;br /&gt;
этого настройте каждую из кеглей в соответствии с&lt;br /&gt;
рис. 4.&lt;br /&gt;
&lt;br /&gt;
Ничего сложного, не правда ли? Всего за полчаса&lt;br /&gt;
мы создали прототип работающей игры, пусть без&lt;br /&gt;
текстуры, без меню, без системы подсчета и вывода&lt;br /&gt;
результата, но это работает!&lt;/div&gt;</summary>
		<author><name>Yaleks</name></author>	</entry>

	</feed>