Menu
CoddyTech

音效与按住的按键

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

按住 Space,飞船每 12 帧发射一束激光。起始代码这样播放激光音效:

if keys[pygame.K_SPACE]:
    laser_sound.play()
    if cooldown == 0:
        lasers.append(...)

按下按键的每一帧,keys[pygame.K_SPACE] 都为 true。因此,按住 Space 时,音效每秒会播放 60 次,但只有 5 束激光会飞出。你听到的不是一发发射击声,而是一阵刺耳的嗡嗡声。

解决方法和之前一样:在动作发生的地方播放音效。射击发生在 if cooldown == 0: 里面,所以音效也要放在那里:

if keys[pygame.K_SPACE]:
    if cooldown == 0:
        lasers.append(...)
        laser_sound.play()

现在,每束激光都会有对应的音效,其他时候则不会播放音效。对于每次按下只发生一次的动作,比如跳跃,可以在 KEYDOWN 事件中播放音效:每次按下都会触发一个事件,无论按键按住多久。

challenge icon

挑战

简单

让激光音效每发射一束激光播放一次,而不是持续嗡嗡作响。

  1. 找到 laser_sound.play()。
  2. 将它移到 if cooldown == 0: 分支中,放在添加激光之后。

按“开始”并按住 Space:每发射一束激光,你都会听到一次射击声。然后按“检查”。

亲手试试

import pygame

pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Lasers")
clock = pygame.time.Clock()

laser_sound = pygame.mixer.Sound("assets/sounds/laser.ogg")
laser_sound.set_volume(0.5)

ship = pygame.Rect(220, 300, 40, 30)
lasers = []
cooldown = 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]:
        ship.x -= 5
    if keys[pygame.K_RIGHT]:
        ship.x += 5
    ship.clamp_ip(screen.get_rect())

    if cooldown > 0:
        cooldown -= 1
    if keys[pygame.K_SPACE]:
        laser_sound.play()
        if cooldown == 0:
            lasers.append(pygame.Rect(ship.centerx - 2, ship.top - 12, 4, 12))
            cooldown = 12

    for laser in lasers:
        laser.y -= 8
    lasers = [laser for laser in lasers if laser.bottom > 0]

    screen.fill((30, 30, 46))
    for laser in lasers:
        pygame.draw.rect(screen, (255, 230, 90), laser)
    pygame.draw.rect(screen, (80, 200, 230), ship)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

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

自己练习: Pygame 在线编辑器