![]() |
С какой стороны обойти "неведомую..."
Вложений: 1
Привет всем.
Прикрепил картинку, на ней изображено два пути движения объекта к цели. Мне бы узнать как найти нужный коэффициент, чтобы Объект поворачивал и шел по короткому пути. Что за коэффициент? Он отвечает за поворот Объекта или +15 градусов или -15 градусов, с этим смещением угла мы будем проверять перед нами есть "неведомая..." или нету. И еще бонусный вопрос: Для избежания цикла, который будет пробегать по всем объектам на сцене которые нужно обходить я хочу создать пустой мувиклип и в него создать те объекты. Так вот прокатит ли ХитТестПоинт?За один раз по идее должен проверить все, если сделать Мувиклипдляобьектов.hitTestPoint(x,y,true) |
Может лучше использовать стандартный алгоритм обхода препятствий А* (А-стар, А-звездочка) ?
|
|
Не стандартным алгоритмом без использования сетки, говорят, тоже можно:
http://www.flasher.ru/forum/showpost...29&postcount=2 |
Такая задача лучше решается аппроксимацией препядствий к многоугольникам. В таком случае самый короткий путь будет однозначно опираться на вершины этих многоугольников.
Далее, существует много разновидностей А* алгоритма, но в чистом виде А* интересен только как теория - на практике он очень медленный. Отличие этого алгоритма заключается в том, что у него есть эвристическая функция которая "примерно"* рассчитывает расстояние до цели. Благодаря этой функции можно строить стек по приоритетам какие узлы просматривать следующими. В вашем случае эвристической функцией может быть расстояние по прямой до цели. Таким образом будет выбран узел (точка пересечения пути и многоугольника ограничивающего препядствие) который ближе всего к конечной цели. На следующем этапе будут опять проверены все узлы-потомки на предмет приближенности к цели, и, скорее всего будет раскрыт не потом узла раскрытого на предыдущем этапе, а его сосед (см. картинку). Код:
| (1) | (2) | (3) | (4) | (5)Есть несколько вариантов тактик обхода дерева, можно при нахождении узла-соседа с лучшим показателем записывать в предыдущем значение лучшего узла-наследника и "закрывать" его, переходя в проверку нового найденного лучшего узла. Можно пытаться не смотря ни на что добраться до целевого узла, а потом проверять остальные "хорошие" узлы, которые были встречены на пути - при обнаружении лучшего пути, заменить им бывший выбранный, и повторить процедуру. Но что самое хорошее в этом деле, так это то, что алгоритмы поиска пути еще все не найдены, и у вас есть все шансы найти лучший :) * - эвристическая функция должна быть "оптимистической" - т.е. она никогда не должна переоценивать сложность перехода к целевому узлу. |
Да читал про А стар, еще когда мне указывали о нем в старой теме.
Но я просто не понимаю как работать с этой сеткой. Например как по координатам объекта определить в какой клетке он находится? И поэтому отказался от этого. И подошел к способу как на "хитри", в общем сделал почти как там, упустив несколько моментов. И у меня получилась так, что Персонаж начал обходить препятствие по длинному пути,а это зависит от того коффа который мне нужно определить. И опять же Цитата:
|
Цитата:
Код AS3:
|
А* не имеет непосредственного отношения к сетке. Сетка имеет смысл если объекты могут передвигаться исключительно квадратно-гнездовым способом. Но если объекты передвигаются так, как у вас показано на рисунке, то лучше строить направленный граф в котором ребра - цена перехода от одной вершины многоугольника описывающего препядствие до другой вершины. Получится невпример быстрее.
Очень хорошо, подробно и с иллюстрациями алгоритмы поиска пути разбирает Питер Норвиг (Peter Norvig, Artificial Intelligence A Modern Approach / AIMA). Это практически должно быть настольной книжкой игродела :) |
Цитата:
Апну тему, коли не закрыта и вопрос актуален. Что я делаю и хочу сделать. Я создаю объекты через цикл и записываю в переменный координаты квадрата, где они находятся. Нооооооо... Вообщем выложу код Код AS3:
|
Цитата:
Код AS3:
|
| Часовой пояс GMT +4, время: 07:41. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.