Menu
CoddyTech

オブジェクトのリスト

CoddyのPygameジャーニー「スプライトと画像」セクションの一部。レッスン 13/36。

名前付きの星が2つあるだけでは、空とは言えません。40個ならリストが必要です。ループでオブジェクトを作り、それぞれを追加します。

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))

次に、1つのループですべてを更新し、別のループですべてを描画します。

for star in stars:
    star.update()

forの中では、starは順番に各オブジェクトを指すので、star.update()はその星を固有の速度で動かします。星をさらに100個追加しても、変更するのは数字1つだけです。更新と描画のコードはそのままです。

ゲームループの前に、リストを一度だけ作ります。ループ内で作ったリストは、フレームごとに新しい星のリストになり、すべて開始位置に戻るため、何も動きません。

challenge icon

チャレンジ

中級
  1. 先頭にimport randomを追加します。
  2. ループの前に、starsを作成します。これは40個のStarオブジェクトのリストで、それぞれに0から639までのランダムなx、0から479までのランダムなy、1から3までのランダムな速度を設定します。
  3. ループ内で、stars内のすべての星を更新し、fillの後にすべての星を描画します。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プレイグラウンド