从pygame中的列表中绘制线条

时间:2013-07-05 09:36:06

标签: python pygame draw lines

我正在使用像素列表来使用pygame绘制线条。 我使用pygame.time.get_ticks()函数每秒向列表中添加新像素,以便在程序前进时同时绘制多行。 以下是代码中的代码段:

    screen_size = [self.xsize, self.ysize]
    screen = pygame.display.set_mode(screen_size)
    start_points = list()
    start_points.append(self.get_random_pixel())
    screen.fill((255, 255, 255))

    while True

        if time.time.get_ticks() % 1000 == 0:
            start_points.append(self.get_random_pixel())

        for i in range(len(start_points)):
            old_coord = start_points[i]
            new_coord = self.nearest_neighbor(old_coord)
            pygame.draw.line(screen, self.get_col(old_coord), old_coord, new_coord, 2)
            start_points[i] = new_coord
            pygame.display.flip()

关于这一点的一些概念: 我跑这个时只画一幅画线。 2.随着程序的进展,列表start_points似乎正在增长,并且会添加更多像素。 3.当列表具有固定大小(假设为100)时,我确实有100行同时绘制。

那么这里发生了什么?为什么我不能随着时间的推移同时画出更多的线条?

谢谢! 奥马尔

1 个答案:

答案 0 :(得分:1)

考虑一下如果你的循环运行23毫秒就会发生什么。所以,当你第一次打电话给get_ticks时,你得到0.然后你得到23,46,......,989,1012,......,1978,2001,......,2990,3013,......等等。在你击中第一个可被1000整除的数字之前,它将是23秒!

当然,在现实生活中,你的循环时间不是恒定的,而是变化很大,但你的问题基本相同。

解决此问题的正确方法是围绕事件循环或固定的帧速率循环重新组织程序。

使用事件循环,您只需使用set_timer来触发事件一次/秒。此外,即使没有发生任何事情,也不要尽快重新绘制和翻转屏幕,不断燃烧100%的CPU,甚至可能让游戏缓慢响应事件,只有在实际需要时才会重新绘制并翻转屏幕,几乎没有使用CPU,几乎总是准备回应。

使用固定的帧速率,比如20fps,你可以每20帧发射一次。而且,你只需要重新绘制屏幕20次/秒,而不是尽可能快,这样你就可以减少CPU的使用,并且可以在1/20秒内响应任何内容。

但如果你真的想这样做,你可以。你只需要跟踪下一次开火的时间。例如:

next_line_time = 0

while True:

    while time.time.get_ticks() >= next_line_time:
        start_points.append(self.get_random_pixel())
        next_line_time += 1000

作为旁注,你几乎不想在Python中使用range(len(foo))循环。只需循环foo;然后你不需要循环中的所有foo[i]。如果你确实需要索引和值,你可以总是循环enumerate(foo),这两者都给你。例如:

for i, old_coord in enumerate(start_points):
    new_coord = self.nearest_neighbor(old_coord)
    pygame.draw.line(screen, self.get_col(old_coord), old_coord, new_coord, 2)
    start_points[i] = new_coord
    pygame.display.flip()

此外,您几乎肯定不希望在每一行之后致电flip。绘制每一条线应该花费几微秒,并且试图以比你的显示器更快的速度翻转和/或你的眼睛可以检测到是浪费。