Python 在pygame中从列表中绘制线条
我正在使用像素列表从pygame中画线。 我使用pygame.time.get_ticks()函数每秒向列表中添加新像素,以便在程序运行时同时绘制多条线。 下面是代码的一个片段:Python 在pygame中从列表中绘制线条,python,pygame,draw,lines,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_p
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()
关于这一点的一些看法:
1.当我运行这个时,我只得到一个线条图。
2.随着程序的推进,随着更多像素的加入,列表的起始点似乎在增加。
3.当列表的大小固定时(比如说100),我会同时绘制100条线
这是怎么回事?随着时间的推移,我为什么不同时画更多的线呢
谢谢!
omer考虑一下,如果循环运行需要23毫秒,会发生什么。因此,第一次调用
get_ticks
时,得到0。然后你得到23,46,…,989,1012,…,1978,2001,…,2990,3013,…,等等。23秒后,你会找到第一个可以被1000整除的数字
当然,在现实生活中,你的循环时间不是常数,而是高度可变的,但你基本上有相同的问题
解决这个问题的正确方法是围绕事件循环或固定帧速率循环重新组织程序
对于事件循环,您可以使用每秒触发一次事件。此外,即使在什么都没有发生的情况下,也不要尽可能快地重新绘制和翻转屏幕,不断地消耗100%的CPU,甚至可能使您的游戏对事件的响应变得迟缓,您只需要在实际需要时重新绘制和翻转屏幕,几乎不使用CPU,并且几乎总是准备好响应
在固定帧速率下,比如说,每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
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()
作为补充说明,在Python中,您几乎不希望在
范围(len(foo))
上循环。只需在foo上循环foo
;这样,您就不需要循环中所有的foo[i]
。如果您确实需要索引和值,您可以始终循环enumerate(foo)
,这会同时为您提供索引和值。例如:
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
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
。画每一条线需要几微秒的时间,试图以比显示器和/或眼睛所能检测到的任何速度翻转都是浪费。这不可能是您的实际代码,因为至少有一个语法错误。而且,它不是完整的代码。A更容易帮助,因为人们可以运行它来查看它的功能,而不是试图理解您的描述、调试它、使用它等等。Pygame有一个内置的get_ticks函数,感谢您的提示。从现在起,我将尝试使用SSCCE。@monkey:我假设这是他已经在使用的,因为stdlibtime
模块没有time
类型或get_ticks()
函数或方法。