Спрятать поведение только с векторами к врагу и укрытию - PullRequest
2 голосов
/ 08 марта 2019

Для класса pygame меня просят реализовать различные способы поиска с ограниченной информацией об игровом мире.Большинство поведений было легко сделать, но я заблокирован, пытаясь реализовать скрытое поведение с помощью информации, к которой у меня есть доступ.

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

В графическом плане я пытаюсь найти вектор b на этом изображении, у меня естьдоступ к вектору u и v, и я пытаюсь вычислить вектор w плюс скаляр a для предполагаемого расстояния от столбца + его радиус.

Vector graphics

У меня в данный момент работает этот код, но он явно неверен, поскольку вычисляемый мной вектор находится за пределами игрового мира.

player_to_col_vector = (
    col_distance[0] - enemy_distance[0],
    col_distance[1] - enemy_distance[1],
)

normalized = 1 / sqrt(player_to_col_vector[0] ** 2 + player_to_col_vector[1] ** 2)
dx = normalized * acceptable_distance
dy = normalized * acceptable_distance

Я думаю, что моя проблемав том, что у меня теперь есть вектор wa, но я понятия не имею, как найти вектор b из имеющейся у меня информации.

1 Ответ

1 голос
/ 08 марта 2019

Я предполагаю, что acceptable_distance соответствует размеру вектора a в изображении. Итак, acceptable_distance - это расстояние между C и D

.

Расчет нормализованного вектора неверен. normalized - обратная длина вектора от B до C :

normalized = 1 / sqrt(player_to_col_vector[0] ** 2 + player_to_col_vector[1] ** 2)

Далее lenBC - это расстояние между B и C . dirBC представляет собой Единичный вектор (это означает, что его длина равна 1) и является формой направления B до C :

lenBC = sqrt(player_to_col_vector[0] ** 2 + player_to_col_vector[1] ** 2)
dirBC = (player_to_col_vector[0] / lenBC, player_to_col_vector[1] / lenBC)

(dx, dy) - вектор от C до D .

dx, dy = (dirBC[0] * acceptable_distance, dirBC[1] * acceptable_distance)

Вектор b , равный точке D , представляет собой сумму вектора v и вектора a :

bx, by = (col_distance[0] + dx, col_distance[1] + dy)   

Вектор от точки B до D представляет собой сумму w и a:

BDx, BDy = (player_to_col_vector[0] + dx, player_to_col_vector[1] + dy)

Удалено, поскольку тег "pygame" был удален.

Приведенный выше код выполняет все расчеты. Но обратите внимание, в PyGame есть гораздо более простой способ сделать это, используя pygame.math.Vector2 для вычислений:

u = pygame.math.Vector2(enemy_distance)
v = pygame.math.Vector2(col_distance)  

w = v - u
a = w.normalize() * acceptable_distance
b = v + a

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...