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