动画Pygame Rects向上移动屏幕

时间:2017-01-19 03:04:57

标签: animation pygame rect

努力的目的是绘制以不同速度向上移动屏幕的集群[气泡]。在渲染移动的地方时,我遇到了障碍。

到目前为止,我所采用的方式是使用我的Bubble类的类实例填充列表。从那里我迭代了实例列表并调用了他们的blow_bubble方法,有效地在屏幕上的不同位置绘制每个气泡,并使用自己的移动速度值初始化每个气泡。然后将这些气泡附加到一个名为" draw"的单独列表中,以表示它们确实已被绘制(虽然没有渲染)。

下一部分是它变得坎坷的地方。

我有一个while循环,它接受绘制列表的长度大于零作为运行条件。根据本文中的表单:http://programarcadegames.com/index.php?chapter=introduction_to_animation 屏幕表面设置为在循环开始时填充,在结束时我通过pygame.display.flip()更新了屏幕表面。在while循环的中间,我遍历绘制列表中的类实例,并按实例的归因移动速度递减表示其y值的属性。

不知怎的,这不起作用。

我已经检查过以确保y值实际递减;在print语句中,输出是预期的:y值下降到负数。然而,这些仍然是静态绘制的。

一如既往,非常感谢任何见解。

#colors, screen, clock, etc defined above but omitted 
pygame.init()

class Bubble():
    def __init__(self, screenheight, screenwidth):
        self.w = self.h = 0 
        self.x,  self.y = 0, 0
        self.moverate = 0

    def reset_bubble(self):
        self.w = self.h = random.randrange(2, int(screenwidth*1/4))
        self.x = random.randrange(0, (screenwidth-self.w))
        self.y = screenheight-self.w
        self.moverate = 1

    def blow_bubble(self):
        self.reset_bubble()
        pygame.draw.rect(screen, WHITE, (self.x, self.y, self.w, self.h), 10)

bubbles = []
drawn = []
i = 0

for i in range(10):          #creates list of bubble objects
        bubble = Bubble(screenheight, screenwidth)
        bubbles.append(bubble)

for i in range(len(bubbles)):      #draws bubbles without rendering them
    bubbles[i].blow_bubble()
    drawn.append(bubbles[i])       #appends objects to a new list (drawn)

while len(drawn) > 0:
    screen.fill((BLACK))
    drawn[i].y -= drawn[i].moverate     #moves the bubble up the screen
    pygame.display.flip()               #updates the screen

    if i >= 0:    #counts up til len(drawn) then counts down [then up again]
        i+=1  #to make sure we move every bubble a little each iteration
    if i ==len(drawn):
        i-= 1
clock.tick(FPS)
pygame.quit()

1 个答案:

答案 0 :(得分:0)

除非我非常误解pygame的工作原理,否则你误解了它是如何工作的。为了让oygamr工作,它需要一个渲染循环',一个代码循环,你可以重复移动对象,用pygame.draw.rect之类的东西绘制它,然后用pygame.display翻转显示。翻转。你一直这样做,直到你完成动画。

所以,你需要做一些改变。

  • 你的吹泡泡'函数需要不重置气泡的位置,只需增加其位置并调用pygame.draw.rect
  • 你不需要一个黎明'列表,只是第一个气泡列表。在你的while循环中,你需要遍历泡泡列表,调用“吹泡泡”#39;在每一个。
  • 你需要移动' pygame.display.flip'在while循环中,但是在所有气泡都被炸掉之后。

你的索引超出范围错误是因为在for循环退出后我没有神奇地重置,它会让我像for循环完成时的那样。