Как заставить врага следовать за игроком в pygame?

Я сделал часть игры. Он работает хорошо, но я хотел бы добавить в игру врагов. Пока я добавляю изображение врагов в спрайтах pygame. Но как заставить врагов следовать за игроком? Я попытался сделать это, но он просто сделал изображение врага прямо игроку:

def moveEnemy(self): enemies.rect.x = player.rect.x enemies.rect.y = player.rect.y all_sprites_list.add(enemies) enemies_list.add(enemies) 

Я думал, что это сделает изображение врага, следуя за игроком. Вместо этого он просто совпадал с изображением игрока. Я читал, хотя многие примеры спрайтов pygame sprites, но в примерах говорится, что вместо «враги.rect.x = player.rect.x» вместо «enemy.rect.x = -5» или что-то в этом случае. Я также пробовал это, но просто переместил изображение вместо того, чтобы следовать за игроком. Должен ли я формулировать уравнение? Если так, я не знаю, как это сделать. Как заставить врага двигаться, но также заставить его следовать за игроком? Может ли кто-нибудь помочь мне решить эту проблему? Любая помощь будет оценена по достоинству. Windows 7, Python 2.6, Pygame 2.6, спрайты.

3 Solutions collect form web for “Как заставить врага следовать за игроком в pygame?”

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

 import math class Enemy(object): ... def move_towards_player(self, player): # find normalized direction vector (dx, dy) between enemy and player dx, dy = self.rect.x - player.rect.x, self.rect.y - player.rect.y dist = math.hypot(dx, dy) dx, dy = dx / dist, dy / dist # move along this normalized vector towards the player at current speed self.rect.x += dx * self.speed self.rect.y += dy * self.speed 

Вам нужно будет добавить проверки, чтобы определить, будет ли вражеский объект превышать и тем самым ударить игрока по пути, если он сдвинет это расстояние, и отреагировать соответствующим образом. Подсказка: столкновение будет происходить всякий раз, когда перемещаемое количество – длина вектора скорости (dx*self.speed, dy*self.speed) – больше или равна расстоянию между ними.

На высоком уровне вам нужно разработать вектор от врага к игроку. Компоненты x и y вектора направления будут выглядеть так:

 enemies.rect.x - player.rect.x enemies.rect.y - player.rect.y 

Затем вы добавляете кратное направление в позицию противника, чтобы заставить его двигаться в сторону игрока.

Однако: вы заметите, что этот вектор будет иметь большую величину, когда игрок и враг находятся далеко друг от друга и имеют небольшую величину, когда они будут ближе друг к другу. Поэтому, чтобы избежать движения противника на сверхбыстрых скоростях, вы могли бы нормализовать вектор направления и умножить на скорость s чтобы держать его под контролем.

Здесь px & py – это положение (глобалы) объекта, против которого идет враг / преследование.

 class Enemy(object): def __init__(self,x,y): # initial position self.x = x self.y = y def move(self, speed=5): # chase movement # Movement along x direction if self.x > px: self.x -= speed elif self.x < px: self.x += speed # Movement along y direction if self.y < py: self.y += speed elif self.y > py: self.y -= speed 

Если вы хотите, вы можете настроить скорость по направлениям x & y.

  • Как использовать группы спрайтов в pygame
  • PYGAME делает движение спрайта в направлении, в котором он находится
  • Pygame Создание лица спрайта Мышь
  • Может ли постоянный ввод ключа перемещать спрайт постоянно?
  • Как добавить строку в качестве спрайта в pygame?
  • Python - лучший язык программирования в мире.