如何在pygame中让敌人跟随玩家?

4
我正在制作一款自上而下的射击游戏,希望我的僵尸能够跟随我的角色移动,我的程序使用主循环。我的角色的位置是x和y,并且由箭头键控制。我有一个僵尸,现在它会在屏幕左边缘随机生成。如何使僵尸从生成点开始跟随我的位置移动?
这是僵尸函数:
def makezombie():
    global zom
    zom = Rect (0,randint(0, height-40), 49, 38)
    return zom

我设置了zombie=makezombie()

在我的主循环中,我有以下代码:

for shot in shots:
    if zombie.collidepoint(shot[X],shot[Y]):
        zombie=makezombie()
        points+=1000
        impact.play()
        blood.play()
2个回答

6

我不确定我完全理解这个问题,但基本上你可以获取玩家(x,y)坐标和僵尸(x,y)坐标。假设(xp,yp)是玩家的坐标,(xz,yz)是僵尸的坐标,则可以使用以下算法找到从僵尸到玩家的方向:

import math
(dx, dy) = ((xp - xz)/math.sqrt((xp - xz) ** 2 + (yp - yz) ** 2), 
            (yp - yz)/math.sqrt((xp - xz) ** 2 + (yp - yz) ** 2))

然后在主循环中,您需要通过执行newCoord =(xp + dx * spped,yp + dy * speed)来更新僵尸的x和y位置坐标,其中speed是每个循环中您希望僵尸移动的像素数量。然后在这个新位置重新绘制僵尸。

希望有所帮助!如果不行,请澄清问题。


1
为什么不使用 math.sqrt 而是使用 ** 0.5? - sloth
任何一种都可以,但如果不必要的话,我更倾向于不导入太多模块。我真的不确定哪种更好,尽管我承认math.sqrt对于阅读代码的人来说可能更容易理解。 - user1413793
在我的笔记本电脑上(Ubuntu下的Python 2.7),使用“math.sqrt”函数时,使用“timeit.timeit()”函数测量的速度是两倍。每个计算大约需要631纳秒(平均1百万次),而“x ** 0.5”大约需要1260纳秒。单独考虑这并不是很大的差异,但如果您在循环中执行大量计算,比如在游戏中更新大量字符的位置时,这可能会产生相当大的影响... - Blair
测量 ** 运算的时间:import timeit; timeit.timeit('y = x**0.5', 'x=101398', number=1000000)。测量 math.sqrt() 方法的时间:import timeit; timeit.timeit('y = sqrt(x)', 'from math import sqrt; x=101398', number=1000000) - Blair
1
啊,我没意识到 math.sqrt 更快。那就是开始使用它的原因了。谢谢! - user1413793

1

如果您了解向量数学(即:欧几里得),您可以使用向量减法。

zombie_speed = 50 # pixels / an update
player = Vector2(player.rect.x, player.rect.y)
zombie = Vector2(zombie.rect.x, zombie.rect.y)
movement = player - zombie
movement.normalize()
movement *= zombie_speed

然后将运动的x,y值添加到僵尸的Rect()中


请注意:我的最后两行是否相当于使用点积? - ninMonkey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接