Как мне переместить мой круг к заранее определенной координате x, y? - PullRequest
2 голосов
/ 13 июня 2019

У меня есть массив "food", и у меня есть цикл for, который получает x и y этой еды.Еда - это просто красная точка, которая размещается случайным образом в окне.Имея x и y, как мне переместить мой круг к этим координатам с определенной скоростью?

pygame.draw.circle(win, (0, 255, 0), (round(x), round(y)), radius)
index = 0
for index in food_list:
    food_x, food_y = index[0], index[1]
    distance_x, distance_y = food_x - x, food_y - y
    stepx, stepy = distance_x * speed, distance_y * speed
    x = x + stepx
    y = y + stepy

С этим кодом мой круг красиво перемещается к первому элементу питания, но идет только наполовину ко второму.и он продолжает двигаться все меньше и меньше, пока не движется вообще.Кроме того, круг начинает замедляться, когда он почти достигает своей пищи, которую я не хочу.

1 Ответ

1 голос
/ 14 июня 2019

Вы должны рассчитать Единичный вектор из кружка в направлении пищи (длина единичного вектора равна 1).Масштабируйте единичный вектор на speed и добавьте результат к координате круга.
В пигме вы можете использовать pygame.math.Vector2 для векторных вычислений, .normalize() вычисляет вектор единиц:

p_food = pygame.math.Vector2(index[0], index[1])
p_circle = pygame.math.Vector2(x, y)
unit_dir = (p_food - p_circle).normalize()

x += unit_dir.x * speed
y += unit_dir.y * speed

Конечно, это можно упростить:

x, y = (pygame.math.Vector2(index) - (x, y)).normalize() * speed + (x, y)

Если вы хотите перейти от еды к следующей, то вы можете 'Делайте это в таком цикле, как это, но вы можете переходить от продуктов к списку один за другим.Используйте индекс (food_i), чтобы определить следующий объект food_list для перехода.Увеличивайте индекс, когда еда достигнута:

Инициализируйте индекс следующей еды перед основным циклом программы:

food_i = 0

Вычислите расстояние от центра круга доеда по .distance_to () в цикле применения:

p_food = pygame.math.Vector2(food_list[food_i])
dist = p_food.distance_to((x, y))

Переместите круг на один шаг к еде.Убедитесь, что круг не перешагивает через еду, вычислив минимальное оставшееся расстояние и расстояние в один шаг (min(dist, speed)):

if dist > 0:
    x, y = (p_food - (x, y)).normalize() * min(dist, speed) + (x, y)

Переключитесь на следующую еду, если еда достигнута:

if dist < speed and food_i < len(food_list)-1:
    food_i += 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...