python - Pygame 将元素按顺序绘制到屏幕上
问题描述
我正在制作一个在 pygame 中演示排序算法的应用程序。我有需要在屏幕上一一绘制的“元素”,以便用户可以看到发生了什么。我试过这样做,但结果是所有元素同时绘制在屏幕上。这一切都发生在 initialize_elements() 中。应该发生的是创建一个新元素,然后将其绘制到屏幕上,然后更新显示,以便用户可以看到一个一个创建的单个元素。相反,所有元素都出现在屏幕上同时。我曾尝试使用 pygame.time.delay(100) 但这没有用。我不知道如何阻止这种情况发生。
这是我的代码:
import pygame
import random
class Element:
def __init__(self, left_in, width_in, screen_height, screen):
self.top = 0
self.left = left_in
self.height = random.randrange(screen_height / 4, screen_height * 0.75)
self.color = (0,0,255)
self.border = 5
self.surface = pygame.Surface([width_in, self.height])
self.surface.fill((self.color))
self.draw(screen, self.color, left_in, 0)
def draw(self, screen, color, x, y):
screen.blit(self.surface, (self.left, self.top))
screen_width = 1400
screen_height = 900
screen = pygame.display.set_mode((screen_width, screen_height))
num_elements = 20 # Will be determined at start screen
def main():
pygame.init()
clock = pygame.time.Clock()
FPS = 30
elements = []
pygame.display.set_caption("Sorting Visualization")
screen.fill((255, 255, 255))
def initialize_elements(desired_width):
i = 0
while i < num_elements:
if i == 0:
elements.append(Element(screen_width / 5, desired_width, screen_height, screen))
else:
elements.append(Element(elements[i - 1].left + desired_width, desired_width,
screen_height, screen))
i += 1
pygame.display.update()
# Initializing Elements
desired_width = (screen_width - (2/5)*screen_width) / num_elements
initialize_elements(desired_width)
while(True):
clock.tick(FPS)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
pygame.display.update()
main()
解决方案
pygame.event.pump()
在显示的更新在窗口中可见之前,您需要处理事件。
对于游戏的每一帧,您都需要对事件队列进行某种调用。这确保您的程序可以在内部与操作系统的其余部分进行交互。
如果要显示台词并延迟游戏,则必须更新显示并处理事件。
while i < num_elements:
if i == 0:
elements.append(Element(screen_width / 5, desired_width, screen_height, screen))
else:
elements.append(Element(elements[i - 1].left + desired_width, desired_width,
screen_height, screen))
i += 1
pygame.display.flip()
pygame.time.delay(delay * 100) # 100 milliseconds = 0.1 second
pygame.event.pump()
推荐阅读
- laravel - Inertia + Laravel - 重新加载帖子页面并保留结果
- stm32 - STM32F1 GPIO寄存器LED不闪烁,一直亮着
- docker - 在 Apache2 上运行 Docker 容器
- excel - 组合框自动更改
- firebase - 如何使用带有 firebase 的提供程序添加 CircularProgressIndicator
- visual-studio-code - 如何保持 VS Code 侧边栏中的部分保持相同的顺序
- java - 如何检查输入的数字是否在数组中?
- pine-script - 添加 1 小节延迟(松树脚本)
- oracle - oracle中相交集运算符的替代
- java - 无法使用 jline3 创建操作系统终端