Menu
CoddyTech

Звук при событии

Часть раздела Звук и игровые ощущения путешествия по Pygame на Coddy. Урок 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()
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Звук и игровые ощущения

Потренируйтесь самостоятельно: Песочница Pygame