<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.linuxformat.ru/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF85%3AOgre</id>
		<title>LXF85:Ogre - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF85%3AOgre"/>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF85:Ogre&amp;action=history"/>
		<updated>2026-05-13T00:16:37Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.19.20+dfsg-0+deb7u3</generator>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF85:Ogre&amp;diff=5705&amp;oldid=prev</id>
		<title>Yaleks в 17:56, 30 ноября 2008</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF85:Ogre&amp;diff=5705&amp;oldid=prev"/>
				<updated>2008-11-30T17:56:53Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;http://wiki.linuxformat.ru/wiki/index.php?title=LXF85:Ogre&amp;amp;diff=5705&amp;amp;oldid=5533&quot;&gt;Внесённые изменения&lt;/a&gt;</summary>
		<author><name>Yaleks</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF85:Ogre&amp;diff=5533&amp;oldid=prev</id>
		<title>Yaleks: /* Ogre: Добавим вражьих роботов-умников */</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF85:Ogre&amp;diff=5533&amp;oldid=prev"/>
				<updated>2008-11-22T19:40:53Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Ogre: Добавим вражьих роботов-умников&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 19:40, 22 ноября 2008&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 33:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 33:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Нам требуется, чтобы у робота была своя сущность (каркас робота) и&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Нам требуется, чтобы у робота была своя сущность (каркас робота) и&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;узел сцены, чтобы мы могли помещать его в сцену. Вспомните, как мы&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;узел сцены, чтобы мы могли помещать его в сцену. Вспомните, как мы&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;передвигали игрока (LXF83): используя луч для нахождения высоты&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;передвигали игрока (&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;[[&lt;/ins&gt;LXF83&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;:Ogre|LXF83]]&lt;/ins&gt;): используя луч для нахождения высоты&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;игрока над ландшафтом. Надо придумать что-то подобное для каждого из наших врагов, поэтому вместо указания позиций в chad.cpp применим метод SetPos().&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;игрока над ландшафтом. Надо придумать что-то подобное для каждого из наших врагов, поэтому вместо указания позиций в chad.cpp применим метод SetPos().&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Yaleks</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF85:Ogre&amp;diff=5532&amp;oldid=prev</id>
		<title>Yaleks в 19:40, 22 ноября 2008</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF85:Ogre&amp;diff=5532&amp;oldid=prev"/>
				<updated>2008-11-22T19:40:04Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 19:40, 22 ноября 2008&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Цикл/Ogre}}&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Цикл/Ogre}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;== Ogre: Добавим вражьих роботов-умников ==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;== Ogre: Добавим вражьих роботов-умников ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;''ЧАСТЬ 4: Наскучило бродить одному по бескрайним просторам? '''Пол Хадсон''' подскажет вам, как добавить плохих &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;ребят...&lt;/del&gt;''&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;''ЧАСТЬ 4: Наскучило бродить одному по бескрайним просторам? '''Пол Хадсон''' подскажет вам, как добавить плохих &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;ребят…&lt;/ins&gt;''&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Солнце встает, освещая старый бревенчатый домик, а вода&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Солнце встает, освещая старый бревенчатый домик, а вода&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;плещется у краев покатого &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;ландшафта – &lt;/del&gt;наступает новый&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;плещется у краев покатого &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;ландшафта — &lt;/ins&gt;наступает новый&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;день в игре Висельник Чед. За последние три урока мы создали нашему игроку живописный остров, где он может порезвиться.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;день в игре Висельник Чед. За последние три урока мы создали нашему игроку живописный остров, где он может порезвиться.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Логичный следующий &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;шаг – &lt;/del&gt;населить остров роботами-убийцами. Как,&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Логичный следующий &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;шаг — &lt;/ins&gt;населить остров роботами-убийцами. Как,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;вы в этом не уверены? Тогда пришлите нам запрос на создание учебника по игре «Сажаем цветочки», и мы посмотрим, что можно сделать, а&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;вы в этом не уверены? Тогда пришлите нам запрос на создание учебника по игре «Сажаем цветочки», и мы посмотрим, что можно сделать, а&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;на данном уроке займемся роботами. Сотней здоровенных, вооруженных до зубов, злобных роботов. Да-с.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;на данном уроке займемся роботами. Сотней здоровенных, вооруженных до зубов, злобных роботов. Да-с.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 16:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 17:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;На сей раз мы создадим новый класс, отслеживающий перемещение роботов. Я не большой любитель объектно-ориентированного&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;На сей раз мы создадим новый класс, отслеживающий перемещение роботов. Я не большой любитель объектно-ориентированного&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;программирования – &lt;/del&gt;обычно мои классы превращаются в штуки типа&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;программирования — &lt;/ins&gt;обычно мои классы превращаются в штуки типа&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;struct; и я, скорее всего, не один такой. Кому не по душе моя манера&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;struct; и я, скорее всего, не один такой. Кому не по душе моя манера&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;делать все переменные публичными, пишите письма на имя /dev/null.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;делать все переменные публичными, пишите письма на имя /dev/null.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 24:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 25:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Library или STL). Если вы раньше не использовали STL, вам вполне&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Library или STL). Если вы раньше не использовали STL, вам вполне&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;простительно решить, что это плод труда двух комитетов из разных&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;простительно решить, что это плод труда двух комитетов из разных&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;стран, говорящих на разных &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;языках – &lt;/del&gt;но, отстранившись от мелочей,&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;стран, говорящих на разных &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;языках — &lt;/ins&gt;но, отстранившись от мелочей,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;вы поймете, как все просто.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;вы поймете, как все просто.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 86:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 87:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;запросу. Решение состоит в использовании STL: это коллекция стандартных абстрактных типов данных для C++. Пусть слово «абстрактные» вас не пугает: STL чрезвычайно полезна, а ее типы данных обычно легко представить.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;запросу. Решение состоит в использовании STL: это коллекция стандартных абстрактных типов данных для C++. Пусть слово «абстрактные» вас не пугает: STL чрезвычайно полезна, а ее типы данных обычно легко представить.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Для управления врагами нам потребуется тип данных «вектор» &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;–&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Для управления врагами нам потребуется тип данных «вектор» &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;-&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;массив некоторых величин, в котором нас интересует только их&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;массив некоторых величин, в котором нас интересует только их&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;значение. Добавление «вражеского» вектора потребует сделать два&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;значение. Добавление «вражеского» вектора потребует сделать два&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 110:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 111:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;врагов в вектор Enemies. Если вашей системе больше трех лет от роду,&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;врагов в вектор Enemies. Если вашей системе больше трех лет от роду,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;врагов лучше взять поменьше.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;врагов лучше взять поменьше.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Вот и все, что потребовалось для добавления &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;роботов – &lt;/del&gt;теперь&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Вот и все, что потребовалось для добавления &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;роботов — &lt;/ins&gt;теперь&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;скомпилируйте игру и запустите ее!&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;скомпилируйте игру и запустите ее!&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 178:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 179:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;вызываем метод Update() и посылаем отрезок времени, прошедший с&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;вызываем метод Update() и посылаем отрезок времени, прошедший с&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;прошлого кадра. Именно тут наши роботы должны проделать всё, что&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;прошлого кадра. Именно тут наши роботы должны проделать всё, что&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;им &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;полагается – &lt;/del&gt;сейчас мы просто заставим их двигаться.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;им &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;полагается — &lt;/ins&gt;сейчас мы просто заставим их двигаться.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Пора написать сам метод Update(). Вставьте следующий код в конец&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Пора написать сам метод Update(). Вставьте следующий код в конец&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 217:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 218:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Мы можем рассчитать длину вектора, вызвав метод normalise(),&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Мы можем рассчитать длину вектора, вызвав метод normalise(),&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;который вернет нормализованный &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;вектор – &lt;/del&gt;имеющий то же направление, но длина его равна 1. Штука хорошая, но на самом-то деле нас&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;который вернет нормализованный &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;вектор — &lt;/ins&gt;имеющий то же направление, но длина его равна 1. Штука хорошая, но на самом-то деле нас&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;интересует значение длины исходного вектора, которое также возвращается методом normalise и в нашем коде является расстоянием&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;интересует значение длины исходного вектора, которое также возвращается методом normalise и в нашем коде является расстоянием&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;от робота до точки назначения. Сохраним это значение в переменной&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;от робота до точки назначения. Сохраним это значение в переменной&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;dest.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;dest.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;Теперь – &lt;/del&gt;важный момент: если расстояние до точки назначения&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;Теперь — &lt;/ins&gt;важный момент: если расстояние до точки назначения&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;короче, чем расстояние, на которое собирается переместиться робот&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;короче, чем расстояние, на которое собирается переместиться робот&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;(его скорость, помноженная на время, прошедшее с прошлого кадра),&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;(его скорость, помноженная на время, прошедшее с прошлого кадра),&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 233:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 234:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;нормализован, поэтому все будет работать.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;нормализован, поэтому все будет работать.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Вот и &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;все – &lt;/del&gt;запустите новый код и наслаждайтесь реалистичностью&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Вот и &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;все — &lt;/ins&gt;запустите новый код и наслаждайтесь реалистичностью&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;перемещений ваших роботов по ландшафту!&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;перемещений ваших роботов по ландшафту!&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;=== Идем верным путем ===&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;=== Идем верным путем ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Ну, пожалуй, &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;«реалистичность» – &lt;/del&gt;слишком сильно сказано: на самом&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Ну, пожалуй, &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;«реалистичность» — &lt;/ins&gt;слишком сильно сказано: на самом&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;деле роботы просто скользят, по причине отсутствия кода для анимации. Да и вообще, нет ничего, обуславливающего должное направление их перемещения. Давайте это исправим!&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;деле роботы просто скользят, по причине отсутствия кода для анимации. Да и вообще, нет ничего, обуславливающего должное направление их перемещения. Давайте это исправим!&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 259:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 260:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;интеллекта: если робот приблизится к игроку на определенное расстояние, пусть остановится и посмотрит на игрока. По умолчанию такая&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;интеллекта: если робот приблизится к игроку на определенное расстояние, пусть остановится и посмотрит на игрока. По умолчанию такая&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;опция установлена для каждого робота; вы скоро узнаете, зачем.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;опция установлена для каждого робота; вы скоро узнаете, зачем.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Осталось изменить метод Update(). Первое, что необходимо &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;сделать – &lt;/del&gt;обновить анимацию робота, этим займется метод addTime()&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Осталось изменить метод Update(). Первое, что необходимо &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;сделать — &lt;/ins&gt;обновить анимацию робота, этим займется метод addTime()&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;нашей переменной m_AnimationState(). Он принимает в качестве параметра время, прошедшее с прошлого кадра, которое мы уже знаем,&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;нашей переменной m_AnimationState(). Он принимает в качестве параметра время, прошедшее с прошлого кадра, которое мы уже знаем,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;поэтому поместите следующую строку в начале метода Update():&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;поэтому поместите следующую строку в начале метода Update():&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 315:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 316:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Лимит на код в этом уроке исчерпан. Прокрутите свою игру: мы&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Лимит на код в этом уроке исчерпан. Прокрутите свою игру: мы&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;добавили врагов, передвижение, анимацию и простенький искусственный &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;интеллект – &lt;/del&gt;не так уж плохо для одного урока!&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;добавили врагов, передвижение, анимацию и простенький искусственный &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;интеллект — &lt;/ins&gt;не так уж плохо для одного урока!&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;----&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;----&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;references /&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;references /&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Yaleks</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF85:Ogre&amp;diff=5531&amp;oldid=prev</id>
		<title>Yaleks: Новая: {{Цикл/Ogre}} == Ogre: Добавим вражьих роботов-умников == ''ЧАСТЬ 4: Наскучило бродить одному по бескрайним про...</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF85:Ogre&amp;diff=5531&amp;oldid=prev"/>
				<updated>2008-11-22T19:38:00Z</updated>
		
		<summary type="html">&lt;p&gt;Новая: {{Цикл/Ogre}} == Ogre: Добавим вражьих роботов-умников == &amp;#039;&amp;#039;ЧАСТЬ 4: Наскучило бродить одному по бескрайним про...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Цикл/Ogre}}&lt;br /&gt;
