forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Алгоритмика (http://forum.boolean.name/forumdisplay.php?f=21)
-   -   "way finding", пасаны! :) (http://forum.boolean.name/showthread.php?t=16014)

ANIK123 11.12.2011 01:28

"way finding", пасаны! :)
 
Кто Меня встречал на форуме в других темах тот знает что Я замышляю создать игру которая "перевернет Ваши стереотипы" :-D
Дошел Я до ИИ
А конкретнее до поиска пути
Игра простая - можно сказать двухмерная (физика вычисляется в двух измерениях)
Есть юниты
На пути к игроку стоят препятствия
В мире нету никаких сложных лабиринтов - просто попадаются астероиды или другие юниты состоящие из компаундов
Думал проще всего сделать поиск с помощью рэйкаста - попробовал реализовать - первая попытка увенчалась неудачей) Но и с ней было видно что это дело достаточно ресурсоемко
Выходом есть разве что обновлять путь раз-два в секунду и еще поставить его просчет на отдельный поток - но все же...
Интересуюсь - подскажите наиболее оптимальный способ)

RegIon 12.12.2011 11:35

Ответ: "way finding", пасаны! :)
 
Spherecast можно юзать,или колайдер в тригерном режиме,или RayCast,смотря для чего

ANIK123 13.12.2011 01:10

Ответ: "way finding", пасаны! :)
 
Короче в итоге сделал предельно просто: посылается луч и в цикле немножко сдвигается то в один бок то в другой - как-то-так:
Код:

bool way_find_switch = false;//переключатель - указывает в какую сторону на данный момент двигаться
usi way_find_turn = 5;//на сколько градусов прибавляется поворот с каждым проходом в цикле
for (; way_find_turn <= 180; ){
        xPointEntity(way_piv, PLAYER->poi);
        if (!way_find_switch){xTurnEntity(way_piv, 0.0f, way_find_turn, 0.0f);}//смотрим вправо
        if (way_find_switch){xTurnEntity(way_piv, 0.0f, -way_find_turn, 0.0f); way_find_turn += 5;}//и влево + плюсуем поворот
        xTFormVector(0.0f, 0.0f, see_range - 3, way_piv, 0);//смотрим
        xPhysicsRayCast(xEntityX(way_piv), xEntityY(way_piv), xEntityZ(way_piv), xEntityX(way_piv) + xTFormedX(), xEntityY(way_piv) + xTFormedY(), xEntityZ(way_piv) + xTFormedZ(), false);//присматриваемся)))
        way_find_switch = !way_find_switch;
        if (xPhysicsGetHitEntity(0) != 0){
                if (xPhysicsGetHitEntity(0) == PLAYER->poi){
                        find = 1;
                        //игрок найден!)
                        break;
                }
                else {
                }
        }
        else {//нашли ближайший обход)
              }
}

С какой стороны ближе мы перестанем натыкатся на преграду - в эту сторону и двигаемся
Короче фигня но пока сойдет
:-D

ЗЫ: А можно по-подробнее о Spherecast и о триггерном состоянии? Собсно интересует их реализация в ксорсе)


Часовой пояс GMT +4, время: 21:35.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot