Menu
CoddyTech

Âm thanh khi có sự kiệ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 2 trên 23.

Âm thanh gắn với một khoảnh khắc: đồng xu được nhặt, cánh cửa mở ra, kẻ địch bị đánh trúng. Code của bạn đã có vị trí dành cho từng khoảnh khắc, đó là câu lệnh if làm thay đổi trò chơi khi sự việc xảy ra. Phát âm thanh bên trong chính câu lệnh if đó:

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

if chỉ đúng trong một khung hình, vì đồng xu di chuyển đi ngay trong khung hình đó. Vì vậy, âm thanh chỉ phát một lần cho mỗi đồng xu.

Nếu phát ở nơi khác, âm thanh sẽ lỡ mất khoảnh khắc của nó. Nếu đặt trong đoạn code vẽ bên dưới if score > 0:, âm thanh sẽ phát lại ở mọi khung hình sau khi nhặt đồng xu đầu tiên: 60 lần mỗi giây, tạo thành tiếng vo ve kéo dài.

challenge icon

Thử thách

Dễ

Thêm âm thanh cho mỗi đồng xu.

  1. Trước vòng lặp, tải assets/sounds/coin.ogg vào coin_sound.
  2. Phát âm thanh trong câu lệnh if dùng để nhặt đồng xu, mỗi đồng xu một lần.

Nhấn Chơi rồi dùng các phím mũi tên để nhặt một đồng xu: bạn sẽ nghe thấy âm thanh. 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)

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

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

Tự luyện tập: Playground Pygame