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 計時。遊戲開發建議直接接入成熟音頻引擎(FMOD、Wwise、OpenAL Soft),支援多聲道混音、3D 定位、流式播放,避免造輪子。
多執行緒 + SND_ASYNC 是最輕量的 Win32 API 解法,足夠應付簡單 2D 遊戲。