Изменить BGM с помощью PlaySound () в C ++ - PullRequest
0 голосов
/ 19 декабря 2018

Поскольку я впервые использую эту функцию (я очень ранний новичок, начал программировать на c ++ три месяца назад), я хотел попробовать ее с разной степенью успеха: в основном, моя проблемав том, что через мою программу я начинаю с использования функции PlaySound (), например: PlaySound(MAKEINTRESOURCE(IDR_WAVE1), NULL, SND_RESOURCE | SND_LOOP | SND_ASYNC);

Как видите, файл - это ресурс, который я непосредственно включил в свой проект с VS2017.Но проблема не в этом, так как звук сам по себе играет нормально.
Проблема возникает, когда я пытаюсь остановить этот звук и воспроизвести другую песню (также в ресурсах моего проекта).Вот как я это сделал:
PlaySound(MAKEINTRESOURCE(IDR_WAVE1), NULL, SND_RESOURCE | SND_LOOP | SND_ASYNC); Sleep(2000); PlaySound(MAKEINTRESOURCE(IDR_WAVE2), NULL, SND_RESOURCE | SND_LOOP | SND_ASYNC);
Вот как я тестировал то, что работает PlaySound, но это принципиально, как в моей программе многократно вызывается функция PlaySound.Проблема в том, что когда я запускаю это, он компилируется, но выдает ошибка нарушения доступа к памяти (по-французски, извините).
Итак, я попытался сначала остановить первый воспроизводимый звук, а затем воспроизвести второй, например:
PlaySound(MAKEINTRESOURCE(IDR_WAVE1), NULL, SND_RESOURCE | SND_LOOP | SND_ASYNC); Sleep(2000); PlaySound(NULL, NULL, SND_ASYNC); PlaySound(MAKEINTRESOURCE(IDR_WAVE2), NULL, SND_RESOURCE | SND_LOOP | SND_ASYNC);
, но я все еще получил ту же ошибку.Наконец, я бездельничал и обнаружил, что добавление флага SND_NOSTOP, например, так:
PlaySound(MAKEINTRESOURCE(IDR_WAVE1), NULL, SND_RESOURCE | SND_LOOP | SND_ASYNC); Sleep(2000); PlaySound(NULL, NULL, SND_ASYNC); PlaySound(MAKEINTRESOURCE(IDR_WAVE2), NULL, SND_RESOURCE | SND_LOOP | SND_ASYNC | SND_NOSTOP); не вызывает ошибку и работает нормально, но вторая песня никогда не воспроизводится, и звука просто нет.

В последней заметке я хотел бы добавить, что я попытался поменять местами IDR_WAVE1 и IDR_WAVE2, и это работает просто с взаимозаменяемыми песнями, так что это (вероятно?) Здесь не является причиной.
Спасибо за чтение!



Благодаря @TedLyngmo я прочитал руководство и использовал предоставленные примеры для рабочего кода:
PlaySound(MAKEINTRESOURCE(IDR_WAVE1), GetModuleHandle(NULL), SND_RESOURCE | SND_LOOP | SND_ASYNC); PlaySound(NULL, 0, 0); PlaySound(MAKEINTRESOURCE(IDR_WAVE2), GetModuleHandle(NULL), SND_RESOURCE | SND_LOOP | SND_ASYNC | SND_NOSTOP);

...