Python Pygame精灵以恒定速度移动

Python Pygame精灵以恒定速度移动,python,vector,pygame,sprite,Python,Vector,Pygame,Sprite,我正在做一个基本的pygame,但我不确定我想把它带到哪里。所以到现在为止,我只研究基本力学 我遇到的问题是我需要让敌人的精灵向玩家的精灵移动。我已经了解了基本的矢量化,但是由于精灵沿着矢量移动,它们也会随着距离目标越近而减速 这是我的代码片段 #Enemy Mechanics for enemy in enemy_list: pygame.draw.rect(screen, green, (enemy.rect.x, enemy.rect.y-5, enemy.Health/4, 3)

我正在做一个基本的pygame,但我不确定我想把它带到哪里。所以到现在为止,我只研究基本力学

我遇到的问题是我需要让敌人的精灵向玩家的精灵移动。我已经了解了基本的矢量化,但是由于精灵沿着矢量移动,它们也会随着距离目标越近而减速

这是我的代码片段

#Enemy Mechanics
for enemy in enemy_list:
    pygame.draw.rect(screen, green, (enemy.rect.x, enemy.rect.y-5, enemy.Health/4, 3), 0)
    pygame.draw.rect(screen, green, (enemy.rect.x, enemy.rect.y-5, 25, 3), 1)

    ppos = pPlayer.rect.x, pPlayer.rect.y
    epos = enemy.rect.x, enemy.rect.y
    etarget = epos[1] - ppos[1], epos[0] - ppos[0]

    enemy.rect.x -= etarget[1]/20 #This is the problem
    enemy.rect.y -= etarget[0]/20


#Bullet Mechanics
for bullet in bullet_list:
    mpos = pygame.mouse.get_pos()
    bpos = bullet.rect.x, bullet.rect.y
    target = bpos[1] - mpos[1], bpos[0] - mpos[0]
    dist = math.sqrt(((bpos[0] - mpos[0])**2) + ((bpos[1] - mpos[1])**2))

    bullet.rect.x -= target[1]/20
    bullet.rect.y -= target[0]/20

    if dist < 30:
        bExplode(bullet.rect.x, bullet.rect.y)
        blist.remove(bullet)
        bullet.kill()

    enemy_hit_list = (pygame.sprite.spritecollide(bullet, enemy_list, False))
    for enemy in enemy_hit_list:
        enemy.Health -= 25
        print(enemy.Health)
        if enemy.Health <= 0:
            enemy_list.remove(enemy)
            all_sprites_list.remove(enemy)

        bullet_list.remove(bullet)
        all_sprites_list.remove(bullet)
        blist.remove(bullet)
敌方机械师 对于敌人列表中的敌人: pygame.draw.rect(屏幕,绿色,(敌方.rect.x,敌方.rect.y-5,敌方.Health/4,3),0) pygame.draw.rect(屏幕,绿色,(敌方.rect.x,敌方.rect.y-5,25,3),1) ppos=pPlayer.rect.x,pPlayer.rect.y epos=敌方.rect.x,敌方.rect.y etarget=epos[1]-ppos[1],epos[0]-ppos[0] 敌方.rect.x-=etarget[1]/20#这就是问题所在 敌方.rect.y-=etarget[0]/20 #子弹力学 对于项目符号列表中的项目符号: mpos=pygame.mouse.get_pos() bpos=bullet.rect.x,bullet.rect.y 目标=bpos[1]-mpos[1],bpos[0]-mpos[0] dist=math.sqrt(((bpos[0]-mpos[0])**2)+((bpos[1]-mpos[1])**2)) bullet.rect.x-=目标[1]/20 bullet.rect.y-=目标[0]/20 如果距离<30: bExplode(bullet.rect.x,bullet.rect.y) 删除(项目符号) 子弹 敌人命中列表=(pygame.sprite.spritecollide(子弹,敌人列表,错误)) 对于敌人命中列表中的敌人: 敌人。健康-=25 打印(敌人健康)
如果敌人的生命值你的代码意味着敌人总是向目标移动20分之一的距离。您希望它们在同一方向上移动1个固定大小的步长

这里的答案是规范化向量,也就是说,在距离向量相同的方向上使用a,而不是直接使用距离向量

要做到这一点,最简单的方法是通过以下方式。和

因此:

这使项目符号以每时间单位1个空间单位(例如,每帧像素)的速度移动。如果你想让它们跑得更快或更慢,只需定义相同单位的子弹速度并乘以:

bullet.rect.x -= target[1] * BULLET_SPEED 
bullet.rect.y -= target[0] * BULLET_SPEED 

事实上,你已经做了大部分,只是没有使用它:

dist = math.sqrt(((bpos[0] - mpos[0])**2) + ((bpos[1] - mpos[1])**2))
因此,如果您觉得更清楚,只需将下面两行更改为:

bullet.rect.x -= target[1] / dist * BULLET_SPEED
bullet.rect.y -= target[0] / dist * BULLET_SPEED

你的代码意味着敌人总是向目标移动20分之一的距离。您希望它们在同一方向上移动1个固定大小的步长

这里的答案是规范化向量,也就是说,在距离向量相同的方向上使用a,而不是直接使用距离向量

要做到这一点,最简单的方法是通过以下方式。和

因此:

这使项目符号以每时间单位1个空间单位(例如,每帧像素)的速度移动。如果你想让它们跑得更快或更慢,只需定义相同单位的子弹速度并乘以:

bullet.rect.x -= target[1] * BULLET_SPEED 
bullet.rect.y -= target[0] * BULLET_SPEED 

事实上,你已经做了大部分,只是没有使用它:

dist = math.sqrt(((bpos[0] - mpos[0])**2) + ((bpos[1] - mpos[1])**2))
因此,如果您觉得更清楚,只需将下面两行更改为:

bullet.rect.x -= target[1] / dist * BULLET_SPEED
bullet.rect.y -= target[0] / dist * BULLET_SPEED

为什么这被标记为“性能”?您当前的实现可能不正确,但是…它是否也占用了太多的CPU时间?这似乎不太可能。对不起,当我输入速度时,它默认为性能。啊,你指的是子弹的标量速度。是的,有时候猜测别名有点过于热心了。您可能不想优化项目符号的性能。如果你这样做了,也许可以尝试在你的口吻中使用多边形来复枪为什么这被标记为“性能”?您当前的实现可能不正确,但是…它是否也占用了太多的CPU时间?这似乎不太可能。对不起,当我输入速度时,它默认为性能。啊,你指的是子弹的标量速度。是的,有时候猜测别名有点过于热心了。您可能不想优化项目符号的性能。如果你这样做了,也许可以尝试在你的口吻中使用多边形来复枪