【发布时间】:2019-09-24 05:13:45
【问题描述】:
在尝试使用 pygame 制作游戏时,我使用 for 循环和 .colliderect() 进行碰撞检测,循环变得太慢,约 340 个墙矩形,我想知道它是否可以更快,因为它严重影响游戏循环?
我尝试在每面墙上的不同位置使用坐标点,但只有当您一次移动一定数量的像素并且每次移动速度减半时,它才能使您保存的坐标点数量增加四倍。
p>#disregard indent, this is all in an update function that is called every time that a player decides to move.
self._old_position = self.position
PlayerRectangle = pygame.Rect(self.position[0]+ x,self.position[1]+y,16,16)
cwd = os.getcwd()
tmxData = load_pygame(cwd+"\\Maps\\TestfileMap.tmx")
movement = True
for obj in self.walls:
if(pygame.Rect(obj[0],obj[1],16,16).colliderect(PlayerRectangle)):
movement = False
self.move_back()
else:
continue
if movement:
self.position[0] += x
self.position[1] += y
self.stats["position"]=self.position
self.rect.topleft = self.position
self.feet.midbottom = self.rect.midbottom
提供的代码可以工作,但是太慢了,我想知道碰撞检测是否有不同的方法,或者是否有一种方法可以使显示的内容更快,这会使事情陷入困境。谢谢
编辑:
所以解决方案基本上是我有 load_pygame,它每次循环时都会运行,只需取出执行该操作的行,它会清理更多内容,为了进一步优化,更改为每个对象创建一个 Rect 的行和只需使用已构建的 Rect 列表,这会限制函数调用。
【问题讨论】:
-
您不会在此处显示所有代码,但有一个使用文件名调用的
...load...函数 - 如果这是在游戏动作的中间完成的,它就是一个 主要NO!。与文件系统相关的所有事情都必须在设置场景时或在单独的线程上完成。 -
除此之外,w[
-
@jsbueno 这是一个内置的 pygame/pytmx 函数,删除它确实有很大帮助。我使用 pygame_load 的唯一原因是解释图层并从中提取特定对象。
标签: python pygame collision-detection pytmx