Войти
ПрограммированиеФорумОбщее

RTS: перемещение юнитов по карте через узкие проходы, в которых стоят другие юниты (2 стр)

Страницы: 1 2
#15
(Правка: 20:58) 20:52, 3 июня 2021

Robotex
На момент поиска мы знаем когда клетка освободится и не должны ее отбрасывать

Во второй ссылке есть видео как все это в итоге будет работать


#16
(Правка: 6:50) 6:42, 4 июня 2021

Robotex
> а вот в таком случае хз как быть
> > -———————————--—————————————————
> | * Б <- A
> -———————————--—————————————————
> звездочка это куда А хочет попасть
>
> по логике А должен выйти, потом должен выйти Б, а потом должен зайти А и после
> него Б должен вернуться на свое место

теоретически Б и А должны "договорится" о месте развилки.
Если такого места "развилки" нет, то А не может попасть к заданному месту
Если развилка есть, то и А и Б идут к ней, "меняютя местами" и дальше идут к своим целям.
"меняются местами" означает, что на место "развилки" встал Б, отошёл, потом её занял "А"

Соответственно если на "мосту" больше чем один юнит Б, то нужно "развилки" искать для каждого юнита, который должен отойти.

          |---
          |   
-----------   
|* Б <- А  @  
-----------   
          |
          |---
@ - место развилки. Её достижение важно, с точки зрения ИИ. Т.к. нужно знать тот момент, когда можно начинать идти к своей цели.

но с точки зрения игрока, это может оказаться немножко жестью.
Потому что он даёт команду А идти влево, и вдруг оба юнита начинают ползти вправо.
Может это и прокатит для какой-нить РПГ, но для РТС... чё-то я сомневаюсь!

Опять же. Всё это должно опираться на информацию о карте. Т.е. знать где есть "мосты", чтобы "мостовые тролли" (который Б) мог знать куда отойти, чтобы пропустить другие юниты.

ЗЫ: почитал... как-то муторно с "развилкой" должно быть проще. Но всё осложняется тем, что сам "А" должен уступить дорогу выходящему "Б"

#17
13:24, 4 июня 2021

skalogryz
> подход с критической секцией лучше.
>
А как ты их сделаешь, если такие проходы в основном между зданиями на базе образуются

#18
20:26, 4 июня 2021

столкнулись, поругались, перестреляли друг друга -  путь свободен.

#19
(Правка: 21:12) 21:08, 4 июня 2021

Robotex
> А как ты их сделаешь, если такие проходы в основном между зданиями на базе образуются
гейм дизайном, очевидно xD
хотя здание и занимает определённые клетки, но "край" здания не занимает клетку целиком, оставляя пространство для манёвра :)

Но если алгоритмически серьёзно, то

          |---
          |   
-----------   
|* Б <- А  @  
-----------   
          |
          |---

