【问题标题】:How to speed up or optimize for loop used for collision detection using pygame/pytmx?如何使用 pygame/pytmx 加速或优化用于碰撞检测的循环?
【发布时间】: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


【解决方案1】:

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

正如我在 cmets 中所述,对“load_pygame”函数的虚假调用似乎在此代码中读取文件数据 - 仅此一项就可能导致您的速度变慢。而且,读取的数据并没有用于碰撞检测。

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

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

【讨论】:

  • 原来问题在于我在代码中间使用了 load_pygame,如果你想知道 load_pygame 是 pytmx 的内置函数,特别是 pytmx.util_pygame。这是我从另一个用于解析碰撞层的函数复制的函数的工件。墙壁的矩形都是预先计算好的,我只是在奇怪地使用它。不过,我会检查 spritecollideany 函数。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-20
  • 2019-10-10
相关资源
最近更新 更多