⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 3dlistener.cpp

📁 是《3D游戏编程》的代码 买了这本书
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//-----------------------------------------------------------------------------
// 名称: RenderSene.cpp
// 
// 功能: 进行3D场景的渲染——使用显示内存的顶点缓冲区。
//       
//-----------------------------------------------------------------------------

// 包含Direct3D头文件
#include <d3d8.h>
#include <d3dx8.h>
#include <dmusicc.h>
#include <dmusici.h>

// Windows类的名称宏定义
#define  MY_WINCLASS_NAME      "Direct3D"

#define KEYDOWN(vk_code)  ((GetAsyncKeyState(vk_code) & 0x8000)? 1 : 0)
#define KEYUP(vk_code)    ((GetAsyncKeyState(vk_code) & 0x8000)? 0 : 1)

struct PLAYER
{
    D3DXVECTOR3    LookAt[3];
};

// 定义个表示顶点的结构
struct CUSTOMVERTEX
{
    FLOAT x, y, z; // x,y,z表示点的三维坐标值,
    DWORD color;        // 顶点颜色
};

struct RECOBJECT
{
    FLOAT x, y, z; // x,y,z表示点的三维坐标值,
};

// 自定义的顶点格式
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)

// 定义发出声音物体的移动速率
#define MY_3D_VELOCITY    (0.01f)

// 定义全局变量
LPDIRECT3D8             g_pMyD3D          = NULL; // 定义Direct3D对象的指针
LPDIRECT3DDEVICE8       g_pMyd3dDevice    = NULL; // 定义Direct3D设备指针
LPDIRECT3DVERTEXBUFFER8 g_pMyVxBufferRec     = NULL; // 定义顶点缓冲区对象指针
LPDIRECT3DVERTEXBUFFER8 g_pMyVxBufferLine     = NULL;

PLAYER  g_Player;
float   g_Angle = 0;

#define LINE_VECTOR_NUM 20

// 定义包含4个顶点的顶点数组
CUSTOMVERTEX g_Vertices[] =
{
        { -10.5f, 0.0f, 0.0f, 0xffff0000, },  
        { -10.5f, 20.0f, 0.0f, 0xffff0000, },
		{  10.5f, 0.0f, 0.0f, 0xffff0000, },
		{  10.5f, 20.0f, 0.0f, 0xffff0000, },  

};
#define GRID_WIDTH       20.0f
#define NUM_GRID         20


int       g_Time;

