Глава 21 · Проект: космический шутер
Звуки выстрела, попадания и взрыва
Три коротких звука — загруженные один раз, и молча пропускаемые без звуковой карты.
Три коротких звука дополняют игру: выстрел, взрыв и попадание по кораблю. Все они —
оригинальные, синтезированные напрямую в Python через встроенный модуль
wave (короткие синус-сигналы и затухающий шум), без единой
скачанной из интернета записи.
fragment_play_sound.py
def play(self, key):
sound = self.sounds.get(key)
if sound is not None:
sound.play()
# при выстреле:
self.assets.play("laser")
# при уничтожении врага:
self.assets.play("explosion")
# при ударе по кораблю:
self.assets.play("player_hit")
sound может быть None — и это нормально
Раздел 21.10 уже показал: если звуковое устройство недоступно,
AssetStore хранит None вместо объекта Sound. Проверка if sound is not None перед каждым .play() гарантирует, что игра (и автоматические тесты, раздел 21.24) не падает без звуковой карты — просто играет молча.Звук загружается один раз, как и изображения
Раздел 20.24 уже предупреждал:
pygame.mixer.Sound(...) читает файл с диска — вызывать его внутри игрового цикла на каждый выстрел означало бы читать один и тот же файл заново десятки раз в секунду. Здесь загрузка происходит один раз в AssetStore.__init__(), а внутри цикла вызывается только .play() у уже загруженного объекта.