Показать все 6 сообщений этой темы на одной странице |
HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Странности FGetNodeRoute (https://hlfx.ru/forum/showthread.php?threadid=5841)
Странности FGetNodeRoute
Вопрос к тем, кто изучал работу поиска в нод графе.
Решил я как-то улучшить TASK_MOVE_AWAY_PATH у монстров-союзников (когда они отходят, если игрок старательно их толкает).
В дефолтной реализации первым делом там пробуется построить маршрут на 100 юнитов позади от монстра через MoveToLocation, тот в свою очередь приводит к вызову BuildRoute, который уже пробует три способа: построение прямого пути, триангуляцию и если не получилось, то поиск пути по нодам, через FGetNodeRoute.
Так вот, я заметил, что MoveToLocation возвращает успех, даже когда по логике он должен фейлится. А всё потому что FGetNodeRoute строит совершенно замечательные пути.
Чтобы посмотреть, что за путь получается, можно использовать существующую в HLSDK функцию DrawRoute в monsters.cpp, которая рисует пути лучами (возможно вам придется закомментировать #ifdef _DEBUG и соответствующий #endif). В самой функции нужно в двух местах увеличить время отображения лучей.
Заменяем
WRITE_BYTE( 1 ); // life |
WRITE_BYTE( 50 ); // life |
DrawRoute(pev, m_Route, m_iRouteIndex, 255, 0, 0); |
__________________
I'm on github
I'm on opendesktop.org
__________________
Окей, кажется, я нашёл, в чем проблема:
Сначала строится путь до ближайшего нода, а потом последняя точка маршрута добавляется в путь без каких-либо проверок.
1 | if( iNumToCopy < ROUTE_SIZE ) |
2 | { |
3 | m_Route[iNumToCopy].vecLocation = vecDest; |
4 | m_Route[iNumToCopy].iType |= bits_MF_IS_GOAL; |
5 | } |
__________________
I'm on github
I'm on opendesktop.org
Монстрами никогда особо не интерисовался, но однажды заметил вот какую особенность. Если аккуратно и правильно расставлять ноды посредине помещений, ну т.е. чтобы монстры не тупили, то получим совершенно замечательный эффект. Монстры бегут по этим нодами, аки поезд по патч_корнерам, т.е. не уходя и не сворачивая с прямой линии.
Меня это обстоятельство настолько изумило, что я даже чяем поперхнулся.
Я-то думал, что ноды - оно скорее для ориентира. А оказывается, они используются именно как путь, с которого очень нежелательно сворачивать.
Исходя из вышесказанного, даже квака с её тупым рандомным выбором направления заставляет монстров зачастую выглядеть живее.
К тому же Кармак исходил из предположения, что Human Hull - это уже готовый навмеш, которому никакие костыли больше не требуются.
Но у Вальвовцев было иное мнение. То ли они не дотумкали как устроены клипхуллы, то ли ноды изначально делались именно как продвинутый аналог патч_корнеров (мы же помним, что в них есть хинты с проигрыванием анимаций, которые так никогда и не были заюзаны), но по факту система навигации в хл очень и очень странная.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
__________________
I'm on github
I'm on opendesktop.org
__________________
Временная зона GMT. Текущее время 12:01. | Показать все 6 сообщений этой темы на одной странице |
На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024