动画 Pygame 个矩形以向上移动屏幕
Animating Pygame Rects to move up the Screen
努力绘制成簇的矩形 [气泡] 以不同的速度在屏幕上移动。在渲染移动矩形时我遇到了障碍。
到目前为止,我采用的方法是用 class 个我的 Bubble class 实例填充一个列表。从那里我遍历了实例列表并调用了它们的 blow_bubble 方法,有效地在屏幕上的不同位置绘制了每个气泡,并根据每个气泡的移动速度对其进行了初始化。然后将这些气泡附加到名为 "drawn" 的单独列表中,以表示它们确实已被绘制(尽管未渲染)。
下一部分是颠簸的地方。
我有一个 while 循环,它接受绘制列表的长度大于零作为 运行 的条件。按照本文中的表格:http://programarcadegames.com/index.php?chapter=introduction_to_animation
屏幕表面设置为在循环开始时填充,在循环结束时我通过 pygame.display.flip() 更新了屏幕表面。在 while 循环的中间,我正在遍历绘制列表中的 class 个实例,并通过实例的属性移动速率递减表示它们的 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()
除非我对 pygame 的工作原理有很大的误解,否则您误解了它的工作原理。为了让 oygamr 工作,它需要一个 'render loop',一个代码循环,您可以在其中重复移动对象,用 pygame.draw.rect 之类的东西绘制它,然后用 pygame.display.flip 翻转显示。你一直这样做,直到你完成动画。
因此,您需要进行大量更改。
- 您的 'blow bubble' 函数不需要重置气泡的位置,只需增加其位置并调用 pygame.draw.rect
- 您不需要 'dawn' 列表,只需要第一个气泡列表。在您的 while 循环中,您需要遍历气泡列表,在每个气泡列表上调用 'blow bubble'。
- 您需要将 'pygame.display.flip' 移动到 while 循环中,但在吹完所有气泡之后。
您的索引超出范围错误是因为在 for 循环退出后 I 没有神奇地重置,它使 I 保持 for 循环结束时的状态。
努力绘制成簇的矩形 [气泡] 以不同的速度在屏幕上移动。在渲染移动矩形时我遇到了障碍。
到目前为止,我采用的方法是用 class 个我的 Bubble class 实例填充一个列表。从那里我遍历了实例列表并调用了它们的 blow_bubble 方法,有效地在屏幕上的不同位置绘制了每个气泡,并根据每个气泡的移动速度对其进行了初始化。然后将这些气泡附加到名为 "drawn" 的单独列表中,以表示它们确实已被绘制(尽管未渲染)。
下一部分是颠簸的地方。
我有一个 while 循环,它接受绘制列表的长度大于零作为 运行 的条件。按照本文中的表格:http://programarcadegames.com/index.php?chapter=introduction_to_animation 屏幕表面设置为在循环开始时填充,在循环结束时我通过 pygame.display.flip() 更新了屏幕表面。在 while 循环的中间,我正在遍历绘制列表中的 class 个实例,并通过实例的属性移动速率递减表示它们的 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()
除非我对 pygame 的工作原理有很大的误解,否则您误解了它的工作原理。为了让 oygamr 工作,它需要一个 'render loop',一个代码循环,您可以在其中重复移动对象,用 pygame.draw.rect 之类的东西绘制它,然后用 pygame.display.flip 翻转显示。你一直这样做,直到你完成动画。
因此,您需要进行大量更改。
- 您的 'blow bubble' 函数不需要重置气泡的位置,只需增加其位置并调用 pygame.draw.rect
- 您不需要 'dawn' 列表,只需要第一个气泡列表。在您的 while 循环中,您需要遍历气泡列表,在每个气泡列表上调用 'blow bubble'。
- 您需要将 'pygame.display.flip' 移动到 while 循环中,但在吹完所有气泡之后。
您的索引超出范围错误是因为在 for 循环退出后 I 没有神奇地重置,它使 I 保持 for 循环结束时的状态。