0

我在尝试使用 pygame 制作游戏时使用 for 循环和 .colliderect() 进行碰撞检测,循环变得太慢,约 340 个墙矩形,我想知道它是否可以更快,因为它严重影响游戏循环播放?

我已经尝试在每面墙上的不同位置使用坐标点,但只有当您一次移动一定数量的像素并且每次移动速度减半时,它才会使您保存的坐标点数量增加四倍。

#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 列表,这限制了函数调用。

4

1 回答 1

0

如果没有一个最小的工作示例,就很难给出自信的建议。

正如我在评论中所说,对“load_pygame”函数的虚假调用似乎在此代码中读取文件数据——仅此一项就可能导致您的速度变慢。此外,读取的数据不用于碰撞检测。

我没有的另一个建议是让你的墙壁矩形预先计算在一个精灵组中,而不是在每次检查时为所有墙壁创建新矩形: pygame.Rect(obj[0],obj[1],16,16).colliderect(PlayerRectangle)). 那么你可以使用精灵方法“spritecollideany” - https://www.pygame.org/docs/ref/sprite.html#pygame.sprite.spritecollideany - 应该优化矩形碰撞验证。

(这也将要求您的 Player 对象是 Sprite,如果它还不是)。

于 2019-05-06T15:50:21.480 回答