首页 文章

PyGame一次更新全部显示

提问于
浏览
1

使用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 回答

  • 2

    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有一个比time.sleep(0.1)好的Clock Class .

  • 1

    我认为问题的一部分是你多次调用'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.
    
  • 3

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

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

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

  • 3

    您每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()))
    

相关问题