Menu
CoddyTech

Nhạc nền

Thuộc phần Âm thanh và cảm giác chơi trong hành trình Pygame của Coddy. Bài học 5 trên 23.

Nhạc khác với hiệu ứng âm thanh. Nhạc kéo dài, lặp lại và mỗi lần chỉ phát một bản nhạc. pygame có trình phát riêng cho nhạc, pygame.mixer.music. Trình phát đọc tệp từng chút một trong khi phát, thay vì tải toàn bộ tệp như với Sound.

pygame.mixer.music.load("assets/music/level.ogg")
pygame.mixer.music.set_volume(0.6)
pygame.mixer.music.play(-1)

load() chọn bản nhạc. play() bắt đầu phát bản nhạc; con số trong lệnh cho biết số lần phát lại. play(-1) phát lặp vô hạn, phù hợp với nhạc nền. play() hoặc play(0) phát nhạc một lần.

Bắt đầu phát nhạc một lần trước vòng lặp. Nếu gọi play() trong vòng lặp, lệnh sẽ phát lại bản nhạc từ đầu ở mỗi khung hình. Nhạc có âm lượng riêng, được đặt bằng pygame.mixer.music.set_volume(), từ 0.0 đến 1.0. Để nhạc nhỏ hơn hiệu ứng âm thanh một chút sẽ giúp hiệu ứng nổi bật hơn.

Hiệu ứng âm thanh vẫn phát cùng với nhạc: bạn sẽ nghe thấy tiếng đồng xu và bản nhạc cùng lúc.

challenge icon

Thử thách

Dễ

Thêm nhạc nền cho trò chơi nhặt xu.

  1. Trước vòng lặp, tải assets/music/level.ogg bằng pygame.mixer.music.load().
  2. Đặt âm lượng nhạc thành 0.6.
  3. Bắt đầu phát bằng play(-1) để nhạc lặp lại.

Nhấn Chơi: nhạc bắt đầu phát và tiếp tục lặp lại. Sau đó nhấn Kiểm tra.

Tự làm thử

import random
import pygame

pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Coins")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)

coin_sound = pygame.mixer.Sound("assets/sounds/coin.ogg")

player = pygame.Rect(220, 160, 40, 40)
coin = pygame.Rect(100, 100, 16, 16)
score = 0

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

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        player.x -= 5
    if keys[pygame.K_RIGHT]:
        player.x += 5
    if keys[pygame.K_UP]:
        player.y -= 5
    if keys[pygame.K_DOWN]:
        player.y += 5
    player.clamp_ip(screen.get_rect())

    if player.colliderect(coin):
        score += 1
        coin_sound.play()
        coin.x = random.randint(20, 444)
        coin.y = random.randint(50, 324)

    screen.fill((30, 30, 46))
    pygame.draw.rect(screen, (255, 210, 60), coin)
    pygame.draw.rect(screen, (90, 200, 120), player)
    score_text = font.render(f"Coins: {score}", True, (240, 240, 240))
    screen.blit(score_text, (10, 10))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Tất cả bài học trong Âm thanh và cảm giác chơi

Tự luyện tập: Playground Pygame