== Ogre: Добавим вражьих роботов-умников ==&lt;br /&gt;
''ЧАСТЬ 4: Наскучило бродить одному по бескрайним просторам? '''Пол Хадсон''' подскажет вам, как добавить плохих ребят...''&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;
интеллекту (ИИ), именно здесь и начинается настоящая потеха: неважно, как Ogre работает с 3D-графикой, сам по себе он нечеловечески&lt;br /&gt;
скучен. Все, что выходит за рамки влияния Ogre, придется писать&lt;br /&gt;
самим. Поверьте, это забавно!&lt;br /&gt;
&lt;br /&gt;
На сей раз мы создадим новый класс, отслеживающий перемещение роботов. Я не большой любитель объектно-ориентированного&lt;br /&gt;
программирования – обычно мои классы превращаются в штуки типа&lt;br /&gt;
struct; и я, скорее всего, не один такой. Кому не по душе моя манера&lt;br /&gt;
делать все переменные публичными, пишите письма на имя /dev/null.&lt;br /&gt;
&lt;br /&gt;
В процессе создания роботов вы познакомитесь с кватернионами&lt;br /&gt;
(которые, наряду с ‘shazbat’, являются моим любимым словом), анимацией и Стандартной библиотекой шаблонов С++ (Standard Template&lt;br /&gt;
Library или STL). Если вы раньше не использовали STL, вам вполне&lt;br /&gt;
простительно решить, что это плод труда двух комитетов из разных&lt;br /&gt;
стран, говорящих на разных языках – но, отстранившись от мелочей,&lt;br /&gt;
вы поймете, как все просто.&lt;br /&gt;
&lt;br /&gt;
Наши враги будут управляться специальным классом, который я&lt;br /&gt;
назову CChadEnemy, так что создайте файлы chademeny.h и chadenemy.&lt;br /&gt;
cpp (да позаботьтесь о включении файла chadenemy.cpp в Makefile).&lt;br /&gt;
Нам требуется, чтобы у робота была своя сущность (каркас робота) и&lt;br /&gt;
узел сцены, чтобы мы могли помещать его в сцену. Вспомните, как мы&lt;br /&gt;
передвигали игрока (LXF83): используя луч для нахождения высоты&lt;br /&gt;
игрока над ландшафтом. Надо придумать что-то подобное для каждого из наших врагов, поэтому вместо указания позиций в chad.cpp применим метод SetPos().&lt;br /&gt;
&lt;br /&gt;
Вот файл chad.h:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;Ogre.&amp;quot;&lt;br /&gt;
#include &amp;quot;OgreFrameListener.h&amp;quot;&lt;br /&gt;
#include &amp;quot;OgreEventListeners.h&amp;quot;&lt;br /&gt;
#include &amp;quot;OgreKeyEvent.h&amp;quot;&lt;br /&gt;
using namespace Ogre;&lt;br /&gt;
class CChadEnemy {&lt;br /&gt;
public:&lt;br /&gt;
SceneManager* m_SceneMgr;&lt;br /&gt;
Entity* m_Entity;&lt;br /&gt;
SceneNode* m_Node;&lt;br /&gt;
int m_Speed;&lt;br /&gt;
CChadEnemy(SceneManager* scenemgr);&lt;br /&gt;
void SetPos(Vector3 dest);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Каждый враг создается своим конструктором, CChadEnemy(). В&lt;br /&gt;
нем будет происходить загрузка каркаса, создание узла сцены, затем&lt;br /&gt;
добавление в менеджер сцены (вы заметили указатель на менеджер&lt;br /&gt;
сцены в chad.h?). Каркас робота предоставляется Ogre и должен находится в вашем каталоге с медиа-ресурсами, но мы уменьшим размер&lt;br /&gt;
робота вчетверо, вот этот код:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
CChadEnemy::CChadEnemy(SceneManager* scenemgr) {&lt;br /&gt;
m_SceneMgr = scenemgr;&lt;br /&gt;
static int EnemyNum = 0;&lt;br /&gt;
char enemyname[32];&lt;br /&gt;
sprintf (enemyname, &amp;quot;Robot %d&amp;quot;, ++EnemyNum);&lt;br /&gt;
m_Entity = m_SceneMgr-&amp;gt;createEntity(enemyname,&amp;quot;robot.mesh&amp;quot;);&lt;br /&gt;
m_Node = m_SceneMgr-&amp;gt;getRootSceneNode()-&amp;gt;createChildSceneNode();&lt;br /&gt;
m_Node-&amp;gt;attachObject(m_Entity);&lt;br /&gt;
m_Node-&amp;gt;scale(0.25,0.25,0.25);&lt;br /&gt;
m_Speed = 5;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Строки с EnemyNum, enemyname и sprintf() раздражают своим&lt;br /&gt;
уродством, но для Ogre это в порядке вещей. Проблема здесь в том,&lt;br /&gt;
что каждой загружаемой сущности требуется дать уникальное имя, а&lt;br /&gt;
достичь этого можно, отслеживая, сколько врагов уже создано с помощью переменной EnemyNum, и добавляя это значение к слову Robot.&lt;br /&gt;
EnemyNum объявлена как статическая переменная, то есть ее разделяют все экземпляры класса.&lt;br /&gt;
&lt;br /&gt;
Я не собираюсь печатать метод SetPos(), потому что по большей&lt;br /&gt;
части он идентичен методу SetPos() для игрока; вы можете просто&lt;br /&gt;
его скачать из исходного кода c web-сайта Linux Format&amp;lt;ref&amp;gt;Код этого урока можно найти на: http://www.linuxformat.co.uk/mag/hangingchad_lxf85.tar.gz&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Стандартная библиотека шаблонов ===&lt;br /&gt;
Теперь у нас хватает кода, чтобы населить остров врагами-роботами,&lt;br /&gt;
но сначала надо придумать, как их хранить. Метод должен быть гибким: незачем объявлять переменную для каждого робота или заводить&lt;br /&gt;
статические массивы, потому что желательно создавать роботов по&lt;br /&gt;
запросу. Решение состоит в использовании STL: это коллекция стандартных абстрактных типов данных для C++. Пусть слово «абстрактные» вас не пугает: STL чрезвычайно полезна, а ее типы данных обычно легко представить.&lt;br /&gt;
&lt;br /&gt;
Для управления врагами нам потребуется тип данных «вектор» –&lt;br /&gt;
массив некоторых величин, в котором нас интересует только их&lt;br /&gt;
значение. Добавление «вражеского» вектора потребует сделать два&lt;br /&gt;
изменения в chad.h. Вставьте следующие две строчки после директив #include:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;chadenemy.h&amp;quot;&lt;br /&gt;
#include &amp;lt;vector&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Теперь вставьте эту строку в конце определения класса&lt;br /&gt;
CChadGame:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
std::vector&amp;lt;CChadEnemy*&amp;gt; Enemies;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Далее припишите к методу createOutdoorScene() следующий код:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
for (int i = 0; i &amp;lt; 100; ++i) {&lt;br /&gt;
CChadEnemy* enemy = new CChadEnemy(m_SceneMgr);&lt;br /&gt;
enemy-&amp;gt;SetPos(Vector3(rand() % 1000,0, rand() % 1000));&lt;br /&gt;
Enemies.push_back(enemy);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Этот код создаст 100 новых врагов, задаст им произвольные позиции на карте (Y установлен равным 0: метод SetPos() потом переопределит это значение с учетом высоты местности), затем добавляет&lt;br /&gt;
врагов в вектор Enemies. Если вашей системе больше трех лет от роду,&lt;br /&gt;
врагов лучше взять поменьше.&lt;br /&gt;
Вот и все, что потребовалось для добавления роботов – теперь&lt;br /&gt;
скомпилируйте игру и запустите ее!&lt;br /&gt;
&lt;br /&gt;
=== Двигаемся дальше ===&lt;br /&gt;
Наши роботы стоят столбом, напоминая батарейки из рекламы Duracell,&lt;br /&gt;
которые демонстрируют, что другие уже рухнули. Попробуем их оживить: пусть выберут какой-то пункт назначения на карте и отправятся&lt;br /&gt;
туда, обуреваемые злыми намерениями. Для этого нам потребуется&lt;br /&gt;
внести следующие изменения:&lt;br /&gt;
# Назначить каждому роботу точку назначения и направление.&lt;br /&gt;
# Сказать каждому роботу, сколько времени прошло с его последнего перемещения (поэтому они двигаются с постоянной скоростью, независимо от скорости вашего компьютера).&lt;br /&gt;
# Велеть роботам перемещаться при начале каждого кадра.&lt;br /&gt;
Мы можем разрешить первые два пункта, отредактировав файл&lt;br /&gt;
chadenemy.h. Добавьте две строки после определения m_Speed:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Vector3 m_Direction;&lt;br /&gt;
Vector3 m_Destination;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Также вам понадобится дописать определение следующего метода&lt;br /&gt;
в определении класса:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void Update(Real time);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Мы будем вызывать метод Update() для каждого робота каждый&lt;br /&gt;
раз, как только начнется кадр, поэтому робот сможет перемещать сам&lt;br /&gt;
себя. Временной параметр сообщает роботам, сколько времени прошло с момента отрисовки последнего кадра. Ogre об этом позаботился: взгляните на метод CChadGame::frameStarted() в файле chad.cpp, и&lt;br /&gt;
увидите следующее:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
bool CChadGame::frameStarted(const FrameEvent&amp;amp; evt) {&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Параметр FrameEvent сообщает множество характеристик текущего кадра, включая время, прошедшее между кадрами. Проблема&lt;br /&gt;
состоит в том, что мы затем вызываем frameStartedOutside() или&lt;br /&gt;
frameStartredInside() и не передаем этот параметр. Поэтому откройте&lt;br /&gt;
файл chad.h и измените их, чтобы они соответствовали прототипам:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
bool frameStartedOutside(const FrameEvent&amp;amp; evt);&lt;br /&gt;
bool frameStartedInside(const FrameEvent&amp;amp; evt);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Вам также понадобится отредактировать файл chad.cpp. Метод&lt;br /&gt;
frameStarted() необходимо подправить, чтобы он передавал параметр&lt;br /&gt;
требуемому методу, например:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
bool CChadGame::frameStarted(const FrameEvent&amp;amp; evt) {&lt;br /&gt;
switch (scenemanager) {&lt;br /&gt;
case ST_EXTERIOR_CLOSE:&lt;br /&gt;
return frameStartedOutside(evt);&lt;br /&gt;
break;&lt;br /&gt;
case ST_INTERIOR:&lt;br /&gt;
return frameStartedInside(evt);&lt;br /&gt;
break;&lt;br /&gt;
}&lt;br /&gt;
return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Каждый раз, когда кадр начинается вне дома, необходимо обновить&lt;br /&gt;
всех наших роботов с помощью метода Update(). В части кода, получается, надо пройти в цикле по вектору Enemies() и передать данные о кадре,&lt;br /&gt;
предоставляемые Ogre. Поэтому в конце метода frameStartedOutside()&lt;br /&gt;
(перед строкой ‘return line’) добавьте небольшой цикл:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
for (std::vector&amp;lt;CChadEnemy*&amp;gt;::iterator iter = Enemies.begin();&lt;br /&gt;
iter != Enemies.end(); ++iter) {&lt;br /&gt;
CChadEnemy* enemy = (*iter);&lt;br /&gt;
enemy-&amp;gt;Update(evt.timeSinceLastFrame);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь STL применяется в большей степени, и наш код напоминает&lt;br /&gt;
синтаксическую окрошку. На самом деле этот цикл проходит от начала до конца вектора, используя STL-итератор. Можно, конечно, получить прямой доступ к элементам вектора через индексы, но итераторы более предпочтительны. Для каждого врага в нашем векторе мы&lt;br /&gt;
вызываем метод Update() и посылаем отрезок времени, прошедший с&lt;br /&gt;
прошлого кадра. Именно тут наши роботы должны проделать всё, что&lt;br /&gt;
им полагается – сейчас мы просто заставим их двигаться.&lt;br /&gt;
&lt;br /&gt;
Пора написать сам метод Update(). Вставьте следующий код в конец&lt;br /&gt;
файла chadenemy.cpp:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void CChadEnemy::Update(Real time) {&lt;br /&gt;
if (m_Destination == Vector3::ZERO) {&lt;br /&gt;
m_Destination = Vector3(rand() % 1000,0, rand() % 1000);&lt;br /&gt;
m_Direction = m_Destination - m_Node-&amp;gt;getPosition();&lt;br /&gt;
} else {&lt;br /&gt;
Vector3 ourpos = m_Node-&amp;gt;getPosition();&lt;br /&gt;
ourpos.y = 0.0f;&lt;br /&gt;
m_Direction = m_Destination - ourpos;&lt;br /&gt;
Real dist = m_Direction.normalise();&lt;br /&gt;
Real movespeed = m_Speed * time;&lt;br /&gt;
if (dist &amp;lt; movespeed) {&lt;br /&gt;
m_Destination = Vector3::ZERO;&lt;br /&gt;
} else {&lt;br /&gt;
// необходимо переместиться ближе к точке назначения&lt;br /&gt;
Vector3 newpos = m_Direction * movespeed;&lt;br /&gt;
SetPos(newpos);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Код включает две ветви: если врагу уже задано направление движения, то он по нему и движется, если же нет, направление выбирается произвольно. Ветвь определяется в самом начале: если вектор&lt;br /&gt;
m_Destination равен Vector::ZERO (по умолчанию, пустой вектор), то&lt;br /&gt;
необходим выбор точки назначения. Зная эту точку, мы можем вычислить направление простым вычитанием координат текущей позиции&lt;br /&gt;
(все векторные операции Ogre берет на себя).&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;
Мы можем рассчитать длину вектора, вызвав метод normalise(),&lt;br /&gt;
который вернет нормализованный вектор – имеющий то же направление, но длина его равна 1. Штука хорошая, но на самом-то деле нас&lt;br /&gt;
интересует значение длины исходного вектора, которое также возвращается методом normalise и в нашем коде является расстоянием&lt;br /&gt;
от робота до точки назначения. Сохраним это значение в переменной&lt;br /&gt;
dest.&lt;br /&gt;
&lt;br /&gt;
Теперь – важный момент: если расстояние до точки назначения&lt;br /&gt;
короче, чем расстояние, на которое собирается переместиться робот&lt;br /&gt;
(его скорость, помноженная на время, прошедшее с прошлого кадра),&lt;br /&gt;
значит, он подобрался очень близко, и нам необходимо выбрать новое&lt;br /&gt;
направление. Это можно сделать, установив вектор m_Destination равным Vector3::Zero, тогда при следующем вызове метода робот случайным образом выберет другую точку назначения.&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;
=== Идем верным путем ===&lt;br /&gt;
Ну, пожалуй, «реалистичность» – слишком сильно сказано: на самом&lt;br /&gt;
деле роботы просто скользят, по причине отсутствия кода для анимации. Да и вообще, нет ничего, обуславливающего должное направление их перемещения. Давайте это исправим!&lt;br /&gt;
&lt;br /&gt;
В файле chadenemy.h добавьте две строки, перед вектором&lt;br /&gt;
m_Direction:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
AnimationState* m_AnimationState;&lt;br /&gt;
bool WatchingPlayer;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
AnimationState представляет собой тип данных Ogre, ответственный&lt;br /&gt;
за анимацию сущности: проигрывать ли ее бесконечно, и так далее.&lt;br /&gt;
Мы хотим, чтобы наши роботы по умолчанию использовали анимацию ‘Idle’, поэтому скопируйте следующий код в конструктор класса&lt;br /&gt;
CChadEnemy:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
m_AnimationState = m_Entity-&amp;gt;getAnimationState(&amp;quot;Idle&amp;quot;);&lt;br /&gt;
m_AnimationState-&amp;gt;setLoop(true);&lt;br /&gt;
m_AnimationState-&amp;gt;setEnabled(true);&lt;br /&gt;
WatchingPlayer = true;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Переменная WatchingPlayer будет первым кусочком искусственного&lt;br /&gt;
интеллекта: если робот приблизится к игроку на определенное расстояние, пусть остановится и посмотрит на игрока. По умолчанию такая&lt;br /&gt;
опция установлена для каждого робота; вы скоро узнаете, зачем.&lt;br /&gt;
Осталось изменить метод Update(). Первое, что необходимо сделать – обновить анимацию робота, этим займется метод addTime()&lt;br /&gt;
нашей переменной m_AnimationState(). Он принимает в качестве параметра время, прошедшее с прошлого кадра, которое мы уже знаем,&lt;br /&gt;
поэтому поместите следующую строку в начале метода Update():&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
m_AnimationState-&amp;gt;addTime(time);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Далее нам необходимо поместить код, вычисляющий расстояние&lt;br /&gt;
между текущим роботом и игроком и заставляющий робота предпринять соответствующее действие, если поблизости находится игрок:&lt;br /&gt;
бросить вышеупомянутый злобный взгляд. Добавьте следующий код&lt;br /&gt;
(после проверки Vector3::ZERO) внутри другого блока if:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Vector3 campos = m_SceneMgr-&amp;gt;getSceneNode(&amp;quot;camnode&amp;quot;)-&amp;gt;getPosition();&lt;br /&gt;
Vector3 ourpos = m_Node-&amp;gt;getPosition();&lt;br /&gt;
Vector3 playerdist = ourpos - campos;&lt;br /&gt;
if (playerdist.normalise() &amp;lt; 100) {&lt;br /&gt;
if (!WatchingPlayer) {&lt;br /&gt;
m_AnimationState = m_Entity-&amp;gt;getAnimationState(&amp;quot;Idle&amp;quot;);&lt;br /&gt;
m_AnimationState-&amp;gt;setLoop(true);&lt;br /&gt;
m_AnimationState-&amp;gt;setEnabled(true);&lt;br /&gt;
WatchingPlayer = true;&lt;br /&gt;
}&lt;br /&gt;
Vector3 orient = m_Node-&amp;gt;getOrientation() * Vector3::UNIT_X;&lt;br /&gt;
Vector3 dir = campos - m_Node-&amp;gt;getPosition();&lt;br /&gt;
dir.y = 0;&lt;br /&gt;
Ogre::Quaternion quat = orient.getRotationTo(dir);&lt;br /&gt;
m_Node-&amp;gt;rotate(quat);&lt;br /&gt;
} else {&lt;br /&gt;
if (m_Destination == Vector3::ZERO) {&lt;br /&gt;
// здесь почти ничего не изменилось&lt;br /&gt;
SetPos(newpos);&lt;br /&gt;
}&lt;br /&gt;
// а это новый код&lt;br /&gt;
if (WatchingPlayer) {&lt;br /&gt;
m_AnimationState = m_Entity-&amp;gt;getAnimationState(&amp;quot;Walk&amp;quot;);&lt;br /&gt;
m_AnimationState-&amp;gt;setLoop(true);&lt;br /&gt;
m_AnimationState-&amp;gt;setEnabled(true);&lt;br /&gt;
WatchingPlayer = false;&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Итак, если робот невдалеке от игрока, мы заставляем его взглянуть,&lt;br /&gt;
если только он уже не глядит (чтобы избежать лишних вызовов функции). Задача заставить робота смотреть на игрока представляет собой&lt;br /&gt;
лишь вопрос получения ориентации робота, нахождению направляющего вектора между нами и роботом, а затем преобразованию его&lt;br /&gt;
в кватернион, используя метод getRotationTo() вектора. Это позволит&lt;br /&gt;
нам развернуть робота лицом к игроку, передав кватернион в метод&lt;br /&gt;
rotate().&lt;br /&gt;
&lt;br /&gt;
Если робот находится далеко, выполним проверку с вектором&lt;br /&gt;
Vector3::ZERO, за которым следует много кода, заканчивающегося&lt;br /&gt;
вызовом SetPos(). Тут все осталось без изменений, но после этого нам&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;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Yaleks</name></author>	</entry>

	</feed>