我正在研究一个基本的游戏,但我不确定我想把它带到哪里。到目前为止,我只是在研究基本机制。
我遇到的问题是我需要让敌人的精灵向玩家精灵移动。我已经想出了基本的矢量图,但是因为精灵沿着矢量移动,所以它们也越慢越慢到达目标。
以下是我的代码片段。
#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)
正如你所看到的,我一直将矢量除以20,因为它会将它们降低到合理的速度,但它们也会在达到目标之前停止。我需要帮助让精灵以恒定的速度向玩家移动。
答案 0 :(得分:1)
你的代码意味着敌人总是移动到目标的1/20。您希望它们朝同一方向移动1个固定大小的步骤。
这里的答案是规范化你的矢量 - 也就是说,在与距离矢量相同的方向上使用unit vector,而不是直接使用距离矢量。
执行此操作的简单方法是dividing the vector by its length。并to get the vector's length, that's just the Pythagorean theorem。
所以:
def vector_length(x, y):
return math.sqrt(x*x + y*y)
def normalize_vector(x, y):
norm = vector_length(x, y)
return x/norm, y/norm
target = normalize_vector(bpos[1] - mpos[1], bpos[0] - mpos[0])
这使得子弹每时间单位以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