【发布时间】:2021-07-13 14:33:05
【问题描述】:
这几天我遇到了一个严重的问题,这是终端抛出的分段错误(核心转储)错误。
这个问题出现在我输掉后回到菜单,然后再次播放。
这正是发生的事情:
上图中显示的窗口会立即出现,然后关闭。
顺便说一句,我正在开发的游戏中帧数限制为 50,而我的笔记本电脑是游戏机,所以我不知道这次崩溃的原因是什么,但我认为是代码造成的。
这是当我尝试返回菜单然后再次播放时运行的一段代码:
# this is inside the main loop in the game function
for event in events:
if event.type == KEYDOWN:
if event.key == K_c: # back to menu
pygame.quit()
main_menu()
# this is inside the main_menu() function
if play_button.get_rect(x=320, y=270).colliderect(cursor_rect) and pygame.mouse.get_pressed()[0]:
pygame.quit()
pilot()
更新:
-
发生错误时没有显示特定的错误消息,但所有错误消息都包含
core dumped问题。例如:
corrupted size vs. prev_size Aborted (core dumped) -
经过一番研究,我发现这个问题可能与 pygame 和 Ubuntu (linux) 之间的兼容性问题有关,我顺便在 Linux Mint 上编码。
【问题讨论】:
-
你为什么用
pygame.quit()? -
我也使用 Linux Mint(现在是最新的 20.2 “Uma”,但我从 16.0 开始),我从来没有遇到过这个问题。您是否在某个 IDE 中运行它?你是直接在终端试的吗? PyGame 使用 C/C++ 库
SDL,可能需要更新。但我总是在一个窗口中运行——即使菜单和游戏有自己的主循环。再次关闭和打开窗口只是浪费时间。您是否同时运行两个窗口? PyGame/SDL 不是为了同时运行两个窗口而创建的。 -
对我来说问题可能是关闭并再次创建窗口。 PyGame/SDL 被创建为当时只运行一个窗口。
quit()可以从内存中删除一些 SDL 元素,init()可能会在内存中的不同位置创建它们,因此它可能需要在 PyGame 中重新创建对象才能访问内存中的正确位置。 -
你应该在启动时只运行一次
pygame.init(),只创建一次screen = pygama.display.set_mode(...)并作为参数发送它game(screen),menu(screen),并且在退出程序时只使用一次quit()。 -
我在 GitHub 上找到了我的示例,但它在类中保留了代码:github.com/furas/python-examples/blob/master/pygame/…