0

我正在使用 Python 编写程序并使用 Pygame。这是基本代码的样子:

while 1:

   screen.blit(background, (0,0))
   for event in pygame.event.get():

      if event.type == QUIT:
        pygame.quit()
        sys.exit()

      if event.type == KEYDOWN and event.key == K_c:
        circle_create = True
        circle_list.append(Circle())

      if event.type == MOUSEBUTTONDOWN and circle_create == True:
        if clicks == 0:
            circle_list[i].center()
        clicks += 1


      if event.type == MOUSEMOTION and clicks == 1 and circle_create == True:
        circle_list[i].stretch()

   if circle_create == True:
     circle_list[i].draw_circle()

   if clicks == 2:
     clicks = 0
     i += 1
     circle_create = False    

 pygame.display.update()

我想要做的是让对象的draw_circle()函数通过循环不断更新,以便为列表中的所有对象显示绘制的圆圈,但是由于列表是迭代的,它会更新添加的新对象和对象已经附加的不更新。

该程序有效,它根据用户输入绘制圆圈,但更新问题是我需要解决的唯一问题。有没有办法让while循环更新对象列表中的所有元素?我已经尝试了很多天,但我无法找到一个好的解决方案。任何想法表示赞赏。谢谢

4

3 回答 3

1

要绘制列表中的所有圆圈,只需遍历它们并在每次调用更新之前绘制它们:

for circle in circle_list:
    circle.draw_circle()

编辑:OP发布了格式不正确的代码,但说实际代码很好,所以删除了这个建议

于 2012-06-23T20:51:32.400 回答
1

您需要在 blit 之后重新绘制整个列表(它用表面“背景”覆盖整个屏幕并“擦除”它),它不是有条件的,您需要遍历整个列表并绘制它。他们在活动部分决定谁进入和谁离开列表。

Loop:
  Blit,starting new

  Event, here you decide who moves, who begin or cease to exist(append/remove)

  Redraw whole list, everyone in the circle_list.
于 2012-06-23T21:09:56.260 回答
0

编辑:我以为你已经尝试过:https ://stackoverflow.com/a/11172885/341744

该程序有效,它根据用户输入绘制圆圈,但更新问题是我需要解决的唯一问题。有没有办法让while循环更新对象列表中的所有元素?

您可以在临时列表上进行迭代,例如,如果您在迭代时杀死演员。

for circle in circles[:]:
    circle.update()
于 2012-06-23T21:13:43.303 回答