Таким образом, похоже, что вы хотите сделать в pygame два объекта «Звук» и создать линейную интерполяцию громкости между ними двумя.
Я бы создал два вектора, каждый из [0,100], и связал бы их обратно с некоторой константой. Таким образом, когда звук A равен 100, звук b равен 0. Затем, когда происходит действие, вы изменяете константу.
t=0
А: [0 ... 100]
Б: [0 ... 100]
t=1
ДЕЙСТВИЕ
t=1.1
A:[0 .. 50 .. 100]
B: [0 .. 50 .. 100]
t=2
A:[0 ... 100]
B: [0 ... 100]
Теперь немного кода. Я не знаком с pygame, но это должно поставить вас на правильный путь.
class Song(object):
def __init__(self, songfilename):
self.song = pygame.mixer.Sound(songfilename)
def setVolume(self, somenumber):
#number validation
#possibly do some volume curve here if you wanted
self.song.set_volume(somenumber)
class SongFader(object):
def __init__(self, song1, song2):
self.song1 = song1
self.song2 = song2
self.__xAxisMax = 100
self.__xAxisMin = 0
def fade(self, xaxis):
assert(self.__xAxisMin <= xaxis <= self.__xAxisMax)
#could be any numbers you want.
#i chose 0-100 for convenience
self.song1.setVolume(xaxis)
self.song2.setVolume(self.__xAxisMax-xaxis)
song1 = Song('Song1.wav')
song2 = Song('Song2.wav')
fader = SongFader(song1, song2)
#Inside some event loop when you action is triggered
fader.fade(100) #Only song2 is playing
fader.fade(50) #Songs are evenly split
fader.fade(0) #Only left song is playing
редактировать
Линейная интерполяция, вероятно, является более важной концепцией здесь, поэтому я изменил класс фейдера, вдохновленный идеей резьбы Эрика.
class SongFader(object):
def __init__(self, song1, song2):
self.song1 = song1
self.song2 = song2
self.lefttoright = False
self.starttime = 0
self.endtime = 0
def fade(self, starttime, fadeleft):
self.lefttoright = fadeleft == True #Being verbose here
self.starttime = starttime #assuming time is in millis
self.endtime = starttime + 1000
Thread(target = self.fadeHelper).start()
#this is where you define how the two songs are faded
def fadeHelper(self):
#if using thread, make sure you mutex the 'self.' variables
starttime = self.starttime
endtime = self.endtime
lefttoright = self.lefttoright
while starttime < endtime:
fadevalue = (starttime - endtime) / 1000 #a val between [0,1]
if lefttoright:
self.song1.setVolume(fadevalue)
self.song2.setVolume(1-fadevalue)
else:
self.song1.setVolume(1-fadevalue)
self.song2.setVolume(fadefalue)
starttime = getGameTimeFromSomewhere()
person
gregb212
schedule
16.09.2013