Звуки и удерживаемые клавиши
Часть раздела Звук и игровые ощущения путешествия по Pygame на Coddy. Урок 4 из 23.
Удерживайте пробел, и корабль будет стрелять лазером каждые 12 кадров. В исходном коде звук лазера запускается так:
if keys[pygame.K_SPACE]:
laser_sound.play()
if cooldown == 0:
lasers.append(...)keys[pygame.K_SPACE] имеет значение true в каждом кадре, пока клавиша нажата. Поэтому, пока вы удерживаете пробел, звук запускается 60 раз в секунду, хотя летят всего 5 лазеров. Вместо выстрелов слышно резкое жужжание.
Исправление такое же, как и раньше: запускайте звук в тот момент, когда происходит соответствующее действие. Выстрел происходит внутри if cooldown == 0:, поэтому звук нужно запускать там:
if keys[pygame.K_SPACE]:
if cooldown == 0:
lasers.append(...)
laser_sound.play()Теперь у каждого лазера есть свой звук, а у всего остального его нет. Для действия, которое происходит один раз за нажатие, например прыжка, запускайте звук в событии KEYDOWN: на каждое нажатие приходится одно событие, независимо от того, как долго клавиша остаётся нажатой.
Задание
ЛегкоУдерживай пробел, и корабль будет стрелять лазером каждые 12 кадров, но звук гудит. Перемести laser_sound.play(), чтобы он воспроизводился один раз при каждом выстреле лазера: в ветвь 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()
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Звук и игровые ощущения
4Тряска экрана и вспышка при попадании
Тряска экранаВспышка при попаданииОстановка при попаданииСоблюдайте умеренность6Доведём «Звёздный патруль» до блеска
Звуки «Звёздного патруля»Искры при каждом попаданииПотренируйтесь самостоятельно: Песочница Pygame