﻿<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ignite</title>
	<atom:link href="http://alexbard.org.ua/feed/" rel="self" type="application/rss+xml" />
	<link>http://alexbard.org.ua</link>
	<description>a roguelike development</description>
	<lastBuildDate>Sun, 29 Apr 2012 10:59:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Ignite &#8211; сохранение игрового процесса</title>
		<link>http://alexbard.org.ua/2012/ignite-soxranenie-igrovogo-processa/</link>
		<comments>http://alexbard.org.ua/2012/ignite-soxranenie-igrovogo-processa/#comments</comments>
		<pubDate>Sun, 29 Apr 2012 09:35:42 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[ignite]]></category>

		<guid isPermaLink="false">http://alexbard.org.ua/?p=1633</guid>
		<description><![CDATA[Реализовал, и избавился от кучи сопутствующих багов, механизм сохранения игры. Честно сказать, я и не думал, что это будет настолько трудно. Но сейчас я имею на руках билд с работающими сохранениями и загрузками. Остался только один баг, над поиском которого я работаю сейчас. Он состоит в том, что после того, как игра была загружена (в [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Реализовал, и избавился от кучи сопутствующих багов, механизм сохранения игры. Честно сказать, я и не думал, что это будет <strong>настолько</strong> трудно. Но сейчас я имею на руках билд с работающими сохранениями и загрузками. Остался только один баг, над поиском которого я работаю сейчас. Он состоит в том, что после того, как игра была загружена (в отличии от создания новой игры), смена освещенности зон карты становится более быстрой и вместо плавной смены видимой области тенями, смена происходит рывками.</p>
<p style="text-align: justify;">Выкладываю патч к предыдущей версии игры. Патч приносит минорные изменения в геймплей, поэтому я не буду корректировать бинарники на больших порталах и выкладываю его только сюда. Изменения:</p>
<ul>
<li>Система сохранения / загрузки &#8211; основная проделанная работа в этом патче.</li>
<li>Сохранение происходит в файл player в корне игры. Загрузка, естественно, из него же. Я еще не реализовывал никакого интерфейса загрузки, поэтому никакого выбора слотов под сохранение нет, также как и проверки на существование файла (при его отсутствии игра выпадет). По-умолчанию я поставил, как сохраненку своего дебажного перса с кучей всяких штук. Может при пригодится при поиске ошибок.</li>
<li>Сохраняться в игре через F10</li>
<li>Исправление ошибок предыдущего релиза.</li>
<li>Снятие ограничения на количество отрисовываемых кадров в секунду. Не знаю почему, но XNA искусственно занижает значение fps при ручном их ограничении (у меня было 60). Сейчас вы можете увидеть совершенно безумные цифры в 2500+ fps в главном меню и прирост в самой игре на 50-80%.</li>
<li>Ускорение анимации передвижения. Игра стала чуть более быстрой в замен еще большей резкости передвижения. Дайте мне знать, что вы думаете по этому поводу!</li>
</ul>
<div>Скачать: <a rel = "nofollow" href="http://dl.dropbox.com/u/31655535/Ignite_041a.rar">http://dl.dropbox.com/u/31655535/Ignite_041a.rar</a></div>
]]></content:encoded>
			<wfw:commentRss>http://alexbard.org.ua/2012/ignite-soxranenie-igrovogo-processa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Изменения в Ignite 0.42</title>
		<link>http://alexbard.org.ua/2012/izmeneniya-v-ignite-0-42/</link>
		<comments>http://alexbard.org.ua/2012/izmeneniya-v-ignite-0-42/#comments</comments>
		<pubDate>Mon, 16 Apr 2012 18:39:40 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[ignite]]></category>

		<guid isPermaLink="false">http://alexbard.org.ua/?p=1626</guid>
		<description><![CDATA[Это список планируемых изменений к следующей версии Ignite. Его содержимое является subject of change, т.е. будет меняться ровно до тех пор, пока я не выпущу следующую версию. У меня заняло почти три месяца переписывание движка игры под архитектуру XNA, но теперь, когда очень многое из задуманного (в плане механики работы приложения) реализовано, я могу начать [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Это список планируемых изменений к следующей версии Ignite. Его содержимое является subject of change, т.е. будет меняться ровно до тех пор, пока я не выпущу следующую версию. У меня заняло почти три месяца переписывание движка игры под архитектуру XNA, но теперь, когда очень многое из задуманного (в плане механики работы приложения) реализовано, я могу начать выпускать полноценные версии гораздо чаще. Как минимум раз в месяц будут выходить сборки с новым контентом.</p>
<p style="text-align: justify;">Планируемые изменения:</p>
<ul>
<li>Меню опций будет сохранять изменения</li>
<li>Будет добавлен режим без анимации (как в привычных тайловых roguelike играх)</li>
<li>Поддержка большего количества разрешений монитора</li>
<li>Ролевая система снова будет работать (она перекочует из 0.40 билда)</li>
<li>При генерации мира будет учитываться карта распределения влажности (появятся лужи, озера и океаны)</li>
<li>Игровые локации условно будут делиться на биомы с общими характеристиками</li>
<li>Некоторые биомы будут представлять опасность для игрока (переохлаждение, тепловой удар)</li>
<li>Частота появления редких ресурсов напрямую будет зависеть от опасности биома для игрока</li>
<li>Генерация монстров будет напрямую зависеть от биома</li>
<li>Больше монстров</li>
<li>Больше предметов</li>
<li>В мире будут генерироваться руины, которые будут представлять интерес для исследования</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://alexbard.org.ua/2012/izmeneniya-v-ignite-0-42/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Ignite 0.41 &#8211; Новая версия!</title>
		<link>http://alexbard.org.ua/2012/ignite-0-41-novaya-versiya/</link>
		<comments>http://alexbard.org.ua/2012/ignite-0-41-novaya-versiya/#comments</comments>
		<pubDate>Sun, 15 Apr 2012 13:02:48 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[ignite]]></category>

		<guid isPermaLink="false">http://alexbard.org.ua/?p=1623</guid>
		<description><![CDATA[Привет! Я наконец-то готов представить новую версию Игнайта на новом движке. Сразу оговорюсь, что данную версию стоит рассматривать исключительно, как пре-альфу, а это значит, что она может (и будет) содержать баги и недоработки. Прошу относится к этому с пониманием. Итак, когда дисклаймер закончен, перехожу к требованиям. Игра стала более требовательна к железу (но, как мне [...]]]></description>
			<content:encoded><![CDATA[<p>Привет! Я наконец-то готов представить новую версию Игнайта на новом движке. Сразу оговорюсь, что данную версию стоит рассматривать исключительно, как пре-альфу, а это значит, что она может (и будет) содержать баги и недоработки. Прошу относится к этому с пониманием.</p>
<p>Итак, когда дисклаймер закончен, перехожу к требованиям. Игра стала более требовательна к железу (но, как мне кажется, должна без тормозов пойти на любом компьютере, который обновлялся в последние 5 лет).<br />
С точки зрения требования к ПО, у вас должны быть установлены пакеты NET Framework 4.0 (<a href="http://go.microsoft.com/fwlink/?linkid=182804" rel="nofollow">http://go.microsoft.com/fwlink/?linkid=182804</a>) и XNA4 Framework (<a href="http://www.microsoft.com/Download/en/details.aspx?id=20914" rel="nofollow">http://www.microsoft.com/Download/en/details.aspx?id=20914</a>). Достаточна высока вероятность, что у вас уже установлены эти пакеты (т.к. достаточно много игр требуют их).</p>
<p><a rel="nofollow" href="http://www.indiedb.com/games/ignite-roguelike/downloads/ignite-prealpha-041" title="Download Ignite prealpha 0.41 - Indie DB" target="_blank"><img src="http://button.indiedb.com/download/medium/42173.png" alt="Ignite prealpha 0.41" /></a><br />
Зеркало: <a href="http://dl.dropbox.com/u/31655535/Ignite_pa041.rar" rel="nofollow">http://dl.dropbox.com/u/31655535/Ignite_pa041.rar</a></p>
<p>Этого должно быть достаточно, чтобы запустить игру. Основные фичи данной версии:</p>
<ul>
<li>Генерация мира на основе псевдослучаных алгоритмов и всяких карт с учетом динамических термальных изменений (разведите костер на границе снежной территории)</li>
<li>Возможность выбора разрешения игры (правда пока в пределах соотношения сторон 4:3)</li>
<li>Собирание ресурсов и крафтинг предметов из полученных материалов</li>
<li>Возможность строительства из подручных материалов</li>
<li>14 предметов для крафта, среди них: факел для освещения местности вокруг себя, костер для обогревания, оружие и инструменты для выживания</li>
<li>Волки периодически будут находить вас в глуши и будут пытаться съесть</li>
<li>Система повреждений, которая разделяет персонажа на несколько зон с разными типами повреждений</li>
<li>Несколько эффектов повреждения зон тела (пробитое легкое, поврежденные мускулы, подрезанное сухожилие и др.), которые распространяются как на игрока, так и на его противников</li>
<li>Несколько видов повреждений(колющий, дробящий)</li>
</ul>
<p>Что я не успел реализовать, но на что есть намеки в игре:</p>
<ul>
<li>Открытые раны не загнивают и не приводят к инфекции, они просто проходят со временем</li>
<li>Нет критического эффекта огненного урона. Факел просто наносит урон, но не может поджечь жертву.</li>
<li>Нет критических повреждений связанных с головой/пастью</li>
<li>Нет термального воздействия окружающей среды на персонажа</li>
<li>Выбор разрешения в пределах соотношения сторон монитора 4:3. Буду раз, если вы расскажете, каких разрешений не хватает именно вам</li>
<li>Опции не сохраняются между сессиями</li>
</ul>
<p>В первую очередь я жду от вас репорта о том удалось ли запустить игру (т.к. я использовал для загрузки текстур не принятый официально метод, то есть небольшая вероятность того, что движку не будет хватать набора XNA4 Framework Redistributable для загрузки текстур), и пожеланий об улучшении игры.</p>
<p>Спасибо за внимание.</p>
]]></content:encoded>
			<wfw:commentRss>http://alexbard.org.ua/2012/ignite-0-41-novaya-versiya/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Состояние на 11.04.2012</title>
		<link>http://alexbard.org.ua/2012/sostoyanie-na-11-04-2012/</link>
		<comments>http://alexbard.org.ua/2012/sostoyanie-na-11-04-2012/#comments</comments>
		<pubDate>Wed, 11 Apr 2012 19:49:15 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[ignite]]></category>

		<guid isPermaLink="false">http://alexbard.org.ua/?p=1621</guid>
		<description><![CDATA[Я сейчас усиленно работаю над тем, чтобы в скорейшем времени выпустить пре-альфу в публичный доступ. Фактически все, что осталось сделать &#8211; это добавить еще несколько эффектов ранения (сейчас персонажи только истекают кровью при ранении проникающим и режущим оружием), добавить всплывающие подсказки для противников, настроить динамическую сложность, чтобы можно было посмотреть не только на то, как [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Я сейчас усиленно работаю над тем, чтобы в скорейшем времени выпустить пре-альфу в публичный доступ. Фактически все, что осталось сделать &#8211; это добавить еще несколько эффектов ранения (сейчас персонажи только истекают кровью при ранении проникающим и режущим оружием), добавить всплывающие подсказки для противников, настроить динамическую сложность, чтобы можно было посмотреть не только на то, как орда волков спавнится в ближайшем лесу, но и на крафт со строительством.</p>
<p style="text-align: justify;">Также открытым остается вопрос о том, что делать при смерти персонажа. Пока я не хочу усложнять (себе) реализацию игры путем того, чтобы вставлять переключатель хардкор-софткор режимов. Поэтому наверняка в пре-альфе будет работать только софткор и при смерти, персонаж будет ронять все свои вещи и случайно переноситься на небольшое расстояние. Если у вас есть какие-то дополнения или пожелания по этому пункту, то высказывайте их в комментариях.</p>
<p style="text-align: justify;"><a href="http://media.indiedb.com/images/games/1/18/17130/screen.jpg"><img class="aligncenter" src="http://media.indiedb.com/cache/images/games/1/18/17130/thumb_620x2000/screen.jpg" alt="" width="620" height="465" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://alexbard.org.ua/2012/sostoyanie-na-11-04-2012/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Пишем tooltip всплывающую подсказку</title>
		<link>http://alexbard.org.ua/2012/pishem-tooltip-vsplyvayushhuyu-podskazku/</link>
		<comments>http://alexbard.org.ua/2012/pishem-tooltip-vsplyvayushhuyu-podskazku/#comments</comments>
		<pubDate>Wed, 11 Apr 2012 19:21:39 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[программирование]]></category>
		<category><![CDATA[net]]></category>

		<guid isPermaLink="false">http://alexbard.org.ua/?p=1616</guid>
		<description><![CDATA[Привет, сегодня рассказываю примерный алгоритм того, как реализованы всплывающие подсказки в Ignite. Основным требованием к всплывающей подсказке будет ее масштабируемость в зависимости от того, сколько информации в ней рисуется. Итоговый результат выглядит вот так: &#160; Первое, что необходимо сделать &#8211; это подсчитать какой размер занимает информация, содержащаяся в подсказке. Сделать это можно совершенно различными способами. [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Привет, сегодня рассказываю примерный алгоритм того, как реализованы всплывающие подсказки в <a title="Ignite roguelike" href="http://alexbard.org.ua/ignite-a-roguelike-game/">Ignite</a>. Основным требованием к всплывающей подсказке будет ее масштабируемость в зависимости от того, сколько информации в ней рисуется. Итоговый результат выглядит вот так:</p>
<p><a href="http://dl.dropbox.com/u/31655535/screenshot/tooltip.jpg"><img class="aligncenter" src="http://dl.dropbox.com/u/31655535/screenshot/tooltip.jpg" alt="" width="353" height="244" /></a></p>
<p>&nbsp;</p>
<p style="text-align: justify;">Первое, что необходимо сделать &#8211; это подсчитать какой размер занимает информация, содержащаяся в подсказке. Сделать это можно совершенно различными способами. Я записываю в структуру Point вектор расстояния от левого-верхнего угла до правого-нижнего:</p>
<p><pre><code>private void OffsetRectangleBorders(int x, int y, ref Point size)
{
    size.X += x;
    size.Y += y;
}

private void ModifyRectangleBorders(Vector2 _size, ref Point size)
{
    if (_size.X &gt; size.X) size.X = (int)_size.X;
    if (_size.Y &gt; size.Y) size.Y = (int)_size.Y;
}

//Надпись
ModifyRectangleBorders(font.MeasureString(tempItem.name), ref size);
//задаю размеры картинки
OffsetRectangleBorders(40, 0, ref size);</code></pre></p>
<p style="text-align: justify;">Теперь в size записан размер всплывающей подсказки. Теперь все готово к тому, чтобы нарисовать обрамление для подсказки. Оно состоит из нескольких ключевых элементов: четырех углов и четырех сторон, которые формируют прямоугольник. Сначала я рисую четыре угла:</p>
<p><pre><code>private void DrawBorders(Point point, Point size)
Draw(gui, new Rectangle(point.X - 5, point.Y - 5, 5, 5), new Rectangle(50, 172, 5, 5), Color.White);
Draw(gui, new Rectangle(point.X - 5, point.Y + size.Y, 5, 5), new Rectangle(60, 172, 5, 5), Color.White);
Draw(gui, new Rectangle(point.X + size.X, point.Y + size.Y, 5, 5), new Rectangle(65, 172, 5, 5), Color.White);
Draw(gui, new Rectangle(point.X + size.X, point.Y - 5, 5, 5), new Rectangle(55, 172, 5, 5), Color.White);</code></pre></p>
<p style="text-align: justify;">Я принимаю две структуры Point: положение левого-верхнего угла и размер всплывающей подсказки. gui &#8211; это текстура, с которой рисуется на экран картинка. Первый прямоугольник &#8211; положение, куда рисуется уголок, второй &#8211; его положение на текстуре gui. Заметьте, что я сдвигаю положение уголков на 5 пикселей от всплывающей подсказки. Я это буду делать и для остальных 4х сторон. </p>
<p style="text-align: justify;">Стороны я храню, как отрезки в несколько десятков пикселей, которые последовательно рисуются несколько раз, если размер всплывающей подсказки больше размера стороны:</p>
<p><pre><code>//Размер сторон
const int _yOFFSET = 37, _xOFFSET = 25;

int height = 0, width = 0;
while (_h &gt; 0) 
     { height++; _h -= _yOFFSET; }
//в height хранится информация о том, сколько
//раз подряд надо нарисовать сторону
size.Y = height * _yOFFSET;
//теперь в size.Y хранится новый размер подсказки
//зависящий от длины стороны</code></pre></p>
<p style="text-align: justify;">Рисуем стороны: </p>
<p><pre><code>for (int i = 0; i &lt; height; i++)
{
    Draw(gui, new Rectangle(point.X - 5, point.Y + i * _yOFFSET, 5, _yOFFSET), new Rectangle(50, 177, 5, 50), Color.White);
    Draw(gui, new Rectangle(point.X + size.X, point.Y + i * _yOFFSET, 5, _yOFFSET), new Rectangle(55, 177, 5, 50), Color.White);
}</code></pre></p>
<p style="text-align: justify;">После того, как нарисованы стороны, не забудьте добавить фон. Я использую полупрозрачное изображение, которое отделяет текст подсказки от игрового поля. Это изображение я растягиваю до размера size: </p>
<p><pre><code>Draw(gui, new Rectangle(point.X, point.Y, size.X, size.Y), new Rectangle(75, 172, 5, 5), Color.White);</code></pre></p>
<p style="text-align: justify;">После этого можно начинать добавлять элементы всплывающей подсказки. Также стоит помнить, что если вы не будете создавать новые элементы Rectangle при каждой перерисовке кадра(как это сделал я для скорого примера), а будете использовать заранее созданные константы, то это несколько уменьшит нагрузку на cpu при обработке вашей подсказки.</p>
]]></content:encoded>
			<wfw:commentRss>http://alexbard.org.ua/2012/pishem-tooltip-vsplyvayushhuyu-podskazku/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Изменения на 09.04.2012</title>
		<link>http://alexbard.org.ua/2012/izmeneniya-na-09-04-2012/</link>
		<comments>http://alexbard.org.ua/2012/izmeneniya-na-09-04-2012/#comments</comments>
		<pubDate>Mon, 09 Apr 2012 09:16:52 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[ignite]]></category>

		<guid isPermaLink="false">http://alexbard.org.ua/?p=1612</guid>
		<description><![CDATA[На прошлой неделе разработка продвигалась просто черепашьими шажками: навалилось куча работы и я практически ночевал на работе (думал, что придется даже в выходные выходить, но обошлось). Несмотря на это, были сделаны следующие изменения: Боевая система:  Монстры теперь охотятся на игрока Игровой персонаж может наносить удары руками и ногами в дополнении к повреждениям от оружия. Волк [...]]]></description>
			<content:encoded><![CDATA[<p>На прошлой неделе разработка продвигалась просто черепашьими шажками: навалилось куча работы и я практически ночевал на работе (думал, что придется даже в выходные выходить, но обошлось). Несмотря на это, были сделаны следующие изменения:</p>
<p><strong>Боевая система: </strong></p>
<ul>
<li>Монстры теперь охотятся на игрока</li>
<li>Игровой персонаж может наносить удары руками и ногами в дополнении к повреждениям от оружия.</li>
<li>Волк царапает лапами и кусает пастью</li>
<li>Тело любого персонажа разделено на области повреждения</li>
<li>С увеличением тяжести ранения той или иной области тела, персонажу становится все труднее владеть ею: при сильных ранах рук, он хуже сможет владеть оружием (наносить урон или парировать удары), при повреждении ног, ему сложнее будет передвигаться и т.д.</li>
<li>В бою учитывается рост персонажей: низкий персонаж будет стараться нанести удар в нижние части тела высокого противника.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://alexbard.org.ua/2012/izmeneniya-na-09-04-2012/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Местные новости</title>
		<link>http://alexbard.org.ua/2012/mestnye-novosti/</link>
		<comments>http://alexbard.org.ua/2012/mestnye-novosti/#comments</comments>
		<pubDate>Tue, 03 Apr 2012 21:53:55 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[ignite]]></category>
		<category><![CDATA[screenshot]]></category>

		<guid isPermaLink="false">http://alexbard.org.ua/?p=1609</guid>
		<description><![CDATA[На работе творится черти-что: в эти выходные сменился владелец здания, где я арендую офис. Не буду придумывать причин, тому что произошло с тех пор (хотя бы потому, что я этим изрядно занимался последние дни), а просто кратко отмечу, что до понедельника нас не пускали в помещение, а с понедельника в здании дежурит наряд вневедомственной охраны. Причем это [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">На работе творится черти-что: в эти выходные сменился владелец здания, где я арендую офис. Не буду придумывать причин, тому что произошло с тех пор (хотя бы потому, что я этим изрядно занимался последние дни), а просто кратко отмечу, что до понедельника нас не пускали в помещение, а с понедельника в здании дежурит наряд вневедомственной охраны. Причем это не просто охранники, типа тех, что в банках сопровождают инкассаторские машины, а настоящие бойцы в брониках с автоматическим оружием. Дурдом в общем, который только увеличивается с тем фактом, что работы навалилось особенно много в эти дни.</p>
<p style="text-align: justify;">Но вернемся к нашим <del>баранам</del> Игнайту: сегодня практически все время, что я смог уделить разработке игры, я потратил на отлов багов. Самый шикарный из них был баг, который снижал производительность примерно в 10000 раз (до менее 1 кадра в сек) из-за того, что я сменил свою &#8220;интеллектуальную&#8221; систему атрибутов на обыкновенное присваивание:</p>
<p><pre><code>GameAttribute ga = game.Attribute;</code></pre></p>
<p style="text-align: justify;">В общем ничего обычного в этой замене не произошло, но производительность просаживалась капитально (при этом профайлер упрямо указывал, что все процессорное время отжирает метод пересчета динамического освещения, который никоим образом это атрибутирование не использовал). Пока я полностью не выпилил свой одноколесный велосипед с атрибутами, игра упрямо не хотела идти с приличным фреймрейтом.</p>
<p style="text-align: justify;">Кроме этого бага, я отловил львиную долю багов в системе поиска пути и добавил расчет пути для монстров размеров в 9 тайлов:</p>
<p style="text-align: center;"><a href="http://dl.dropbox.com/u/31655535/screenshot/pathfindingwolf.jpg"><img class="aligncenter" src="http://dl.dropbox.com/u/31655535/screenshot/pathfindingwolf.jpg" alt="" width="514" height="514" /></a></p>
<p style="text-align: justify;">&#8230; а также добавил нового монстра &#8211; волка.</p>
]]></content:encoded>
			<wfw:commentRss>http://alexbard.org.ua/2012/mestnye-novosti/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Алгоритм поиска пути (часть 2)</title>
		<link>http://alexbard.org.ua/2012/algoritm-poiska-puti-chast-2/</link>
		<comments>http://alexbard.org.ua/2012/algoritm-poiska-puti-chast-2/#comments</comments>
		<pubDate>Sat, 31 Mar 2012 21:15:29 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[ignite]]></category>

		<guid isPermaLink="false">http://alexbard.org.ua/?p=1607</guid>
		<description><![CDATA[Итак, мне удалось завершить алгоритм поиска пути, описанный в предыдущем посте. Фактически, это первая итерация данного алгоритма и есть еще места, требующие допиливания, но уже сейчас монстры успешно преследуют игрока. И, что меня радует более всего, несмотря на то, что я специально использовал более медленные (и простые решения), скорость работы алгоритма невероятно высока &#8211; в [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Итак, мне удалось завершить алгоритм поиска пути, описанный в <a title="Алгоритм поиска пути" href="http://alexbard.org.ua/2012/algoritm-poiska-puti/">предыдущем посте</a>. Фактически, это первая итерация данного алгоритма и есть еще места, требующие допиливания, но уже сейчас монстры успешно преследуют игрока. И, что меня радует более всего, несмотря на то, что я специально использовал более медленные (и простые решения), скорость работы алгоритма невероятно высока &#8211; в тестах я не увидел ни малейшей просадки счетчика обновления кадров из-за работы данного алгоритма.</p>
<p><object width="640" height="480" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/sdl6EUmoPUc?version=3&amp;hl=ru_RU" /><param name="allowfullscreen" value="true" /><embed width="640" height="480" type="application/x-shockwave-flash" src="http://www.youtube.com/v/sdl6EUmoPUc?version=3&amp;hl=ru_RU" allowFullScreen="true" allowscriptaccess="always" allowfullscreen="true" /></object></p>
]]></content:encoded>
			<wfw:commentRss>http://alexbard.org.ua/2012/algoritm-poiska-puti-chast-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Алгоритм поиска пути</title>
		<link>http://alexbard.org.ua/2012/algoritm-poiska-puti/</link>
		<comments>http://alexbard.org.ua/2012/algoritm-poiska-puti/#comments</comments>
		<pubDate>Fri, 30 Mar 2012 10:57:28 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[ignite]]></category>
		<category><![CDATA[программирование]]></category>

		<guid isPermaLink="false">http://alexbard.org.ua/?p=1597</guid>
		<description><![CDATA[Привет, сегодня я расскажу о алгоритме поиска пути, который используется в Игнайте. Это алгоритм А* с некоторыми нестандартными условиями: первое из них &#8211; изменяющийся размер юнитов (1 &#8211; 16 клеток) второе &#8211; несмотря на свой размер, юнит всегда за раз передвигается на 1 клетку (т.е. на расстояние в 1/4 &#8211; 1 собственного размера) третье &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Привет, сегодня я расскажу о алгоритме поиска пути, который используется в Игнайте. Это алгоритм А* с некоторыми нестандартными условиями:</p>
<ul>
<li>первое из них &#8211; изменяющийся размер юнитов (1 &#8211; 16 клеток)</li>
<li>второе &#8211; несмотря на свой размер, юнит всегда за раз передвигается на 1 клетку (т.е. на расстояние в 1/4 &#8211; 1 собственного размера)</li>
<li>третье &#8211; некоторые юниты должны иметь возможность проходить сквозь стены (разрушая их) в случае, если нет ближайшего обходного пути</li>
<li>четвертое &#8211; перемещение в 4-е стороны</li>
<li>и последнее &#8211; алгоритм не должен замедлять выполнение программы и, одновременно, рассчитывать собственный путь для каждого юнита отдельно</li>
</ul>
<p style="text-align: justify;">Предупреждаю сразу, что это первая итерация моего алгоритма и я приветствую любые замечания и улучшения, особенно те, которые направлены на ускорение его работы.</p>
<p style="text-align: justify;">Итак, для начала определимся с тем, что у нас уже есть до начала работы алгоритма:</p>
<ul>
<li>алгоритм пересчитывается только после изменения определенных параметров (в моем случае &#8211; это инкрементация счетчика времени)</li>
<li>путь просчитывается не для всех существ на карте, а для готовой выборки из рядом находящихся юнитов (этот список готовится отдельно)</li>
<li>более того, если существо не передвигалось в этом ходу, то для него не нужно искать новый путь</li>
</ul>
<p>Теперь можно запускать сам алгоритм:</p>
<ul>
<li>заносим клетку, на которой находится юнит, в отрытый список</li>
<li>просматриваем соседние клетки на предмет проходимости</li>
</ul>
<p>Так как юнит может быть размером больше 1 клетки, то в этом случае нужно проверять не одну клетку, а несколько соседних, т.е. вместо проверки свойства проходимости конкретной клетки, делать проверку наподобие следующей:<br />
<pre><code>private bool MovementCheck(MovementDirection md)
{
   int x, y; // положение юнита
   //...
   if (md == MovementDirection.Left &amp;&amp; unitSize == UnitSize.Size3x3)
   {
      return Tiles[X - 1, y].Passabillity &amp;&amp; Tiles[X - 1, y - 1].Passabillity 
        &amp;&amp; Tiles[X - 1, y + 1].Passabillity;
   }
   //...
}</code></pre><br />
, которая проверяет проходимость сразу нескольких клеток.<br />
Для дальнейшего ускорения расчетов, можно получать от этой функции не bool, а числовое значение сложности перехода (и, например, -1, если прохода нет).</p>
<p>Все клетки, которые удовлетворяют критериям проверки, нужно занести в открытый список, указав в них ссылку на первую родительскую клетку. </p>
<ul>
<li>Удаляем первую родительскую клетку из открытого списка, т.к. ее больше не нужно проверять и заносим ее в закрытый список. Клетки которые находятся в закрытом списке никогда не должны попадать в открытый</li>
</ul>
<p><strong>Оценка пути</strong><br />
Теперь, когда в открытом списке есть несколько элементов, встает вопрос: какой же из них нужно выбрать для последующего анализа? Единого ответа на этот вопрос существовать не может, т.к. вариантов тут такое же множество, как и задач, которые можно решить с помощью данного алгоритма.<br />
В нашем случае должна быть предварительно проведена оценка стоимости пути для каждой клетки. Определить стоимость пути можно по следующей формуле:<br />
<strong>F = G + H</strong><br />
, где F &#8211; стоимость продвижения на клетку А<br />
G &#8211; стоимость продвижения со стартовой клетки до клетки А<br />
H &#8211; примерная стоимость продвижения с клетки А до конечной клетки</p>
<p>H &#8211; это эмпирическая функция, которая определяется не точно. Зачастую используют метод Манхетенна для определения H: суммируют расстояние по абсциссе и ординате и умножают на среднюю стоимость передвижения из одной клетки в другую.</p>
<p>Путь генерируется вычислением клетки (из открытого списка) с наименьшей стоимостью перемещения и добавлением ее соседей в открытый список. В случае, если текущая клетка, которую взяли для проверки, как очередную, оказывается конечной клеткой, то считается, что алгоритм нашел кратчайший путь, который может быть отслежен от последней клетки к первой через обратные ссылки.</p>
<p>В целом, я почти дословно пересказал А* алгоритм (моими отличием стала только функция для определения проходимости соседней клетки). Вторым дополнением станет тот факт, что если юнит может проходить сквозь стены (например, призрак или замляной червь), то функция определения проходимости вместо возвращения непроходимости данной клетки должна возвращать факт того, что движение по этой клетке имеет большую стоимость, чем движение по открытой.<br />
В таком случае, алгоритм все равно будет искать обходной путь, но в случае, если такого не будет найдено (например, игрок специально заблокировал проход блоком в надежде спастись таким образом от врага), то монстр сможет прокопать себе проход сквозь преграду.</p>
<p>Для оптимизации вычисления выполнение данного алгоритма можно выполнять не в один момент времени, а растянуть на несколько тактов. Т.к. все вычисления связаны обработкой клеток в открытом списке, то структурно подобные отложенные вычисления можно представить в виде следующего метода: </p>
<p><pre><code>public void Update()
{
   if (game.updateCounter == UpdateCounter.TimeIncrement)
   {
      openList.RemoveAll();
      closedList.RemoveAll();
      Push(new GridElement(x,y), openlist);
      SavePath = null;
   } else if (game.updateCounter == UpdateCounter.TickUpdate &amp;&amp; PathDidnotFound)
   {
      int i = 0;
      while (i &lt; _MAXSTEPS)
      {
         GridElement Next = FindNextElement(openList);
         if (SavePath == null &amp;&amp; i != 0) SavePath = Next;
         CalculateGridElement(Next);
         i++;
      }
   }
}</code></pre></p>
<p>Теперь, если мы предположим, что основным побуждением изменения таймера внутриигрового времени являются действия игрока, и эти действия имеют задержку выполнения, например 250 мс (т.е. не больше 4-х действий в секунду), то имея частоту обновления игры 60 Гц, мы получаем, что данные вычисления будут выполняться, как минимум 15 раз до того, как игрок совершит следующее действие (которое побудит существо пересчитать свой путь). Константа _MAXSTEPS должна быть вычислена экспериментально. </p>
<p>На тот случай, если игрок совершает новое действие, а подобный отложенный алгоритм так и не завершил свои вычисления, я задаю специальную переменную SavePath, которая хранит ближайшую к монстру наиболее пригодную для перемещения клетку. </p>
]]></content:encoded>
			<wfw:commentRss>http://alexbard.org.ua/2012/algoritm-poiska-puti/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Система повреждений: зоны урона</title>
		<link>http://alexbard.org.ua/2012/sistema-povrezhdenij-zony-urona/</link>
		<comments>http://alexbard.org.ua/2012/sistema-povrezhdenij-zony-urona/#comments</comments>
		<pubDate>Tue, 27 Mar 2012 21:38:39 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[ignite]]></category>

		<guid isPermaLink="false">http://alexbard.org.ua/?p=1592</guid>
		<description><![CDATA[Только что закончил рисование и программную часть отображения зон урона для игрока. Этот индикатор находится в нижней-левой части скриншота. Здоровье игрока (и всех персонажей) теперь представлено не просто безликим числом, а состоянием его тела. Тело любого гуманоида делится на голову, торс, ноги и 2 руки. Игрок умрет, когда состояние его тела станет критическим и продержится [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://dl.dropbox.com/u/31655535/screenshot/newHealthBar.jpg"><img class="aligncenter" src="http://dl.dropbox.com/u/31655535/screenshot/newHealthBar.jpg" alt="" width="614" height="461" /></a></p>
<p style="text-align: justify;">Только что закончил рисование и программную часть отображения зон урона для игрока. Этот индикатор находится в нижней-левой части скриншота. Здоровье игрока (и всех персонажей) теперь представлено не просто безликим числом, а состоянием его тела. Тело любого гуманоида делится на голову, торс, ноги и 2 руки. Игрок умрет, когда состояние его тела станет критическим и продержится на таком уровне определенное время. Каждая зона имеет собственные уязвимости перед повреждениями. Например, кинжалом можно пробить грудь и повредить легкие, что приведет к удушью персонажа, а позднее &#8211; к смерти, если быстро его не вылечить; или топором можно отрубить конечность и тогда персонаж теряет возможность пользоваться предметами этой рукой.. и т.д.</p>
<p style="text-align: justify;">У некоторых монстров будут отсутствовать уязвимости, присущие игроку и другим монстрам. Например, убийство каменного голема, механического паука или банального зомби станет нетривиальной задачей, т.к. у них не будет привычных уязвимостей, приводящих к летальному исходу.</p>
<p style="text-align: justify;">В альфу я планирую включить только режущее оружие и все связанные с ним эффекты повреждений. Урон такого оружия напрямую зависит от физических характеристик самого оружия, его владельца и врага. Например, топор ввиду своего размера будет всегда наносить критические повреждения по небольшой крысе.</p>
]]></content:encoded>
			<wfw:commentRss>http://alexbard.org.ua/2012/sistema-povrezhdenij-zony-urona/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

