2014-07-27 3 views
0

이것은 StackOverflow에 대한 나의 첫 번째 질문입니다. 여기는 다음과 같습니다 :파이 게임으로 시간 기반 오디오를 어떻게 수행합니까?

편집 : 입력 오류를 수정하고 코드를 수정하기 만하면됩니다. 코드에 다양한 변경 사항을 추가 한 후에도 문제는 여전히 동일하게 유지됩니다. 또한 pygame.mixer.music.fadeout()은 내가 찾고있는 것이 아닙니다. 이 코드는 게임 볼륨을 50 % 줄이거 나 말하거나, 게임을 일시 중지하거나, 토크 장면에 입장하고자 할 때도 사용됩니다.

파이 게임 (Pygame)과 함께, 나는 얼마의 시간이 경과했는지에 따라 음악 볼륨 조작을 시도하고있다. 나는 이미 괜찮은 코드를 만들었지 만 직관적으로 생각한 방법을 수행하지는 않습니다. 또한 필자는 PySDL2에서 추출한 구성 요소 기반 EBS 시스템을 사용하고 있음을 알아야합니다. 코드의

import pygame 
from pygame.locals import * 

# Setup import paths for module. 
pkg_dir = os.path.split(os.path.abspath(__file__))[0] 
parent_dir, pkg_name = os.path.split(pkg_dir) 
sys.path.insert(0, parent_dir) 
sys.path.insert(0, os.path.join(parent_dir, "Game")) 

import Game 
from Porting.sdl2.ext import ebs 

pygame.display.quit() 
print("Counting down...") 
for n in range(5): 
    print(str(n + 1)) 
    pygame.time.delay(1000) 
appworld = ebs.World() 
audio_system = Game.audio.AudioSystem(44100, -16, 2, 4096) 
appworld.add_system(audio_system) 
test1 = Game.sprites.AudioSprite(appworld) 
test2 = Game.sprites.AudioSprite(appworld) 
test1.audio = Game.audio.Audio(database["BGMusic0"], True) 
test2.audio = Game.audio.Audio(database["BGMusic1"], True) 
game_clock = pygame.time.Clock() 
volume_change_clock = pygame.time.Clock() 
loop = True 
time_passed = 0 
while loop: 
    game_clock.tick(60) 
    appworld.process() 
    time_passed += volume_change_clock.tick(60) 
    if time_passed > (10 * 1000): 
     print(time_passed) 
     if not audio_system.music_volume_changed: 
      audio_system.set_music_volume(0, True) 

내 다음 블록 :이 코드의 내 최초의 블록이 https://bitbucket.org/marcusva/py-sdl2/src/02a4bc4f79d9440fe98e372e0ffaadacaefaa5c6/sdl2/ext/ebs.py?at=default

입니다 : 여기에 EBS 모듈에 대한 링크입니다

import pygame 
from Porting.sdl2.ext import ebs 
class AudioSystem(ebs.System): 
    def __init__(self, frequency, bit_size, channels, buffer): 
     super(AudioSystem, self).__init__() 
     self.componenttypes = Audio, 
     pygame.mixer.init(frequency, bit_size, channels, buffer) 
     pygame.mixer.set_num_channels(200) 
     self.frequency = frequency 
     self.bit_size = bit_size 
     self.channels = channels 
     self.buffer = buffer 
     self.music_volume_change_clock = None 
     self.music_volume_changed = False 
     self.music_volume_current = 0 
     self.music_volume_new = 0 
     self.music_fade = False 
     self.music_change_speed = 0 
     self.time_passed_total = 0 
     self.time_passed_remainder = 0 

    def process(self, world, componentsets): 
     for audio in componentsets: 
      if audio.is_music: 
       music = pygame.mixer.music 
       if not pygame.mixer.music.get_busy(): 
        music.load(audio.file) 
        music.play() 
       if self.music_volume_changed: 
        self.music_volume_current = music.get_volume() * 100 
        if self.music_volume_current != self.music_volume_new and self.music_fade: 
         time_passed = self.music_volume_change_clock.tick(60) 
         self.time_passed_total += time_passed 
         self.time_passed_total += self.time_passed_remainder 
         self.time_passed_remainder = 0 
         if self.time_passed_total > self.music_change_speed: 
          self.time_passed_remainder = self.time_passed_total % self.music_change_speed 
          volume_change_amount = int(self.time_passed_total/self.music_change_speed) 
          self.time_passed_total = 0 
          if self.music_volume_current > self.music_volume_new: 
           self.music_volume_current -= volume_change_amount 
           music.set_volume(self.music_volume_current/100) 
          elif self.music_current_volume < self.music_volume_new: 
           self.music_volume_current += volume_change_amount 
           music.set_volume(self.music_volume_current/100) 
        elif self.music_volume_current != self.music_volume_new: 
         music.set_volume(self.music_volume_current/100) 
        else: 
         self.music_volume_changed = False 
         self.music_fade = False 
      else: 
       if not audio.channel: 
        audio.channel = pygame.mixer.find_channel() 
        audio.channel.play() 

    def set_music_volume(self, percent, fade = False, change_speed = 50): 
     self.music_volume_changed = True 
     self.music_volume_new = percent 
     self.music_fade = fade 
     self.music_change_speed = change_speed 
     self.music_volume_change_clock = pygame.time.Clock() 

class Audio(object): 
    def __init__(self, file, is_music = False): 
     self.is_music = is_music 
     if self.is_music: 
      self.file = file 
     else: 
      self.channel = None 
      self.file = pygame.mixer.Sound(file) 

내 테스트 보여 주었다 그 매개 변수를 조작 내 Game.audio 모듈의 Clock.tick()은 다양한 방법으로 오디오 재생 속도가 100에서 0으로 떨어지는 데 영향을줍니다. 공백으로두면 거의 즉시 멈 춥니 다. 60 초에, 그것은 약 2 초 만에 0으로 떨어진다. 그것은 나에게 당황하게한다. 30 초, 1 초. 5시에는 볼륨이 0에 도달하지 않는 것처럼 느리게 떨어집니다. 오디오 볼륨 조작을 게임의 프레임 속도와 완전히 다르게하고 싶지만, 어떻게하면 그렇게 할 수 있을지 확신 할 수 없습니다. 가능한 경우 스레딩 및 다중 처리를 피하고 싶습니다.

미리 감사드립니다. :)

답변

0

Clock.tick()의 ​​매개 변수는 루프가 초당 실행되는 횟수를 제한하기 위해 SDL 절전 함수를 호출하는 데 사용됩니다.

Clock.tick (5)으로 호출하면 초당 5 개의 루프로 제한됩니다.

동일한 코드에서 두 클럭을 사용하지 않았습니다. 특히 여러 개의 틱 (모두 개별적으로 슬립 시간을 계산 함)을 사용했습니다. 그 대신 틱의 반환 값 (마지막 호출 이후의 시간)을 사용하여 전체 응용 프로그램의 시간을 추적하십시오.

예 :

timer = 0 
    Do things 
    timer += main_clock.tick(FPS)