【问题标题】:How to make an enemy follow the player in pygame?如何让敌人在pygame中跟随玩家?
【发布时间】:2013-12-01 10:14:02
【问题描述】:

我参与了游戏。它运行良好,但我想在我的游戏中添加敌人。到目前为止,我在 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 示例,但示例中说用 enemies.rect.x = -5 或类似的东西替换 enemies.rect.x = player.rect.x。我也试过这个,但它只是向上移动图像而不是跟随玩家。

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

任何帮助将不胜感激。

【问题讨论】:

    标签: python pygame sprite game-development


    【解决方案1】:

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

    这样做的一种方法是向您的Enemy 类添加如下方法。数学运算可以使用内置的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)
    

    您需要添加检查以确定敌方物体是否会冲过头并因此在玩家移动此距离时沿途击中玩家,并做出相应反应。提示:只要移动量——速度向量的长度,即物体的速度——大于或等于它们之间的距离,就会发生碰撞。

    【讨论】:

      【解决方案2】:

      这里,pxpy 是敌人正在跟踪/追逐的对象的位置(全局)。

      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 方向的速度。

      【讨论】:

        【解决方案3】:

        在高层次上,您需要计算出从敌人到玩家的向量。方向向量的xy 分量如下所示:

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

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

        但是:您会注意到,当玩家和敌人距离较远时,该向量的幅度较大,而当他们靠近时,该向量的幅度较小。因此,为了避免让敌人以超快的速度移动,您可以将方向向量归一化并乘以速度s 以控制它。

        【讨论】:

          猜你喜欢
          • 2019-06-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-03
          • 1970-01-01
          相关资源
          最近更新 更多