【发布时间】:2012-03-19 21:01:34
【问题描述】:
我正在开发一个简单的 2d 游戏,其中许多敌人不断产生并在 python + pygame 中追逐一个或多个玩家。我遇到的一个问题,许多编写过此类游戏的人都遇到过一个问题,那就是敌人会很快收敛。我已经为这个问题做了一个临时的解决方案,一个函数可以将任意两个距离太近的敌人随机分开。这很好用,但它是关于每帧运行的 O(n^2) 算法,并且在高敌人处程序开始减慢。
当我的程序使用这个函数运行时,敌人似乎形成了我昵称为“团块”的圆形物体。丛似乎通常是黄道的,但实际上可能更复杂(不对称),因为随着玩家的移动,敌人会被拉向不同的方向。我确实喜欢这个团块的行为方式,但是我想知道是否有更有效的方法来计算它。目前,集群中的每个敌人(通常 > 100 个)都会首先向玩家的方向移动,然后被推开。如果有一种方法可以计算团块创建的图形,以及它的移动方式,它将节省大量计算。
我不确定如何解决这个问题。或许可以计算出图形边界的移动位置,然后将其展开以确保该区域保持不变。
还有我目前用来移动敌人的两个功能:
def moveEnemy(enemy, player, speed):
a = player.left-enemy.left
b = player.top-enemy.top
r = speed/math.hypot(a,b)
return enemy.move(r*a, r*b)
def clump(enemys):
for p in range(len(enemys)):
for q in range(len(enemys)-p-1):
a = enemys[p]
b = enemys[p+q+1]
if abs(a.left-b.left)+abs(a.top-b.top)<CLUMP:
xChange = (random.random()-.5)*CLUMP
yChange = ((CLUMP/2)**2-xChange**2)**.5
enemys[p] = enemys[p].move(int(xChange+.5), int(yChange + .5))
enemys[p+q+1] = enemys[p+q+1].move(-int(xChange+.5),-int(yChange+.5))
return enemys
编辑:一些有关丛集外观的屏幕截图: http://imageshack.us/photo/my-images/651/elip.png/ http://imageshack.us/photo/my-images/832/newfni.png/
http://imageshack.us/photo/my-images/836/gamewk.png/
这个团块似乎主要是一个刚刚被拉伸的圆形物体(像一个日食,但可能会向多个方向拉伸),但是由于矩形敌人,它目前具有直边。
【问题讨论】:
-
范围的代码怎么样?那是在做距离检查吗?对于大量单元而言,这可能非常昂贵。
-
另外,不要每帧都这样做,而是每 X 帧都这样做。我以类似的方式解决了同样的问题,但是我允许一些重叠。它让大群蜂群看起来更危险!
-
根据您在此处获得的答案质量,您可能还想尝试在 gamedev.stackexchange.com 上提问。
-
你能提供一些图片吗?
-
这是关于...僵尸吗? :)