【发布时间】:2019-10-17 18:07:31
【问题描述】:
我正在使用 pygame 在 python 中编写一个相当基本的 2d 自上而下地牢爬行类游戏。一切都很顺利,除了碰撞。现在,我有一个 tilemap 系统,它可以读取 tilesheet,然后将正确的图像绘制到屏幕上。我正在尝试为所有“墙类型”图像添加碰撞,所以我构建了一个函数,每次有墙时都会绘制矩形,然后将它们添加到列表中。这是我的 add_collider 函数:
rect_list = []
def add_collider(window, x, y):
rect = pygame.rect = (x*32, y*32, 32, 32)
pygame.draw.rect(window, [255, 0, 0], rect, 1)
rect_list.append(rect)
然后在我的主游戏循环中,我可以检查我的玩家矩形是否与我的任何对撞机相交。这工作正常,除了游戏在运行大约 10 秒后减速停止。我认为这是因为我每秒运行大约 30-40 个对象的 for 循环 30 次(游戏的帧速率)。这是游戏循环:
while run:
clock.tick(30)
#player.get_collider() returns a rectangle around the player,
#essentially the hitbox of the player
for c in collider.get_collider():
if player.get_collider().colliderect(c):
print('Collide')
#just setting the player's position to 400,400 for now until I figure this out
player.x = 400
player.y = 400
redrawGameWindow()
一定有更好的方法。据我所知,这可能是一种完全错误/糟糕的做事方式。如果我需要重做我的碰撞逻辑,那很好,我只想要更好的性能。感谢您提供任何帮助或提示。
【问题讨论】:
-
当然“每秒 30 次大约 30-40 个对象的 for 循环” 无法解释这种快速的性能下降。请注意,这只是每秒 1200 次碰撞测试 (
colliderect)。您是否每帧添加一次矩形 (rect_list.append(rect)) 并且列表会增长到无限? -
在新框架中添加元素之前,您是否清除了
rect_list?在每一帧打印len(rect_list),看看你有多少元素。 -
这与当前问题无关,但是当您的地图变大时,可能值得将所有地图对象划分为四叉树等,以便更有效地搜索碰撞。或者可能只检查播放器 N 个单位内的碰撞。
-
@Rabbid76 就是这样!非常感谢,我不知道我怎么没听懂。