イベントで音を鳴らす
CoddyのPygameジャーニー「サウンドとゲームの手応え」セクションの一部。レッスン 2/23。
サウンドは特定の瞬間に結びついています。コインを取ったとき、ドアが開いたとき、敵に攻撃が当たったときです。コードにはすでに、それぞれの瞬間に対応する場所、つまりそのイベントが起きたときにゲームの状態を変えるifがあります。同じifの中でサウンドを再生しましょう。
if player.colliderect(coin):
score += 1
coin_sound.play()
coin.x = random.randint(20, 444)コインは同じフレーム内で移動するため、ifが真になるのは1フレームだけです。そのため、サウンドはコインを取るたびに1回だけ再生されます。
ほかの場所で再生すると、サウンドは適切なタイミングを逃してしまいます。if score > 0:の下にある描画コード内に置くと、最初のコインを取った後は毎フレーム再生されます。つまり、1秒間に60回、長いブザー音のようになります。
チャレンジ
簡単緑色の四角形は矢印キーでコインを集めます。コインを取るたびに音を鳴らしましょう。
- ループの前に、
assets/sounds/coin.oggをcoin_soundに読み込みます。 - コインを集める
ifの中で、コインごとに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)
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プレイグラウンド