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

时间:2013-11-18 09:55:03

标签: python pygame sprite game-development

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

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精灵的例子,但是例子说是用'enemies.rect.x = -5'或其他东西替换'enemies.rect.x = player.rect.x'。我也试过这个,但它只是移动图像而不是跟随播放器。我必须制定一个等式吗?如果是这样,我不知道该怎么做。我如何让敌人移动,同时让它跟随玩家?有人可以帮我解决这个问题吗?任何帮助,将不胜感激。 Windows 7,Python 2.6,Pygame 2.6,sprites。

3 个答案:

答案 0 :(得分:4)

你需要通过改变敌人的位置来减少敌人和玩家之间的距离。这可以通过找到它们的位置之间的差异然后使用该向量来计算归一化(单位长度)方向向量来完成。通过它,通过将速度乘以方向向量来改变敌人的位置。一种方法是在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)的长度 - 大于或等于它们之间的距离时,就会发生碰撞。

答案 1 :(得分:1)

在高级别你需要计算从敌人到玩家的矢量。方向向量的xy组件如下所示:

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

然后方向的多个方向添加到敌方位置,使其朝向玩家移动。

然而:你会注意到,当玩家和敌人相距很远时,这个向量将具有很大的幅度,而当它们靠得更近时,这个向量将会很小。因此,为了避免让敌人以超快的速度移动,您可以将方向向量标准化并乘以速度s以使其受到控制。

答案 2 :(得分:0)

此处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&amp;也是方向。