Я работаю над игровым проектом для школы в составе команды. Мне нужно настроить одноэлементный класс, который воспроизводит звук для игры. Мы используем QT для переносимости на мобильные устройства и, возможно, на телефоны Android. Мы решили использовать фонон для игрового звука. Я очень новичок в этом и только начал использовать QT в первый раз, а также новичок в программировании игр.
Аудиосистема должна быть в состоянии обрабатывать более одного звука одновременно. По крайней мере, он должен обрабатывать фоновую музыку и звуковые эффекты. Эффекты будут подключены через Сигналы к слотам.
Вот мой код:
/************** audiosystem.h***/
class AudioSystem : public QWidget
{
Q_OBJECT
public:
static AudioSystem *instance();
void setMusicFile(const QString &filename);
signals:
bool finishedMusic(); ///< For looping
public slots:
void playMusic(); ///< BG music triggered at Level start?
void stopMusic(); ///< Triggered by level finish
void click_sound(); ///< Menu button clicks
void step_sound(); ///< Other character sounds
void wall_sound(); ///< Hitting the wall or collision sound
void jump_sound(); ///< Jumping sound
void sound(int); ///< Level specific custom sounds
private:
// Singleton - constructors made private
AudioSystem(QWidget *parent = 0);
~AudioSystem();
AudioSystem(const AudioSystem &);
AudioSystem& operator=(const AudioSystem &);
static AudioSystem *m_Instance;
// media objects
Phonon::MediaObject *m_BgPlayer;
Phonon::MediaObject *m_EffectPlayer;
// audio sinks
Phonon::AudioOutput *m_BgAudioOutput;
Phonon::AudioOutput *m_EffectAudioOutput;
// audio paths
Phonon::Path m_BgAudioPath, m_EffAudioPath;
};
/****** audiosystem.cpp**/
AudioSystem* AudioSystem::m_Instance = 0;
AudioSystem* AudioSystem::instance()
{
if (!m_Instance)
{
m_Instance = new AudioSystem();
}
return m_Instance;
}
AudioSystem::AudioSystem(QWidget *parent) :
QWidget(parent)
{
// create new instance of player and audio sinks then connect with paths
m_BgPlayer = new Phonon::MediaObject(this);
m_EffectPlayer = new Phonon::MediaObject(this);
m_BgAudioOutput = new Phonon::AudioOutput(Phonon::MusicCategory, this);
m_EffectAudioOutput= new Phonon::AudioOutput(Phonon::MusicCategory, this);
m_BgAudioPath = Phonon::createPath(m_BgPlayer, m_BgAudioOutput);
m_EffAudioPath = Phonon::createPath(m_EffectPlayer, m_EffectAudioOutput);
}
void AudioSystem::setMusicFile(const QString &filename)
{
m_BgPlayer->setCurrentSource(QString(filename));
}
void AudioSystem::playMusic()
{
m_BgPlayer->play();
}
void AudioSystem::stopMusic()
{
m_BgPlayer->stop();
}
void AudioSystem::click_sound()
{
m_EffectPlayer->setCurrentSource(QString(":/button.wav"));
m_EffectPlayer->play();
}
........................... и т.д
typical implementation:
AudioSystem::instance()->playMusic
AudioSystem::instance(), SLOT(click_sound())
Код, который я настроил, кажется, работает нормально в простой ситуации с простым главным окном, но когда я помещаю любое место в наш код, он ничего не делает. Есть что-то, что мне не хватает?
полный проект: git://gitorious.org/gamecs340project/gamecs340project.git