Pygame - я могу сделать так, чтобы у musi c было вступительное слово, а затем al oop point? - PullRequest
1 голос
/ 23 февраля 2020

В настоящее время я работаю над игрой в Pygame, и я пытался придумать, как создать музыкальный трек c, который зацикливается в точке, которая не является началом трека. По сути, он воспроизводит введение, а затем переходит к другому разделу, который повторяется без повторения этого введения.

Я подумал о нескольких способах, которые почти сработали, но у них есть проблемы.

Первый должен был иметь два отдельных аудиофайла для введения и цикла, затем использовать pygame.music.set_endevent() и просто загрузить второй аудиофайл после завершения первого. Это оставило довольно очевидный пробел и щелчок.

Вторым было также использовать два аудиофайла, но ставить в очередь во втором при загрузке первого. Проблема в том, что кажется, что вы не можете изменить режим воспроизведения с 0 (воспроизведение один раз) на -1 (зацикливание) для новой дорожки в очереди ...

Я чувствую, что должно быть способ сделать это, я бы очень признателен за любую помощь.

1 Ответ

1 голос
/ 25 февраля 2020

В приведенном ниже примере звуковые каналы PyGame используются для нескольких дорожек. Здесь создается событие, такое, что через 1500 миллисекунд воспроизводится второй звук (в то же время, что и дорожка зацикливания).

Для предложенного вами варианта использования код может воспроизводить intro-musi c в начале, но также установите таймер событий на / intro-length / миллисекунды в будущем. При получении этого события таймера зацикленная часть вашей музыки c может воспроизводиться непрерывно, так как вступление должно было только что остановиться. Использование нескольких каналов не должно иметь значения, если два звука перекрываются на несколько миллисекунд (тишины / затухания), если пользователь, конечно, не воспринимает это! Может быть, будет сложно получить 100% правильное время в совершенно разных системах, но это должно вас приблизить.

Обратите внимание, что в этом примере звуки уже инициализированы в объекты PyGame Sound, я ожидаю это уменьшит задержку запуска.

import pygame

# Window size
WINDOW_WIDTH    = 400
WINDOW_HEIGHT   = 400

DARK_BLUE = (   3,   5,  54)

### initialisation
pygame.init()
pygame.mixer.init()
window = pygame.display.set_mode( ( WINDOW_WIDTH, WINDOW_HEIGHT ) )
pygame.display.set_caption("Multi Sound with Timer")

### sound
# create separate Channel objects for simultaneous playback
channel1 = pygame.mixer.Channel(0) # argument must be int
channel2 = pygame.mixer.Channel(1)

# Rain sound from: https://www.freesoundslibrary.com/sound-of-rain-falling-mp3/ (CC BY 4.0)
rain_sound = pygame.mixer.Sound( 'rain-falling.ogg' )
channel1.play( rain_sound, -1 )   # loop the rain sound forever

# Car Horn sound from: https://www.freesoundslibrary.com/car-horn-sound-effect/ (CC BY 4.0)
horn_sound = pygame.mixer.Sound( 'car-horn.ogg' )

# Create a timer, which will (after the delay-time) post an event to the main loop
pygame.time.set_timer( pygame.USEREVENT, 1500 )   # play the horn in 1500 milliseconds



### Main Loop
clock = pygame.time.Clock()
done = False
while not done:

    # Handle user-input
    for event in pygame.event.get():
        if ( event.type == pygame.QUIT ):
            done = True
        elif ( event.type == pygame.USEREVENT ):
            # Timer expired, play the sound
            channel2.play( horn_sound )

    # Movement keys
    #keys = pygame.key.get_pressed()
    #if ( keys[pygame.K_UP] ):
    #    print("up")

    # Update the window, but not more than 60fps
    window.fill( DARK_BLUE )
    pygame.display.flip()

    # Clamp FPS
    clock.tick_busy_loop(60)

pygame.quit()
...