Menu
CoddyTech

Список объектов

Часть раздела Спрайты и изображения путешествия по Pygame на Coddy. Урок 13 из 36.

Две звезды с заданными именами — это ещё не небо. Для сорока нужна список: создавай объекты в цикле и добавляй каждый из них.

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

Задание

Средне
  1. Добавь import random в начало.
  2. Перед циклом создай stars: список из 40 объектов Star, у каждого из которых случайное значение x от 0 до 639, случайное значение y от 0 до 479 и случайная скорость speed от 1 до 3.
  3. В цикле обновляй каждую звезду в stars и рисуй каждую звезду после заливки. Удали slow и fast.

Попробуйте сами

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()
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Спрайты и изображения

Потренируйтесь самостоятельно: Песочница Pygame