Menu
CoddyTech

事件触发音效

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

声音属于某个瞬间:硬币被拿到、门打开、敌人被击中。你的代码已经为每个瞬间准备好了位置,也就是事件发生时改变游戏状态的 if。在同一个 if 里播放声音:

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

if 只会在一帧内为真,因为硬币会在同一帧移开。因此,每枚硬币只会播放一次声音。

如果在其他位置播放,声音就会错过对应的瞬间。在 if score > 0: 下方的绘制代码中播放,第一枚硬币出现后,它就会在每一帧重新播放:每秒 60 次,变成一阵持续不断的嗡嗡声。

challenge icon

挑战

简单

给每枚硬币添加声音。

  1. 在循环之前,将 assets/sounds/coin.ogg 加载到 coin_sound 中。
  2. 在收集硬币的 if 语句中播放声音,每枚硬币播放一次。

按“开始”,用方向键收集一枚硬币:你会听到声音。然后点击“检查”。

亲手试试

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)

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.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 在线编辑器