이것은 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에 도달하지 않는 것처럼 느리게 떨어집니다. 오디오 볼륨 조작을 게임의 프레임 속도와 완전히 다르게하고 싶지만, 어떻게하면 그렇게 할 수 있을지 확신 할 수 없습니다. 가능한 경우 스레딩 및 다중 처리를 피하고 싶습니다.
미리 감사드립니다. :)