Menu
CoddyTech

Danh sách đối tượng

Thuộc phần Sprite và hình ảnh trong hành trình Pygame của Coddy. Bài học 13 trên 39.

Hai ngôi sao được đặt tên riêng lẻ thì chưa thành một bầu trời. Bốn mươi ngôi sao cần một danh sách: tạo các đối tượng trong một vòng lặp rồi thêm từng đối tượng vào danh sách.

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

Sau đó, một vòng lặp cập nhật tất cả các ngôi sao, còn vòng lặp khác vẽ tất cả chúng:

for star in stars:
    star.update()

Bên trong for, star lần lượt là từng đối tượng, nên star.update() di chuyển ngôi sao đó theo tốc độ riêng. Thêm một trăm ngôi sao nữa chỉ cần đổi một con số; code cập nhật và vẽ vẫn giữ nguyên.

Tạo danh sách một lần, trước vòng lặp trò chơi. Danh sách được tạo bên trong vòng lặp sẽ là một danh sách mới gồm các ngôi sao mới ở mỗi khung hình. Chúng đều quay về vị trí ban đầu, nên chẳng có gì di chuyển cả.

challenge icon

Thử thách

Trung bình

Lấp đầy bầu trời bằng 40 ngôi sao đang rơi.

  1. Thêm import random ở đầu.
  2. Trước vòng lặp, tạo stars: 40 đối tượng Star, mỗi đối tượng có x ngẫu nhiên từ 0 đến 639, y từ 0 đến 479 và tốc độ từ 1 đến 3.
  3. Cập nhật và vẽ từng ngôi sao trong stars. Xóa slow và fast.

Nhấn Chơi: 40 ngôi sao rơi xuống. Sau đó nhấn Kiểm tra.

Tự làm thử

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

Tất cả bài học trong Sprite và hình ảnh

Tự luyện tập: Playground Pygame