ТО

  • определить путь от (А к *) (путь 1), без учёта юнитов
  • если на пути 1, есть стационарный юнит (или "патруль"), то определить от А к *, с учётом стационаров и патрулей (путь 2).
  • если путь 2 есть, то его используем как итоговый. (выходим)
  • если путь 2 не определяется, то для каждого стационарного юнита:
  • ищем ближающую точку НЕ принадлежащую к путь 1
  • если такого пути нет, то выполняем поиск (обходом в ширину) точки "выхода" для юнита А. (на каждой итерации это точка a2)
  • на каждой итерации точки а2, мы проверяем, чтобы точка a2 не принадлежала ни одному из путей "ближайшего выхода".
  • если такой точки, нет, то считаем, что А не может достичь * (что не всегда правильно)
  • ----------+
    |* Б В <-А| 
    ----------+

  • если поиск дал результаты, то юнит А начинает движение в точку А2. (освобождает место для выхода других юнитов)
  • ---------------+
    |* Б В <-А   a2| 
    ----------+    |
              |b2v2|
              +----+

    Вот этот подход немножко убогий и колючий (но должен работать). Потому что он основывается на "стационарности". (юнит "достиг точки и проверяет путь")
    Вместо этого правильно делать что-то более синхронное, и проверять доступность клетки в засимости от прошедшего времени.

    Т.е. проходимость клетки будет зависит от путей юнитов Б (и их скорости).

    Это реализовать не так сложно, но необходоимо иметь пути Б и В, и считать, что А подчинается их прихотям.
    Тогда при постройке алгоитмом А* зная текуший шаг, а так же на каком шаге и где были юниты Б, можно знать проходима точка или нет.

    #20
    (Правка: 21:39) 21:24, 4 июня 2021

    skalogryz
    > Это реализовать не так сложно, но необходоимо иметь пути Б и В, и считать, что
    > А подчинается их прихотям.
    > Тогда при постройке алгоитмом А* зная текуший шаг, а так же на каком шаге и где
    > были юниты Б, можно знать проходима точка или нет.

    ---------------+
    |* Б В <-А     | 
    ----------+    |
              |    |
              +----+
    ---------------+
    |* Б12345678901|  (коллизия с А на шаге 3, если А побежит на Б)
    ----------+901 |
              |01  |
              +----+
    ---------------+  (коллизия с А на шаге 2, если А побежит на В)
    |*   В123456789| 
    ----------+789 |
              |89  |
              +----+

    при опредлении пути для А, мы будем знать, на каких "дорога будет непроходимой" (в соответствующих клетках), то алгоритм выведет нас куда-нить на точку 8, и заставит там стоять... ну да. нужно добавить направление "стоять на месте"

    хм...а в каких случаях применять "стоять на месте"? только если юниту идти некуда (т.к. он подчинённый путям Б и В). А так же, как пост-оптимизация, если юнит начинает "кружить на месте".

    #21
    (Правка: 15:33) 15:32, 8 июня 2021

    rcsim
    > Steering Behaviors. В частности в составе формаций.
    Подскажи, как правильно, не могу придумать.

    Я предполагаю, когда группа идет по полю, она может всех юнитов, которые стоят в IDLE и преграждают путь, попросить уступить дорогу.

    Правильно ли я понимаю, что в таком случае нужно активировать этому юниту Separation с ближайшими соседями, ObstacleAvoidance и Arrive в позицию, в которой он уже стоит (чтобы он не убегал из этой позиции, а старался остаться в ней, уворачиваясь от юнитов)?

    Я не совсем понимаю, как перевести IDLE-юнита в стейт AvoidGroup. Как это принято делать в RTS? Должен ли этот юнит сам мониторить наличие движущихся групп в небольшой окрестности вокруг него? Или же движущийся юнит должен проверять нет ли в некоторой области перед ним IDLE-юнитов и просить их уступить дорогу?

    Когда юнит, уступавший дорогу, может снова вернуться в IDLE и выключить стиринг? Когда вокруг нет ни одного движущихся юнита? Или когда группа, просившая уступить, ушла от него?

    #22
    (Правка: 22:29) 18:25, 8 июня 2021

    Robotex
    > Подскажи, как правильно, не могу придумать.

    Как "правильно" и "принято" я не знаю, т.к. RTS не писал, я сам экспериментирую.

    У меня агенты на верхнем уровне управляются лидером группы.
    Реализовано не в FSM а в Behavior tree (но это не столь важно).

    > попросить уступить дорогу ... старался остаться в ней, уворачиваясь от юнитов?
    На мой взгляд нормально.
    Только я бы им сказал делать Flee из нужного места до момента освобождения прохода.
    После чего могут возвращаться. Узкие места лучше всего оснастить очередью/светофором.

    У меня есть система коммуникаций между юнитами/группами.
    И группы имеют приоритет. Например IDLE-юнит должен уступать активно двигающимся.
    Или по скорости: в приоритете быстрый, или по размеру группы.


    > Должен ли этот юнит сам мониторить наличие движущихся групп в небольшой окрестности вокруг него?
    > Или же движущийся юнит должен проверять нет ли в некоторой области перед ним IDLE-юнитов и просить их уступить дорогу?

    Тут по разному можно, зависит как работает Avoidance, но по сути мне кажется логичне чтоб активный (движущийся)
    заботился о своём пути, и был инициатором коммуникаций.

    #23
    20:57, 8 июня 2021

    rcsim
    > И группы имеют приоритет. Например IDLE-юнит должен уступать активно двигающимся.
    > Или по скорости: в приоритете быстрый, или по размеру группы.
    почему бы не делать наиболее приоритетным по последней команде игрока?
    последний отряд получивший команду имеет наивысший приоритет.

    #24
    22:25, 8 июня 2021

    skalogryz
    > почему бы не делать наиболее приоритетным по последней команде игрока?

    Не совсем так, надо учитывать автономность: тот который последний, пришел на место и встал.
    А в классических RTS можно задать круговое патрулирование по точкам. И/или юниты умные,
    по алерту побежали мочить козлов.

    Т.е. какой приоритет - это геймдизайн решение, надо смотреть и отлаживать.

    Страницы: 1 2
    ПрограммированиеФорумОбщее