2

使用 PyGame,我得到了闪烁的东西。方框、圆圈、文字,一切都在闪烁。我可以通过增加循环之间的等待来减少这种情况,但我也许可以通过一次将所有内容绘制到屏幕上来消除它,而不是单独做所有事情。这是发生在我身上的一个简单示例:

    导入pygame,时间
    pygame.init()
    screen = pygame.display.set_mode((400, 300))
    循环=“是”
    而循环==“是”:
        screen.fill((0, 0, 0), (0, 0, 400, 300))
        字体 = pygame.font.SysFont("calibri",40)
        text = font.render("TextA", True,(255,255,255))
        screen.blit(文本,(0,0))
        pygame.display.update()

        字体 = pygame.font.SysFont("calibri",20)
        text = font.render("开始", True,(255,255,255))
        screen.blit(文本,(50,50))
        pygame.display.update()
        时间.睡眠(0.1)

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

4

4 回答 4

4

我认为部分问题是您不止一次调用“pygame.display.update()”。尝试在主循环期间只调用一次。

其他一些优化:

  • 您可以将字体创建代码从主循环中取出以加快速度
  • loop = True不如这样做loop = "yes"
  • 要获得更一致的 fps,您可以使用 Pygame 的时钟

所以...

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.
于 2012-07-02T20:48:09.550 回答
3

您将循环更新屏幕两次,一次用于绘制第一个文本(TextA),一次用于绘制第二个文本(Begin)。

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

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

于 2012-07-02T20:44:54.673 回答
2

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

所以是这样的:

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()))
于 2012-07-02T20:54:34.927 回答
1

Pygame 有一个 Buffer 系统来避免闪烁,所以你应该照常绘制它们,但最后只更新一次:

...
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) 更好的时钟类。

于 2012-07-02T20:48:40.113 回答