python - pygame:创建窗口显示冻结一切
问题描述
我已经看到了许多类似的问题,但没有一个解决方案对我有用。这非常简单,所以也许我忽略了一些微不足道的事情。
我的代码(在 pygame 中创建一个显示窗口):
import pygame
pygame.init()
win = pygame.display.set_mode((500, 500))
当我从终端(python file_name.py)运行这个文件时,整个屏幕都会冻结,我必须重新启动(关闭我的虚拟机电源)。但是,如果我直接在终端中用 python 编写这些代码行,窗口会按应有的方式弹出。这有什么关系?
我试过的:把最后一行放在一个while循环中,把它放在一个主函数中,并在程序结束之前使用 time.sleep() 来延迟。
python 3.7.4、pygame 2.0.0、Debian 10.3.0(在 virtualBox 6.1 中运行)
解决方案
您的应用程序运行良好。但是,您还没有实现应用程序循环:
import pygame
pygame.init()
win = pygame.display.set_mode((500, 500))
clock = pygame.time.Clock()
run = True
while run:
clock.tick(60)
# handle events
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
# update game objects
# [...]
# clear display
win.fill((0, 0, 0))
# draw game objects
# [...]
# update display
pygame.display.flip()
pygame.quit()
典型的 PyGame 应用程序循环必须:
- 通过
pygame.event.pump()
或处理事件pygame.event.get()
。 - 根据输入事件和时间(分别为帧)更新对象的游戏状态和位置
- 清除整个显示或绘制背景
- 绘制整个场景(
blit
所有对象) - 通过
pygame.display.update()
或更新显示pygame.display.flip()
repl.it/@Rabbid76/PyGame-MinimalApplicationLoop另请参阅事件和应用程序循环
推荐阅读
- c - C - 读取一串数字
- perl - 将十进制 100 转换为二进制 100
- c++ - 编译器抱怨 volatile 关键字
- java - @ConditionalOnProperty:它只对下面指定的注释有影响吗?
- amazon-web-services - Elastic Beanstalk - 删除环境失败
- powerbi - Power BI Desktop - 在一个日期范围内计算存储桶中的项目
- java - 使用 JADE 和 Excel 的问题
- javascript - 无法在从另一个函数调用它的函数中设置变量
- ios - 遍历firebase数据库中的用户
- mysql - 加入 MySQL 关系只输出一行