音と押し続けているキー
CoddyのPygameジャーニー「サウンドとゲームの手応え」セクションの一部。レッスン 4/23。
スペースキーを押し続けると、船は12フレームごとにレーザーを発射します。最初のコードでは、次のようにレーザー音を再生します。
if keys[pygame.K_SPACE]:
laser_sound.play()
if cooldown == 0:
lasers.append(...)keys[pygame.K_SPACE]は、キーが押されているすべてのフレームでtrueになります。そのため、スペースキーを押し続けると、レーザーは5発しか飛ばないのに、音は1秒間に60回鳴り始めます。発射音ではなく、耳障りなブザー音のように聞こえます。
解決策は前と同じルールです。動作が起こる場所で音を再生します。発射はif cooldown == 0:の内側で起こるので、音もそこに置きます。
if keys[pygame.K_SPACE]:
if cooldown == 0:
lasers.append(...)
laser_sound.play()これで、レーザーが発射されるたびに音が鳴り、それ以外では鳴りません。ジャンプのように押すたびに1回だけ起こる動作では、代わりにKEYDOWNイベント内で音を再生します。キーを押し続ける長さにかかわらず、押すたびにイベントが1回発生するからです。
チャレンジ
簡単スペースキーを押し続けると、宇宙船は12フレームごとにレーザーを発射しますが、音がブザーのように鳴ります。laser_sound.play()を移動して、発射したレーザーごとに1回再生されるようにしてください。レーザーを追加した後、if cooldown == 0:の分岐の中に移動します。
自分で試してみよう
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プレイグラウンド