首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言遊戲同時播放背景音樂與音效:多執行緒方案

     編輯:程式設計綜合問答

問題

PlaySound() 同步播放,第二個呼叫會打斷第一個;Sleep() 會阻塞主迴圈,無法實現背景音樂循環 + 即時音效並行。

解決方案:建立獨立音頻執行緒

#include <windows.h>
#include <mmsystem.h>
#pragma comment(lib, "winmm.lib")

DWORD WINAPI BgmThread(LPVOID lpParam) {
    while (*(BOOL*)lpParam) {  // 全域旗標控制循環
        PlaySound(TEXT("bgm.wav"), NULL, SND_FILENAME | SND_ASYNC);
        Sleep(120000);  // 背景音樂長度(ms),或用 SND_LOOP 旗標
    }
    return 0;
}

void PlayEffect(const char* file) {
    // 非阻塞播放音效
    PlaySound(file, NULL, SND_FILENAME | SND_ASYNC | SND_NODEFAULT);
}

int main() {
    BOOL bgmRunning = TRUE;
    HANDLE hThread = CreateThread(NULL, 0, BgmThread, &bgmRunning, 0, NULL);

    // 遊戲主迴圈
    while (gameRunning) {
        // ...
        if (hitEnemy) PlayEffect("hit.wav");
        // ...
    }

    bgmRunning = FALSE;
    WaitForSingleObject(hThread, INFINITE);
    CloseHandle(hThread);
    return 0;
}

關鍵點

  • SND_ASYNC:非同步播放,立即返回不阻塞。
  • SND_LOOP:配合 SND_ASYNC 可循環播放,無需手動 Sleep 計時。
  • 背景音樂放入專用執行緒,主執行緒專注遊戲邏輯與音效觸發。
  • 若音效重疊需求高,可建立簡單音效隊列+混音執行緒,或改用 DirectSound/XAudio2/OpenAL 等專業音頻庫。

進階建議

遊戲開發建議直接接入成熟音頻引擎(FMOD、Wwise、OpenAL Soft),支援多聲道混音、3D 定位、流式播放,避免造輪子。

多執行緒 + SND_ASYNC 是最輕量的 Win32 API 解法,足夠應付簡單 2D 遊戲。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved