python - Pygame在循环中填充背景时闪烁
问题描述
我正在尝试使用 pygame 在 python 中进行排序可视化。我必须在循环中画线,因为它们将在数组中移动。由于运动,我还必须在每个循环中重新绘制背景。但是,这会导致一些可怕的闪烁。有什么办法可以阻止这一切?还是我只是这样做完全错误?
import pygame
import numpy as np
Width = 800
Height = 500
numlines = 50
linewidth = int(Width / numlines)
win = pygame.display.set_mode((Width, Height))
pygame.display.set_caption("Quicksort Visualization")
white = (255, 255, 255)
black = (0, 0, 0)
randnums = np.random.randint(1, Height - 10, numlines)
def draw_arr(win, arr):
win.fill(black)
nums = arr
i = 1
for num in nums:
pygame.draw.line(
win,
white,
(i * linewidth, Height),
(i * linewidth, Height - num),
linewidth,
)
pygame.display.flip()
i = i + 1
def main(win, arr):
run = True
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
draw_arr(win, arr)
pygame.quit()
main(win, randnums)
解决方案
问题是由pygame.display.flip()
循环调用引起的。多次调用pygame.display.update()
或pygame.display.flip()
每帧会导致闪烁。每次调用时pygame.display.flip()
,显示都会更新。由于显示在循环开始时被清除 ( win.fill(black)
),因此场景未完全更新。
在应用程序循环结束时调用它一次:
def draw_arr(win, arr):
win.fill(black)
nums = arr
i = 1
for num in nums:
pygame.draw.line(
win,
white,
(i * linewidth, Height),
(i * linewidth, Height - num),
linewidth,
)
# pygame.display.flip() <--- DELETE
i = i + 1
pygame.display.flip() # <--- INSERT
推荐阅读
- html - Bootstrap 4:在移动屏幕上重新排列内部堆叠的列
- java - 在另一个 maven 项目中使用 maven 实现项目
- r - 有没有办法防止在 Windows 中运行的 Shiny App 中的目录遍历攻击?
- android - 如何验证离线缓存数据和来自 API 的数据
- java - 如何为 Retrofit 中的挂起功能创建调用适配器?
- android - RecyclerView 的监听器被应用到其他 RecyclersView
- node.js - 如何在 passport.js 中手动调用 SerializeUser?
- macos - Mac清除浏览器缓存的方法与PC不同?
- selenium - 如何关闭 Selenium 中的弹出窗口?
- java - 添加 Recyclerview 的 itemview 的总“视图”的最佳实践是什么?