PyGame一次更新全部显示

时间:2012-07-02 20:31:34

标签: python pygame

使用PyGame,我得到闪烁的东西。盒子,圆圈,文字,它都闪烁着。我可以通过增加循环之间的等待来减少这种情况,但是我可能可以通过立即将所有内容绘制到屏幕来消除它,而不是单独执行所有操作。以下是我遇到的一个简单示例:

    import pygame, time
    pygame.init()
    screen = pygame.display.set_mode((400, 300))
    loop = "yes"
    while loop=="yes":
        screen.fill((0, 0, 0), (0, 0, 400, 300))
        font = pygame.font.SysFont("calibri",40)
        text = font.render("TextA", True,(255,255,255))
        screen.blit(text,(0,0))
        pygame.display.update()

        font = pygame.font.SysFont("calibri",20)
        text = font.render("Begin", True,(255,255,255))
        screen.blit(text,(50,50))
        pygame.display.update()
        time.sleep(0.1)

“开始”按钮为我闪烁。它可能只是我较慢的电脑,但有没有办法减少或消除闪烁?在我正在研究的更复杂的事情上,它变得非常糟糕。谢谢!

4 个答案:

答案 0 :(得分:3)

您在循环中更新了屏幕2次,一次用于绘制第一个文本(TextA),另一个用于第二个文本(Begin)。

首次更新后,只会显示第一个文字,因此您无法在第一次更新和第二次更新之间看到begin文字。这会导致闪烁。

绘制完所有内容后更新屏幕。在您的情况下,请先删除pygame.display.update()

答案 1 :(得分:3)

我认为问题的一部分是你正在调用' pygame.display.update()'多一次。在主循环期间尝试只调用一次。

其他一些优化:

  • 您可以从主循环中取出字体创建代码以加快速度
  • 执行loop = True而不是loop = "yes"
  • 要获得更一致的fps,您可以使用Pygame的clock

因此...

import pygame
pygame.init()

screen = pygame.display.set_mode((400, 300))
loop = True

# No need to re-make these again each loop.
font1 = pygame.font.SysFont("calibri",40)
font2 = pygame.font.SysFont("calibri",20)

fps = 30 
clock = pygame.time.Clock()

while loop:
    screen.fill((0, 0, 0), (0, 0, 400, 300))

    text = font1.render("TextA", True,(255,255,255))
    screen.blit(text,(0,0))

    text = font2.render("Begin", True,(255,255,255))
    screen.blit(text,(50,50))

    pygame.display.update()   # Call this only once per loop
    clock.tick(fps)     # forces the program to run at 30 fps.

答案 2 :(得分:2)

您每0.1秒重新绘制整个屏幕的内容。跟踪实际所做的更改并更新实际包含更改内容的rects更为常见和快捷。因此,在循环之外绘制所有内容,让事件修改屏幕并跟踪实际更改的矩形。

这样的事情:

import pygame, time
pygame.init()
screen = pygame.display.set_mode((400, 300))
screen.fill((0, 0, 0), (0, 0, 400, 300))
font = pygame.font.SysFont("calibri",40)
text = font.render("TextA", True,(255,255,255))
screen.blit(text,(0,0))
font = pygame.font.SysFont("calibri",20)
text = font.render("Begin", True,(255,255,255))
screen.blit(text,(50,50))
loop = "yes"
counter = 0
dirty_rects = []
while loop=="yes":
    pygame.display.update()
    time.sleep(0.1)
    # Handle events, checks for changes, etc. Call appropriate functions like:
    counter += 1
    if counter == 50:
        font = pygame.font.SysFont("calibri",20)
        text = font.render("We hit 50!", True,(255,255,255))
        screen.blit(text,(50,100))
        dirty_rects.append(Rect((50,100),text.get_size()))

答案 3 :(得分:1)

Pygame有一个缓冲系统可以避免闪烁,所以你应该像你一样绘制它们,但最后只更新一次:

...
while loop=="yes":
    screen.fill((0, 0, 0), (0, 0, 400, 300))
    font = pygame.font.SysFont("calibri",40)
    text = font.render("TextA", True,(255,255,255))
    screen.blit(text,(0,0))

    font = pygame.font.SysFont("calibri",20)
    text = font.render("Begin", True,(255,255,255))
    screen.blit(text,(50,50))

    pygame.display.update()   # only one update

    time.sleep(0.1)

如果你不想保持帧率,那么Pygame的Clock Class比time.sleep(0.1)好。