QT声子游戏音频



作为团队的一员,我正在为学校做一个游戏项目。我需要设置一个为游戏做音频的singleton类。我们正在使用QT来实现移动设备的便携性,可能还可以用于Android手机。我们决定用声子制作游戏音频。我对这方面很陌生,刚开始第一次使用QT,也是游戏编程的新手。

音频系统应该能够一次处理多个声音。至少它必须处理背景音乐和声音效果。效果将通过信号连接到插槽。

这是我的代码:

/*************音响系统

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;
};

/*****音响系统.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();
}

etc

typical implementation:
AudioSystem::instance()->playMusic  
AudioSystem::instance(), SLOT(click_sound())

我所设置的代码在使用简单主窗口的简单情况下似乎可以正常工作,但当我在代码中放置任何位置时,它都不会起任何作用。我缺少什么吗?

完整项目:git://gitorious.org/gamecs340project/gamecs340project.git

Phonon无法做到这一点。至少不是以理智的方式;如果你尝试播放多种声音,它会尝试多次打开系统的音频设备。这并不能保证在任何地方都有效。

对于游戏,你通常想要自己的混音。最简单的方法之一是使用SDL和SDL_mixer。SDL_mixer可以同时播放多个音频样本,但不能播放多个音乐流。如果你想要,你可以使用我修改过的SDL_mixer版本。

当然,还有很多其他的图书馆也在做这件事。但是SDL_mixer可能是最容易使用的。

相关内容

  • 没有找到相关文章

最新更新