Звук зациклен и воспроизводится много раз одновременно
Я создавал игру и столкнулся с проблемой, где звук воспроизводится много раз одновременно и зацикленный. Мне это не нужно. Как это исправить?
import pygame
from random import randint
pygame.init()
pygame.mixer.init()
pygame.mixer.music.load('game.mp3')
pygame.mixer.music.play(loops=-1)
FPS = 60
clock = pygame.time.Clock()
WIDTH = 600
HEIGHT = 400
FONT = pygame.font.SysFont(None, 60)
TEXT_END = FONT.render('GAME OVER!', 1, (0, 255, 0))
RECT_TEXT_END = TEXT_END.get_rect(center=(WIDTH // 2, HEIGHT // 2))
screen = pygame.display.set_mode((WIDTH, HEIGHT))
screen.fill((120, 170, 230))
done = False
mode = 'game'
count = 0
# класс игрока
class Player(pygame.sprite.Sprite):
def __init__(self) -> None:
super().__init__()
self.img = pygame.image.load('cube.png')
self.rect = self.img.get_rect(center=(WIDTH // 2, HEIGHT - 16))
# Управление игроком
def update(self):
pressed = pygame.key.get_pressed()
if (pressed[pygame.K_LEFT] or pressed[pygame.K_a]) and self.rect.left > 0:
self.rect.move_ip(-5, 0)
pressed = pygame.key.get_pressed()
if (pressed[pygame.K_RIGHT] or pressed[pygame.K_d]) and self.rect.right < WIDTH:
self.rect.move_ip(5, 0)
pressed = pygame.key.get_pressed()
if (pressed[pygame.K_UP] or pressed[pygame.K_w]) and self.rect.top > 0:
self.rect.move_ip(0, -5)
pressed = pygame.key.get_pressed()
if (pressed[pygame.K_DOWN] or pressed[pygame.K_s]) and self.rect.bottom < HEIGHT:
self.rect.move_ip(0, 5)
def draw(self, screen):
screen.blit(self.img, self.rect)
# класс врага
class Enemy(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.img = pygame.image.load('bomb.png')
self.rect = self.img.get_rect(center=(randint(16, WIDTH - 16), -64))
self.speed = 3
def update(self):
# перемещение врага
self.rect.move_ip(0, self.speed)
if self.rect.bottom > HEIGHT + 32:
self.rect.center = (randint(16, WIDTH - 16), -64)
self.speed += 0.1
return 1
return 0
def draw(self, screen):
'отрисовка'
screen.blit(self.img, self.rect)
player = Player()
enemy = Enemy()
# t = 0
# if t == FPS * 5:
# t += 1
sound_bomb = pygame.mixer.Sound('babah.mp3')
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
if mode == 'game':
player.update()
count += enemy.update()
if player.rect.colliderect(enemy.rect):
mode = 'end'
TEXT_COUNT = FONT.render(str(count), 1, (0, 255, 0))
RECT_TEXT_COUNT = TEXT_COUNT.get_rect(center=(WIDTH // 2, HEIGHT // 2 + 48))
screen.fill((120, 170, 230))
player.draw(screen)
enemy.draw(screen)
elif mode == 'end':
screen.fill((155, 0, 0))
screen.blit(TEXT_END, RECT_TEXT_END)
screen.blit(TEXT_COUNT, RECT_TEXT_COUNT)
pygame.mixer.music.pause()
pygame.init()
pygame.mixer.init()
sound_bomb.play()
pygame.display.flip()
clock.tick(FPS)
Замените строку pygame.mixer.music.play(loops=-1) на pygame.mixer.music.play(loops=0). Это остановит фоновую музыку после одного воспроизведения.
Вместо воспроизведения звука взрыва каждый раз в игровом цикле при переходе в режим "end", переместите его внутрь условного блока, чтобы он воспроизводился только один раз:
Python
elif mode == 'end':
# ... (остальная часть кода)
if not sound_bomb.get_busy(): # Проверка, не воспроизводится ли звук уже
sound_bomb.play()
Остановите фоновую музыку после окончания игры:
Добавьте pygame.mixer.music .stop() в конце игрового цикла, когда игра завершена.
Используйте каналы для управления звуками:
Вы можете использовать каналы для независимого управления фоновой музыкой и звуками эффектов. Это позволит вам, например, приглушать музыку во время воспроизведения звуков.
import pygame
from random import randint
pygame.init()
pygame.mixer.init()
pygame.mixer.music .load('game.mp3')
pygame.mixer.music.play(loops=0) # Убираем зацикливание
# ... (остальная часть вашего кода)
while not done:
# ... (ваш игровой цикл)
elif mode == 'end':
# ... (остальная часть кода)
if not sound_bomb.get_busy(): # Воспроизводим звук взрыва только один раз
sound_bomb.play()
pygame.mixer.music .stop() # Останавливаем музыку после окончания игры