Top.Mail.Ru
Ответы

Звук зациклен и воспроизводится много раз одновременно

Я создавал игру и столкнулся с проблемой, где звук воспроизводится много раз одновременно и зацикленный. Мне это не нужно. Как это исправить?

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
 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() # Останавливаем музыку после окончания игры