23 мая 2011 г.

Стоимость передвижения в A star

В прошлых примерах мы рассматривали только два типа проходимости, где можно пройти и где нельзя. Давайте исправим ситуацию и рассмотрим реализацию, когда каждая клетка имеет разную степень проходимости, или как ещё говорят имеют разный вес. Мы просто раздадим разным клеткам разный вес в зависимости от рельефа. Чем темнее у нас будет клетка, тем больше времени она будет отнимать у "путника", который будет по ней идти.

Как же это реализовать? А все очень и очень просто! В структуре CMapChunk (смотрите прошлые статьи) мы введем дополнительный параметр RankPassability, который будет хранить вес проходимости.

Я, например, заполнил так, что в середине карты у меня получилась синусоида, как будто тропа между холмами :)

Сейчас вы наверно подумали, опять будет куча расчетов и нудятины, а вот и ничего подобного!

Как один из вариантов: мы просто в оценке пути при расчете F (F это сумма G и H) умножаем его результат на вес клетки:

Chunk.F = (Chunk.H + Chunk.G) * WayMap->GetRankPass(Chunk.ID);

Если вам эта строка ни о чем не говорит, и вы не знаете что такое F, H и G, то вы не читали мои прошлые статьи. А зря :)

ДА! И это все :) Вот результат:

Но внезапно на нашем пути появилась китайская стена :)

Ну и последний пример:

Таким образом можно задать болота, реки, рельеф и другие типы местности на карте.


0 коммент.:

Отправить комментарий