Python 如何在pygame中让敌人跟随玩家?

Python 如何在pygame中让敌人跟随玩家?,python,pygame,sprite,game-development,Python,Pygame,Sprite,Game Development,我参与了一场比赛。它运行良好,但我想在我的游戏中添加敌人。到目前为止,我在pygame精灵中添加了敌人的图像。 但是我如何让敌人跟随玩家呢?我试着这么做,但它只是让玩家直接看到敌人的形象: def移动敌人(自身): 敌人.rect.x=玩家.rect.x 敌人.rect.y=玩家.rect.y 所有精灵列表。添加(敌人) 敌人列表。添加(敌人) 我认为这会使敌人的形象跟随玩家。相反,它只是与玩家的形象重叠 我读了很多pygame精灵的例子,但是这些例子说用敌人.rect.x=player.re

我参与了一场比赛。它运行良好,但我想在我的游戏中添加敌人。到目前为止,我在pygame精灵中添加了敌人的图像。
但是我如何让敌人跟随玩家呢?我试着这么做,但它只是让玩家直接看到敌人的形象:

def移动敌人(自身):
敌人.rect.x=玩家.rect.x
敌人.rect.y=玩家.rect.y
所有精灵列表。添加(敌人)
敌人列表。添加(敌人)
我认为这会使敌人的形象跟随玩家。相反,它只是与玩家的形象重叠

我读了很多pygame精灵的例子,但是这些例子说用
敌人.rect.x=player.rect.x
替换
敌人.rect.x=-5
或者类似的东西。我也试过了,但它只是将图像向上移动,而不是跟随玩家

我必须建立一个方程式吗?如果是这样,我不知道该怎么做。
我如何让敌人移动,同时也让它跟随玩家?有人能帮我解决这个问题吗


任何帮助都将不胜感激。

在较高级别上,您需要计算出从敌人到玩家的向量。方向向量的
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
类敌人(对象):
定义初始位置(self,x,y):#初始位置
self.x=x
self.y=y
def移动(自身,速度=5):#追逐移动
#沿x方向的运动
如果self.x>px:
self.x-=速度
elif self.xpy:
self.y-=速度

如果你愿意,你也可以自定义x&y方向的速度。

你需要通过改变敌人的位置来缩短敌人和玩家之间的距离。这可以通过找到它们位置之间的差异,然后使用该向量计算(单位长度)方向向量来实现。这样,通过将敌人的速度乘以方向向量来改变敌人的位置。

一种方法是向您的
敌人
类添加如下方法。可以使用内置的
math
模块或
pygame.math
模块完成数学运算。后者还支持2D
Vector2
类,因此实际使用它可能会更好

import math
import pygame
from pygame.locals import *

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

    # Same thing using only pygame utilities
    def move_towards_player2(self, player):
        # Find direction vector (dx, dy) between enemy and player.
        dirvect = pygame.math.Vector2(player.rect.x - self.rect.x,
                                      player.rect.y - self.rect.y)
        dirvect.normalize()
        # Move along this normalized vector towards the player at current speed.
        dirvect.scale_to_length(self.speed)
        self.rect.move_ip(dirvect)
您需要添加检查,以确定如果敌方物体移动此距离,是否会超出范围,从而击中沿途的玩家,并做出相应的反应。提示:只要移动的量超过速度向量的长度,即对象的速度大于或等于它们之间的距离,就会发生碰撞