2012-06-10 72 views
3

我正在制作一个自上而下的射手,并希望我的僵尸跟随我的角色,而我的程序使用主循环。我角色的位置是x和y,他由箭头键控制。我有一个僵尸,现在随机在屏幕的左边缘随机产生。我怎么能让僵尸跟随我的位置从它产生的位置?如何让敌人在pygame中跟随玩家?

这是僵尸功能:

def makezombie(): 
    global zom 
    zom = Rect (0,randint(0, height-40), 49, 38) 
    return zom 

我设置僵尸= makezombie()

在我的主循环我有以下几点:

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

回答

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位置坐标,其中速度是您希望僵尸每循环移动的像素数。然后在这个新的位置重新绘制僵尸。

希望有帮助!如果没有,请澄清这个问题。

+1

为什么不使用math.sqrt而不是** 0.5? – sloth

+0

任何一个都可以工作,但如果我不需要,我不想导入太多的模块。我真的不确定一个人是否比另一个更好,尽管我会承认math.sqrt对于阅读代码的人可能更容易理解。 – user1413793

+0

在我的笔记本电脑上(在Ubuntu下为Python 2.7),当使用''timeit.timeit()''函数测量时,使用''math.sqrt''快两倍。 ''math.sqrt''每次计算大约需要631ns(平均超过100万次),而''x ** 0.5''大约需要1260ns。单独使用并不是一个很大的区别,但是如果您在循环中进行大量计算,比如在更新游戏中大量角色的位置时,可能会产生很大的差异... – Blair

1

如果你知道向量数学(即:euclid),你可以使用向量减法。

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值僵尸的矩形()

+0

注意:我最后两行是否等于使用点积? – ninMonkey