首页 > 解决方案 > 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()

标签: pythonpygame

解决方案


看来问题是程序运行得太快了。由于在每个循环中所做的工作很少,因此矩形最终移动得太快而无法清楚地看到正在发生的事情。

您可以使用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,但如果你没有收到导入错误,你应该没问题。


推荐阅读