// 定义全局声音变量
IDirectMusicLoader8*      g_pLoader         = NULL;
IDirectMusicPerformance8* g_pPerformance    = NULL;
IDirectMusicSegment8*     g_pSegment        = NULL;
IDirectMusicAudioPath8*   g_p3DAudioPath    = NULL;
IDirectSound3DBuffer*     g_pSound3DBuffer  = NULL;
IDirectSound3DListener8*  g_pSoundListener  = NULL;
DS3DBUFFER                g_dsBufferParams;               
DS3DLISTENER              g_dsListenerParams;                
//-----------------------------------------------------------------------------
// 名称: SoundInit()
// 功能: 初始化声音播放环境的函数,函数中创建了DirectMusic的载入器对象和
//       DirectMusic的演奏对象
//       函数返回E_FAIL表示失败,返回E_OK表示成功。
//-----------------------------------------------------------------------------
HRESULT SoundInit()
{
	HRESULT   hr;

    // 初始化COM
    CoInitialize(NULL);
    
    // 创建一个载入器对象
    CoCreateInstance( CLSID_DirectMusicLoader, NULL, CLSCTX_INPROC, 
                      IID_IDirectMusicLoader8, (void**)&g_pLoader );

    // 创建一个演奏对象
    CoCreateInstance( CLSID_DirectMusicPerformance, NULL, CLSCTX_INPROC, 
                      IID_IDirectMusicPerformance8, (void**)&g_pPerformance );

    // 初始化演奏对象
    g_pPerformance->InitAudio( NULL, NULL, NULL, 
                               1, 0,
                               DMUS_AUDIOF_ALL, NULL );

	
	g_pPerformance->CreateStandardAudioPath( DMUS_APATH_DYNAMIC_3D, 
                                             64, TRUE, &g_p3DAudioPath );
    // 得到 IDirectSound3DBuffer8 接口
    hr = g_p3DAudioPath->GetObjectInPath( DMUS_PCHANNEL_ALL, DMUS_PATH_BUFFER, 0, 
                                 GUID_NULL, 0, IID_IDirectSound3DBuffer, 
                                 (LPVOID*) &g_pSound3DBuffer );

    g_dsBufferParams.dwSize = sizeof(DS3DBUFFER);
    g_pSound3DBuffer->GetAllParameters( &g_dsBufferParams );

	// 设置声音源的模式为DS3DMODE_NORMAL,在这种模式下
    // 声音源位置,速度和方向设置不会收声音接收者设置的影响。
	g_dsBufferParams.dwMode = DS3DMODE_NORMAL  ;
    
	// 设置声音源的位置 
	g_dsBufferParams.vPosition.x = 0.0f;
    g_dsBufferParams.vPosition.y = 20.0f;
	g_dsBufferParams.vPosition.z = 0.0f;

	if( g_pSound3DBuffer )
        hr = g_pSound3DBuffer->SetAllParameters( &g_dsBufferParams, DS3D_IMMEDIATE );


	// 得到 IID_IDirectSound3DListener8 接口
	hr = g_p3DAudioPath->GetObjectInPath( 0, DMUS_PATH_PRIMARY_BUFFER, 0,
    							 GUID_NULL, 0, IID_IDirectSound3DListener8, 
    							 (LPVOID*) &g_pSoundListener);

    g_dsListenerParams.dwSize = sizeof(DS3DLISTENER);
    g_pSoundListener->GetAllParameters( &g_dsListenerParams );

    g_dsListenerParams.flDopplerFactor = 1.0f;
    g_dsListenerParams.flRolloffFactor = 0.2f;

	// 设置声音接收者的初始位置 
	g_dsListenerParams.vPosition.x = g_Player.LookAt[0].x;
    g_dsListenerParams.vPosition.y = g_Player.LookAt[0].y;
	g_dsListenerParams.vPosition.z = g_Player.LookAt[0].z;

    if( g_pSoundListener )
        if( FAILED(hr = g_pSoundListener->SetAllParameters( &g_dsListenerParams, DS3D_IMMEDIATE )))
		{
			MessageBox( NULL, "g_pSoundListener->SetAllParameters failed",
						 "3DListener", MB_OK );
			return hr;
		}


    return S_OK;
}


//-----------------------------------------------------------------------------
// 名称: SoundLoad()
// 功能: 载入一个声音文件。文件为:
//                \Windows安装目录\media\The Microsoft Sound.wav
//-----------------------------------------------------------------------------
VOID SoundLoad()
{
	TCHAR strPath[MAX_PATH];
    GetCurrentDirectory( MAX_PATH, strPath );

    // 下面的代码设置查找目录
	WCHAR wstrSearchPath[MAX_PATH];
    MultiByteToWideChar( CP_ACP, 0, strPath, -1, 
                         wstrSearchPath, MAX_PATH );

    g_pLoader->SetSearchDirectory( GUID_DirectMusicAllTypes,
		                           wstrSearchPath,
								   FALSE);
    
    // 从文件载入声音到一个声音段对象中
	
    WCHAR wstrFileName[MAX_PATH] = L"do.wav";   

    if( FAILED( g_pLoader->LoadObjectFromFile( CLSID_DirectMusicSegment,
                                               IID_IDirectMusicSegment8,
                                               wstrFileName,
                                               (LPVOID*) &g_pSegment ) ) )
    {
        MessageBox( NULL, "Media not found, sample will now quit", 
                          "3DListener", MB_OK );
        return;
    }
}


//-----------------------------------------------------------------------------
// 名称: SoundMove()
// 功能: 移动声音源
//-----------------------------------------------------------------------------
VOID SoundMove(float x, float y, float z)
{

    // 设置声音缓冲的位置和速度
    if( g_pSound3DBuffer )
    {
        g_pSound3DBuffer->SetPosition( x,
                                       y,
                                       z, 
									   DS3D_IMMEDIATE );
    }

}

