Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Статьи / DirectMusic. Урок 2.

DirectMusic. Урок 2.

Автор: Visor


В предыдущем уроке мы рассмотрели метод проигрывания файлов, которые поддерживает DX Music, создавать на его основе сегменты для проигрывания и, собственно говоря, воспроизводить их. Для людей освоивших предыдущий урок не составит особого труда разобраться с этим уроком, тема которого: 3D буфер и его использование.

Для создание данного эффекта мы воспользуемся предыдущим уроком. Подготовка и инициализация происходит по уже накатанной схеме. Плавно доходим до момента загрузки сегмента:

g_pSegment->Download( g_pPerformance );

Чтобы лучше воспринимать эффект 3D, продлим удовольствие - поставим повтор сегмента:

    // задаем повтор сегмента в бесконечность
    g_pSegment->SetRepeats( DMUS_SEG_REPEAT_INFINITE );

Теперь переходим непосредственно к созданию:

    // создаем 3D AudioPath с буфером 3D.
    // Потом мы сможем играть все сегменты в данном буфере и вручную 
    // контролировать 3D параметры.								
    IDirectMusicAudioPath8* p3DAudioPath = NULL;

    g_pPerformance->CreateStandardAudioPath( DMUS_APATH_DYNAMIC_3D, 
                                             64, TRUE, &p3DAudioPath );

    // Проигрываем сегмент через 3D AudioPath
    // по default - центр
    g_pPerformance->PlaySegmentEx( g_pSegment, NULL, NULL, 0, 
                                   0, NULL, NULL, p3DAudioPath );
       // ставим MessageBox, пока он "висит" - слышим звук
    MessageBox( NULL, "Музыка по центру " \
    "Нажмите OK для переключения "налево"", "DirectMusic Tutorial", MB_OK );

    // А теперь собственно получаем IDirectSound3DBuffer8 из 3D AudioPath
    IDirectSound3DBuffer8* pDSB = NULL;
    p3DAudioPath->GetObjectInPath( DMUS_PCHANNEL_ALL, DMUS_PATH_BUFFER, 0, 
                                 GUID_NULL, 0, IID_IDirectSound3DBuffer, 
                                 (LPVOID*) &pDSB );

    // Устанавливаем позицию звука немного левее
    pDSB->SetPosition( -0.1f, 0.0f, 0.0f, DS3D_IMMEDIATE );

    // Слушаем, что получилось
    MessageBox( NULL, "Музыка должна быть слева" \
                "Нажмите OK для переключения "вправо"", "DirectMusic Tutorial", MB_OK );

    // Устанавливаем позицию звука немного правее
    pDSB->SetPosition( 0.1f, 0.0f, 0.0f, DS3D_IMMEDIATE );


    // Слушаем результат
    MessageBox( NULL, "Музыка должна быть справа " \
                "Нажмите OK для выхода", "DirectMusic Tutorial", MB_OK );

    // останавливаем музыку
    g_pPerformance->Stop( NULL, NULL, 0, 0 );

    // очищаем все используемые интерфейсы
    pDSB->Release();
    p3DAudioPath->Release();
    g_pLoader->Release(); 
    g_pSegment->Release();

    // закрываем DirectMusic после освобождения буферов DirectSound
    g_pPerformance->CloseDown();
    g_pPerformance->Release();
    
    // уничтожаем объект COM
    CoUninitialize();

Вот собственно и все, что было описано по данной теме в DX SDK. Естественно - это очень мало, чтобы можно было говорить о чем-то серьезном. К тому же данный пример рассчитан только на систему из 2-х колонок. Люди, имеющие более солидную аудиосистему, могут позволить себе немного больше. Чтобы погонять звук через все существующие колонки достаточно лишь правильно скорректировать вызываемый метод IDirectSound3DBuffer8::SetPosition(). В данном примере мы использовали только Х составляющую. Система координат звука следующая: "монитор" - относительный "центр вселенной" звука [0,0,0]. Тогда левая колонка [-x,0,0], правая колонка [+x,0,0]. Чтобы лучше это дело воспринять достаточно лишь взглянуть на соответствующую функию:

HRESULT SetPosition(
  D3DVALUE x, 
  D3DVALUE y, 
  D3DVALUE z, 
  DWORD dwApply 
);

Переменные x,y,z - данные типа float, которые позиционируют звук в пространстве.

dwApply - данная переменная может иметь только 2 значения:

DS3D_DEFERRED - значение 3D буфера не активизируется, пока приложение не вызовет метод IDirectSound3DListener8::CommitDeferredSettings().

DS3D_IMMEDIATE - активизация 3D немедленно, т.е. перерасчет 3D координат для буферов идет сразу.

P.S. Конечно, можно использовать 3D звук и на двух колонках, или даже наушниках. Тогда смещение координат относительно "центра вселенной" по осям Y/Z, будет выглядеть (точнее звучать), как просто удаление точки-источника звука.

10 июня 2003

2001—2018 © GameDev.ru — Разработка игр