Menu
CoddyTech

背景音乐

本课属于 Coddy Pygame 学习旅程的“音效与游戏体验”单元。第 5 课,共 23 课。

音乐和音效不同。音乐持续时间较长,会循环播放,而且同一时间只播放一条音轨。pygame 为它提供了单独的播放器:pygame.mixer.music。它会在播放时一点点读取文件,而不是像 Sound 那样一次性加载整个文件。

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

load() 用来选择音轨。play() 用来开始播放;其中的数字表示还要重复播放多少次。play(-1) 会一直重复播放,这正适合用作背景音乐。play() 或 play(0) 会播放一次。

在循环开始前启动音乐,只启动一次。如果在循环中调用 play(),音乐就会在每一帧都从头开始播放。音乐有自己的音量,可以用 pygame.mixer.music.set_volume() 设置,范围是 0.0 到 1.0。让音乐比音效稍微小声一些,音效就会更突出。

音效仍会叠加在音乐上播放:金币音效和音乐会同时响起。

challenge icon

挑战

简单

为投币游戏添加背景音乐。

  1. 在循环之前,使用 pygame.mixer.music.load() 加载 assets/music/level.ogg。
  2. 将音乐音量设为 0.6。
  3. 使用 play(-1) 启动音乐,让它循环播放。

按“开始”:音乐会开始播放并持续循环。然后按“检查”。

亲手试试

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

音效与游戏体验中的所有课

自己练习: Pygame 在线编辑器