//-----------------------------------------------------------------------------
// 名称: ListenerUpdate()
// 功能: 移动声音声音接收者的位置
//-----------------------------------------------------------------------------
void ListenerUpdate(struct PLAYER *player)
{
	D3DXVECTOR3 vector;
	HRESULT   hr;

	// 首先取得游戏主角在三维世界中的位置
	vector.x = player->LookAt[0].x;
	vector.y = player->LookAt[0].y;
	vector.z = player->LookAt[0].z;

	// 设置声音接收者的位置为游戏主角的位置
	g_dsListenerParams.vPosition.x = vector.x;
	g_dsListenerParams.vPosition.y = vector.y;
	g_dsListenerParams.vPosition.z = vector.z;

    g_dsListenerParams.vOrientFront.x = sinf(g_Angle);
    g_dsListenerParams.vOrientFront.y = 0.0f; 
    g_dsListenerParams.vOrientFront.z = cosf(g_Angle); 


    if( g_pSoundListener )
	{
        if(FAILED(hr = g_pSoundListener->SetAllParameters( &g_dsListenerParams,
			                                      DS3D_IMMEDIATE )))
		{
			MessageBox( NULL, "g_pSoundListener->SetAllParameters failed", 
					 "3DListener", MB_OK );
		}

	}

    return;

}

//-----------------------------------------------------------------------------
// 名称: SoundPlay()
// 功能: 播放声音文件
//-----------------------------------------------------------------------------
VOID SoundPlay()
{
    // 载入声音段到演奏中
    g_pSegment->Download( g_pPerformance );

	// 设置这个声音段为循环播放
	g_pSegment->SetRepeats(DMUS_SEG_REPEAT_INFINITE);
 
    // 播放声音段
    g_pPerformance->PlaySegmentEx( g_pSegment, NULL, NULL, 0, 
                                   0, NULL, NULL, g_p3DAudioPath );

}


//-----------------------------------------------------------------------------
// 名称: SoundClean()
// 功能: 释放所有的DirectMusic资源
//-----------------------------------------------------------------------------
VOID SoundClean()
{
    // 清除audiopath 和 声音缓冲区
    g_pSound3DBuffer->Release();
	g_pSoundListener->Release();
    g_p3DAudioPath->Release();

    // 清除载入器、声音段对象
    g_pLoader->Release(); 
    g_pSegment->Release();

    // 停止声音播放,并关闭演奏
    g_pPerformance->Stop( NULL, NULL, 0, 0 );
    g_pPerformance->CloseDown();
    g_pPerformance->Release();

    // 关闭COM
    CoUninitialize();

	return;
}



//-----------------------------------------------------------------------------
// 名称: InitD3D()
// 功能: 初始化3D环境的函数,函数中创建了Direct3D对象和Direct3D设备。
//       函数返回E_FAIL表示失败,返回E_OK表示成功。
//-----------------------------------------------------------------------------
HRESULT InitMy3D( HWND hWnd )
{
    // 创建Direct3D对象,是使用Direct3D的第一步操作
    if( NULL == ( g_pMyD3D = Direct3DCreate8( D3D_SDK_VERSION ) ) )
        return E_FAIL;

    // 获取当前Windows桌面的显示模式,保存到定义的d3ddm结构中
    D3DDISPLAYMODE d3ddm;
    if( FAILED( g_pMyD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) )
        return E_FAIL;

	// 定义Present结构   
    D3DPRESENT_PARAMETERS d3dpp; 

    // 把结构清零,创建设备时,结构中成员值为0表示使用缺省值 
    ZeroMemory( &d3dpp, sizeof(d3dpp) );

	// 指定创建的Direct3D是支持窗口的设备
    d3dpp.Windowed = TRUE;

	// 指定交换效果为D3DSWAPEFFECT_DISCARD,即把后台表面显示到前台表面以后,
	// 原来的后台表面包含的信息自动丢失
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;

	// 后台缓冲区的的点格式与当前显示模式的点格式一致
    d3dpp.BackBufferFormat = d3ddm.Format;

	// 创建Direct3D设备:
	// 1. 使用主显卡创建设备,参数D3DADAPTER_DEFAULT
	// 2. 设备类型为硬件抽象设备,使用硬件加速功能,参数D3DDEVTYPE_HAL

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -