使用Pygame使子弹以一定速度跟随移动的物体吗?

时间:2019-04-13 19:57:27

标签: python python-3.x pygame

基本上。我正在尝试进行塔防游戏,我需要塔向敌人射击并让子弹以一定速度跟随该敌人,直到他们击中它。我已经编写了所有代码,但是由于某种原因,我无法使用“跟踪”方法来工作。我以为我可以只使用极坐标到笛卡尔的转换就可以做到这一点,但是我必须要仔细研究一下,因为子弹不会靠近目标。

这就是我所拥有的:

def follow(self):
    dx = (self.rect.x + 4) - (self.target.rect.x + 15)
    dy = (self.rect.y + 4) - (self.target.rect.y + 15)
    angle = math.atan2(dy, dx)
    x = self.speed * math.cos(angle)
    y = self.speed * math.sin(angle)
    self.rect.x += x
    self.rect.y += y

1 个答案:

答案 0 :(得分:1)

self.rect.xself.rect.y是整数值。如果您添加的浮点值小于1.0,则结果不会改变。

我建议使用pygame.math.Vector2来管理浮点坐标中的位置。 设置项目符号在构造函数中的位置:

self.pos = pygame.math.Vector2(self.rect.center)

计算从子弹到目标的方向向量:

dir = pygame.math.Vector2(self.target.rect.center) - self.pos

使用.length()计算到目标的距离。用distance除以计算从子弹到目标的归一化方向。归一化向量是Unit vector,长度为1.0:

distance = dir.length()
if distance > 0:
    dir = dir / distance

更新位置和矩形。通过限制子弹的移动距离目标的距离(min(distance, self.speed)),确保子弹不会“穿过”目标:

self.pos += dir * min(distance, self.speed)
self.rect.center = self.pos

代码可能看起来像这样:

class Bullet:

    def __init__(self, [...])

        self.rect = [...]

        self.pos = pygame.math.Vector2(self.rect.center)

    def follow(self):

        dir = pygame.math.Vector2(self.target.rect.center) - self.pos
        distance = dir.length()
        if distance > 0:
            dir = dir / distance

        self.pos += dir * min(distance, self.speed)
        self.rect.center = self.pos