3

私はチームの一員として学校向けのゲーム プロジェクトに取り組んでいます。ゲームのオーディオを行うシングルトン クラスをセットアップする必要があります。モバイルへの移植性と、場合によっては Android フォンへの移植性のために、QT を使用しています。ゲームのオーディオにはフォノンを使用することにしました。私はこれに非常に慣れておらず、QTを初めて使用し始めたばかりで、ゲームプログラミングも初めてです。

オーディオ システムは、一度に複数のサウンドを処理できる必要があります。少なくとも、BGM と効果音を処理する必要があります。エフェクトはシグナルを介してスロットに接続されます。

これが私のコードです:

/ * ** * ** * ** * **** 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

4

1 に答える 1

0

フォノンはこれを行うことができません。少なくとも正気ではありません。複数のサウンドを再生しようとすると、システムのオーディオ デバイスを複数回開こうとします。これは、すべての場所で機能することを保証するものではありません。

ゲームの場合、通常、独自のオーディオ ミキシングが必要です。これを行う最も簡単な方法の 1 つは、SDLSDL_mixerを使用することです。SDL_mixer は複数のオーディオ サンプルを同時に再生できますが、複数の音楽ストリームを再生することはできません。それが必要な場合は、私の変更したバージョンのSDL_mixerを使用できます。

もちろん、これには他にも多くのライブラリがあります。しかし、おそらく SDL_mixer が最も使いやすいでしょう。

于 2012-11-17T01:39:38.763 に答える