让音频恢复'停止后?

时间:2017-07-07 00:48:50

标签: c++ playsound

我正在构建一个基于文本的RPG,我已经设法将一些.wav文件添加到我的程序中,没有任何问题,我也能够正确地播放它们没问题。

目前发生了什么?

我有2个.wav个文件,1个用于一般背景音乐(newbieMelody.wav),另一个用于升级时(levelUp.wav)。所以首先,当我运行游戏时,我们从newbieMelody.wav文件开始在后台播放,如下所示:

#pragma comment(lib, "winmm.lib")

#include "Quiz.h"
#include <iostream>
#include <windows.h>
#include <mmsystem.h>

int main() {

    PlaySound(TEXT("C:\\Users\\User\\Documents\\GIT\\TextBased\\QuizApplication\\playSound\\newbieMelody.wav"),
                    NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);     // we play the sound here

    // create a game
    Game *game = new Game();    
    game->readAreaFromFile();   // calls a file for area location
    game->run();                // loads the game UI

    //destroy gameWorld
    delete game;

    system("PAUSE");
}

然后,每当我们在我的void Game :: run()函数中升级(在另一个cpp文件中)时,我会做一些增量,重置xpCount,并播放levelUp.wav

if (xpCount >= xpPeak) { // if current exp is larger or = to xp cap 

            combatLevel += 1;   // current combat lvl
            xpCount = 0;    // records total exp
            xpPeak += 4;    // takes longer to level up each level

            setcolor(yellow, black);    // sets location green
            cout << "Congratulations, you just advanced your Combat level!" << endl;
            cout << "Your Combat level is now " << combatLevel << "." << '\n' << endl;

            PlaySound(TEXT("C:\\Users\\User\\Documents\\GIT\\TextBased\\QuizApplication\\playSound\\levelUp.wav"),
                NULL, SND_FILENAME | SND_ASYNC);  // play level up sound

            this_thread::sleep_for(chrono::seconds(5)); // sleeps output to allow level up song to finish

            levelUpDone = true; // leveled up
        }

一旦完成播放,我们将恢复&#34;播放newbieMelody.wav文件:

if (levelUpDone == true) {  // access since player leveled up

            PlaySound(TEXT("C:\\Users\\User\\Documents\\GIT\\TextBased\\QuizApplication\\playSound\\newbieMelody.wav"),
                NULL, SND_FILENAME | SND_ASYNC | SND_LOOP); // resume newbie melody???

            levelUpDone = false;    // back to false to avoid errors
        }

问题是什么?

这通常适用于我喜欢的方式,但是当我的newbieMelody.wav文件在levelUp.wav文件后再次播放时,从头开始重新而不是从上次播放的地方恢复

我的问题是,我是如何改变我的代码所以背景音乐从上次播放的地方恢复,而不是重新开始?有没有什么方法可以在levelUp.wav文件播放时暂停背景歌曲,然后在完成后恢复?

1 个答案:

答案 0 :(得分:2)

PlaySound从未打算用于此类场景。如您所见,不支持进度通知,暂停/恢复或音量。它真的只适用于短通知声音。

游戏声音的替代品包括XAudio2DirectSound。还有一些开源声音API也适用于你。

在更高级别,您可以使用旧版Windows Media Player API,DirectShow或Media Foundation。