多次致电pygame.display.update() https://www.pygame.org/docs/ref/display.html#pygame.display.update or pygame.display.flip() https://www.pygame.org/docs/ref/display.html#pygame.display.flip导致闪烁。在应用程序循环结束时更新一次显示就足够了。但在绘制场景之前,您也只需清除一次显示:
while Running:
# [...]
# clear display
pygame.draw.rect(display,"black", (0,0,ScreenConfigs.width,ScreenConfigs.height))
# draw scene
for snakeBit in snake.snakearray:
pygame.draw.rect(display,"white",(snakeBit[0],snakeBit[1],30,30))
# update display
pygame.display.flip()
清除显示也可以通过fill https://www.pygame.org/docs/ref/surface.html#pygame.Surface.fill:
while Running:
# [...]
# clear display
display.fill("black")
# draw scene
for snakeBit in snake.snakearray:
pygame.draw.rect(display,"white",(snakeBit[0],snakeBit[1],30,30))
# update display
pygame.display.flip()
场景中的每个对象都被绘制到pygame.Surface
与显示器关联的对象。要创建动画对象,必须在每一帧中重新绘制整个场景。因此,必须在应用程序循环的每一帧开始时清除显示。如果你画在Surface与 PyGame 显示相关联,这在显示中不会立即可见。当使用以下任一方法更新显示时,更改将变得可见pygame.display.update() https://www.pygame.org/docs/ref/display.html#pygame.display.update or pygame.display.flip() https://www.pygame.org/docs/ref/display.html#pygame.display.flip.
典型的 PyGame 应用程序循环必须:
- 限制每秒帧数以限制 CPU 使用率pygame.time.Clock.tick https://www.pygame.org/docs/ref/time.html#pygame.time.Clock
- 通过调用以下任一方法处理事件pygame.event.pump() https://www.pygame.org/docs/ref/event.html#pygame.event.pump or pygame.event.get() https://www.pygame.org/docs/ref/event.html#pygame.event.get.
- 根据输入事件和时间(分别为帧)更新游戏状态和对象位置
- 清除整个显示或绘制背景
- 绘制整个场景(
blit
所有对象)
- 通过调用更新显示pygame.display.update() https://www.pygame.org/docs/ref/display.html#pygame.display.update or pygame.display.flip() https://www.pygame.org/docs/ref/display.html#pygame.display.flip