QT фонон игровой звук

Я работаю над игровым проектом для школы как часть команды. Мне нужно настроить одноэлементный класс, который делает аудио для игры. Мы используем QT для переносимости на мобильный телефон и, возможно, на телефон. Мы решили использовать фонон для аудио игры. Я очень новичок в этом и только начал использовать 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())

Код, который я настроил, кажется, работает нормально в простой ситуации с простым главным окном, но когда я помещаю любое место в нашем коде, это ничего не делает. Это то, чего мне не хватает?

полный проект:
мерзавец: //gitorious.org/gamecs340project/gamecs340project.git

3

Решение

Фонон не может этого сделать. По крайней мере, не в здравом уме; он пытается открыть аудиоустройство системы несколько раз, если вы пытаетесь воспроизвести несколько звуков. Это не гарантировано, чтобы работать везде.

Для игр вы обычно хотите свой собственный аудио микширование. Один из самых простых способов сделать это — использовать SDL а также SDL_mixer. SDL_mixer может воспроизводить несколько аудиосэмплов одновременно, но не несколько музыкальных потоков. Если вы хотите, вы можете использовать мою модифицированную версию SDL_mixer.

Конечно, для этого есть много других библиотек. Но SDL_mixer, вероятно, самый простой в использовании.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector