python - Pygame 显示仅在我退出时更新
问题描述
摆弄pygame,我不确定发生了什么。代码只是应该制作一个红色框并在灰色屏幕周围反弹。它有效,但仅当我退出显示时。
我检查了类似的问题,但似乎没有一个答案适用于我(可能是错误的)。有谁知道如何改进此代码?
import pygame
from pygame.locals import *
from rect import *
##from pygame.font import *
RED = (255, 0, 0)
GRAY = (150, 150, 150)
width = 500
height = 200
pygame.init()
screen = pygame.display.set_mode((width, height))
rect = Rect(100, 50, 50, 50)
v = [2, 2]
##moving = False
running = True
while running:
for event in pygame.event.get():
if event.type == QUIT:
running = False
rect.move_ip(v)
if rect.left < 0 or rect.right > width:
v[0] *= -1
if rect.top < 0 or rect.bottom > height:
v[1] *= -1
screen.fill(GRAY)
pygame.draw.rect(screen, RED, rect)
pygame.display.flip()
pygame.quit()
解决方案
看来问题是程序运行得太快了。由于在每个循环中所做的工作很少,因此矩形最终移动得太快而无法清楚地看到正在发生的事情。
您可以使用pygame.time.Clock
对象限制程序的速度。在循环开始之前,可能就在屏幕定义之后,您可以构建一个时钟。
clock = pygame.time.Clock()
然后在您的主循环中,作为每次迭代的第一步(就在 之后while running:
),您可以将clock.tick(60)
循环限制为每秒运行 60 次(60fps)。这使得程序运行顺利,你得到了漂亮的弹跳矩形!
该tick
方法效果很好,但在我的系统上,它似乎经常出现小问题。如果您也遇到这种情况,或者如果您想更准确,您可以clock.tick_busy_loop(60)
改用。
这两种滴答方法的工作方式相同:通过测量自上次调用以来经过的时间量,clock.tick()
并基于此延迟一定的额外量,以便满足目标 fps。
有关Pygame 文档Clock
的更多信息。
我还需要 toimport pygame.rect
而不是 just import rect
,但如果你没有收到导入错误,你应该没问题。
推荐阅读
- azure-active-directory - microsoft-graph-client 抛出 '#
' API 调用错误 - python-3.x - TypeError: f3() 接受 2 个位置参数,但给出了 3 个
- javascript - 我可以在 Android 上运行统一网络播放器游戏吗?
- modbus - RTU over TCP 是符合规范的 modbus 应用程序吗?
- php - 如何将多个值组合成数组中的单个值?
- python - 关于 Python 键盘输入编码的快速简单问题
- python-3.x - 如何将新列插入到 Dask DataFrame 的特定索引?
- java - 第二个队列不打印出第一个队列中的项目
- php - 无法中断使用 proc_open() 启动的进程以启动 PHP 开发服务器
- python - 从字典中删除值