Menu
CoddyTech

对象列表

本课属于 Coddy Pygame 学习旅程的“精灵与图像”单元。第 13 课,共 39 课。

两颗命名星星构不成一片星空。四十颗星星需要用列表来存放:在循环中创建这些对象,并将每个对象添加到列表中。

stars = []
for i in range(40):
    x = random.randint(0, 639)
    y = random.randint(0, 479)
    speed = random.randint(1, 3)
    stars.append(Star(x, y, speed))

然后,一个循环更新所有星星,另一个循环绘制所有星星:

for star in stars:
    star.update()

在 for 循环中,star 依次代表每个对象,因此 star.update() 会让这颗星星按自己的速度移动。再添加一百颗星星,只需更改一个数字;更新和绘制代码都不用改。

在游戏循环开始前创建一次列表。如果在游戏循环中创建列表,每一帧都会生成一个包含新星星的新列表,所有星星都会回到起始位置,因此它们永远不会移动。

challenge icon

挑战

中等

让天空中落下 40 颗星星。

  1. 在顶部添加 import random。
  2. 在循环之前,创建 stars:40 个 Star 对象,每个对象的 x 在 0 到 639 之间随机取值,y 在 0 到 479 之间随机取值,speed 在 1 到 3 之间随机取值。
  3. 更新并绘制 stars 中的每颗星星。移除 slow 和 fast。

按下“开始”:40 颗星星落下。然后点击“检查”。

亲手试试

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Falling Stars")
clock = pygame.time.Clock()

class Star:
    def __init__(self, x, y, speed):
        self.x = x
        self.y = y
        self.speed = speed

    def update(self):
        self.y += self.speed
        if self.y > 480:
            self.y = 0

    def draw(self, screen):
        pygame.draw.circle(screen, (255, 255, 255), (self.x, self.y), 4)


slow = Star(200, 0, 1)
fast = Star(440, 0, 3)

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    slow.update()
    fast.update()

    screen.fill((20, 22, 40))
    slow.draw(screen)
    fast.draw(screen)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

精灵与图像中的所有课

自己练习: Pygame 在线编辑器