DirectX的简单使用.docx_第1页
DirectX的简单使用.docx_第2页
DirectX的简单使用.docx_第3页
DirectX的简单使用.docx_第4页
DirectX的简单使用.docx_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

MFC中DirectX的使用一、Direct3D的使用:渲染背景11、首先12、声明变量22.1点精灵方式贴入22.2绘制四边形模型,图片以纹理方式贴入3二、DircetInput的使用(俗称五部曲)61、声明变量62、函数6三、DirectSound的使用71、变量声明72、函数8一、Direct3D的使用:渲染背景1、首先头文件:#include #include 库文件:(当然最初要先把文件导入到工程中:VC2008版本从工具中选项卡选择属性找到VC+目录,然后添加包含文件和库文件;若是VC2010在类视图窗口鼠标右击工程文件选择属性找VC+目录)#pragma comment(lib, d3d9.lib) #pragma comment(lib, d3dx9.lib)2、声明变量添加图片是以纹理方式贴入,用的是点精灵贴入。(当然也可以通过构造模型载入纹理)2.1点精灵方式贴入LPDIRECT3D9 m_D3D; /d3d对象指针 LPDIRECT3DDEVICE9 m_D3DDevice;/d3d设备对象指针LPDIRECT3DTEXTURE9 g_pTex; /纹理 LPD3DXSPRITE g_pSprite; /点精灵/在mainFrame类中,初始化D3D,(因为初始化时用到窗口句柄HWND参数,这里直接使用的是MainFrame的窗口句柄m_hWnd。在CView类中用它的句柄试过,好像不行*,若直接获取MainFrame窗口句柄: /CMainFrame* frame =(CMainFrame*)AfxGetApp()-m_pMainWnd;/HWND hWnd = frame-m_hWnd;/HWND hWnd = AfxGetMainWnd()-m_hWnd;/获取主窗口句柄这样的话会显示窗口,不能实现,有待研究!)/初始化D3Dbool CMainFrame:InitializeD3D(HWND hWnd)D3DDISPLAYMODE displayMode; m_D3D = Direct3DCreate9(D3D_SDK_VERSION);/参数为版本号if(m_D3D = NULL)return false;if(FAILED(m_D3D-GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &displayMode)/默认显卡,获取显示格式存入displayMode中return false;D3DPRESENT_PARAMETERS d3dpp;ZeroMemory(&d3dpp,sizeof(d3dpp);d3dpp.Windowed = true;d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;d3dpp.BackBufferFormat = displayMode.Format;if(hWnd = NULL)reutrn false;/CString str = _T(hwnd = NULL);/AfxMessageBox(str);elseif(FAILED(m_D3D-CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &m_D3DDevice)/创建D3D设备m_D3DDevicereturn false;return true;创建完D3D和显示设备后,创建点精灵和纹理D3DXCreateSprite(m_D3DDevice, &g_pSprite )/创建点精灵FAILED(D3DXCreateTextureFromFile(m_D3DDevice,Lbackground0.bmp, &g_pTex)创建纹理 现在可以渲染屏幕了 m_D3DDevice-Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0); / Begin the scene. Start rendering. m_D3DDevice-BeginScene(); if (SUCCEEDED( g_pSprite-Begin(D3DXSPRITE_ALPHABLEND) ) ) g_pSprite-Draw(g_pTex,NULL, NULL, NULL, 0xffffffff); g_pSprite-End(); m_D3DDevice-EndScene(); / Display the scene. m_D3DDevice-Present(NULL, NULL, NULL, NULL);2.2绘制四边形模型,图片以纹理方式贴入LPDIRECT3D9 g_pD3D = NULL; /Direct3D对象 LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; /Direct3D设备对象 LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; /顶点缓冲区对象 LPDIRECT3DTEXTURE9 g_pTex = NULL; /纹理 struct CUSTOMVERTEX FLOAT x, y, z, rhw; FLOAT u, v; ; #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_TEX1) /顶点格式 /- / Desc: 初始化Direct3D /- HRESULT InitD3D( HWND hWnd ) /创建Direct3D对象, 该对象用于创建Direct3D设备对象 if( NULL = ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) return E_FAIL; /设置D3DPRESENT_PARAMETERS结构, 准备创建Direct3D设备对象 D3DPRESENT_PARAMETERS d3dpp; ZeroMemory( &d3dpp, sizeof(d3dpp) ); d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; /创建Direct3D设备对象 if( FAILED( g_pD3D-CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice ) ) ) return E_FAIL; /加载纹理 if (FAILED(D3DXCreateTextureFromFile(g_pd3dDevice, LWater lilies.jpg, &g_pTex) return E_FAIL; return S_OK; /- / Desc: 创建并填充顶点缓冲区 /- HRESULT InitVB() /顶点数据 CUSTOMVERTEX vertices = 100.0f, 100.0f, 0.5f, 1.0f, 0.f, 0.f , 400.0f, 100.0f, 0.5f, 1.0f, 1.f, 0.f, 400.0f, 400.0f, 0.5f, 1.0f, 1.f, 1.f, 100.0f, 100.0f, 0.5f, 1.0f, 0.f, 0.f , 400.0f, 400.0f, 0.5f, 1.0f, 1.f, 1.f, 100.0f, 400.0f, 0.5f, 1.0f, 0.f, 1.f, ; /创建顶点缓冲区 if( FAILED( g_pd3dDevice-CreateVertexBuffer( 6*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL ) ) ) return E_FAIL; /填充顶点缓冲区 VOID* pVertices; if( FAILED( g_pVB-Lock( 0, sizeof(vertices), (void*)&pVertices, 0 ) ) ) return E_FAIL; memcpy( pVertices, vertices, sizeof(vertices) ); g_pVB-Unlock(); return S_OK; VOID Render() /清空后台缓冲区 g_pd3dDevice-Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(45, 50, 170), 1.0f, 0 ); /开始在后台缓冲区绘制图形 if( SUCCEEDED( g_pd3dDevice-BeginScene() ) ) /在后台缓冲区绘制图形 g_pd3dDevice-SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) ); g_pd3dDevice-SetFVF( D3DFVF_CUSTOMVERTEX ); g_pd3dDevice-SetTexture(0, g_pTex); g_pd3dDevice-DrawPrimitive( D3DPT_TRIANGLELIST, 0, 2 ); /第三个参数代表三角形的个数,2个三角形构成矩形/结束在后台缓冲区绘制图形 g_pd3dDevice-EndScene(); /将在后台缓冲区绘制的图形提交到前台缓冲区显示 g_pd3dDevice-Present( NULL, NULL, NULL, NULL ); 当然不要忘了Release()各个指针,并且按照声明的逆顺序释放。二、DircetInput的使用(俗称五部曲)1、声明变量/首先是全局变量的定义 LPDIRECTINPUT8 g_pDirectInput = NULL;LPDIRECTINPUTDEVICE8g_pKeyboardDevice=NULL;、设备接口对象charg_pKeyStateBuffer256=0;HINSTANCE hInstance = AfxGetInstanceHandle();D3DDISPLAYMODE displayMode;2、函数/- /第1步创键DirectInput接口和设备,简称创设备 /- / g_pDirectInput directinput类型指针/初始化DirectInput指针DirectInput8Create(hInstance,0x0800,IID_IDirectInput8,(void*)&g_pDirectInput,NULL);/创建DirectInput设备 g_pDirectInput-CreateDevice(GUID_SysKeyboard,&g_pKeyboardDevice,NULL);/- /第2步设置数据格式和协作级别,简称设格式 /- /设置数据格式和协作级别 g_pKeyboardDevice-SetDataFormat(&c_dfDIKeyboard);/标准键盘输入格式g_pKeyboardDevice-SetCooperativeLevel(hwnd,DISCL_FOREGROUND|DISCL_NONEXCLUSIVE);/前台非独占模式/- /第3步获取设备控制权,简称拿权力 因为设备可能被其他程序占用/- g_pKeyboardDevice-Acquire();/- / 第4步 获取按键情况并做响应,简称取按键 /- /读取键盘输入 :ZeroMemory(g_pKeyStateBuffer,sizeof(g_pKeyStateBuffer);Device_Read(g_pKeyboardDevice,(LPVOID)g_pKeyStateBuffer,sizeof(g_pKeyStateBuffer);/定义的全局函数 BOOLDevice_Read(IDirectInputDevice8*pDIDevice,void*pBuffer,longlSize)HRESULThr;while(true)pDIDevice-Poll();/轮询设备 pDIDevice-Acquire();/获取设备的控制权 if(SUCCEEDED(hr=pDIDevice-GetDeviceState(lSize,pBuffer)break;/数据放入到自定义缓存pBuffer中if(hr!=DIERR_INPUTLOST|hr!=DIERR_NOTACQUIRED)returnFALSE;if(FAILED(pDIDevice-Acquire()returnFALSE;returnTRUE;/然后就是用if判断并做响应了,如下面一句代码 if(g_pKeyStateBufferDIK_A&0x80) fPosX-=0.005f;/x轴坐标 左移/- /第5步释放控制权和接口对象,简称释对象 /- g_pKeyboardDevice-Unacquire();SAFE_RELEASE(g_pKeyboardDevice)三、DirectSound的使用1、变量声明LPDIRECTSOUND pDS;LPDIRECTSOUNDBUFFER pPBuf;/主缓存区LPDIRECTSOUNDBUFFER pSBuf;/次缓冲区DSBUFFERDESC desc;WAVEFORMATEX pwfmt;WAVEFORMATEX swfmt;MMCKINFO ckRiff;MMCKINFO ckInfo;MMRESULT mmResult;HMMIO hmmio;DWORD size;2、函数bool DSound:InitializeDSound(HWND hwnd)if(FAILED(DirectSoundCreate(NULL,&pDS,NULL)return false;pDS-SetCooperativeLevel(hwnd,DSSCL_PRIORITY);memset(&desc,0,sizeof(desc);/建立主缓冲区desc.dwSize = sizeof(desc);desc.dwFlags = DSBCAPS_PRIMARYBUFFER;desc.dwBufferBytes = 0;desc.lpwfxFormat = NULL;if(FAILED(pDS-CreateSoundBuffer(&desc,&pPBuf,NULL)return false;/read in bufferreturn true;void DSound:SetFormat()memset(&pwfmt,0,sizeof(pwfmt);pwfmt.wFormatTag = WAVE_FORMAT_PCM;pwfmt.nChannels = 2;pwfmt.nSamplesPerSec = 44100;pwfmt.wBitsPerSample = 16;pwfmt.nBlockAlign = pwfmt.wBitsPerSample/8 * pwfmt.nChannels;pwfmt.nAvgBytesPerSec = pwfmt.nSamplesPerSec * pwfmt.nBlockAlign;pPBuf-SetFormat(&pwfmt);bool DSound:ReadFile()hmmio = mmioOpen(_T(sound.wav),NULL,MMIO_ALLOCBUF|MMIO_READ);if(hmmio = NULL)return false;/文件不存在ckRiff.fccType = mmioFOURCC(W,A,V,E);/设置文件类型mmResult = mmioDescend(hmmio,&ckRiff,NULL,MMIO_FINDRIFF);/查找类型if(mmResult != MMSYSERR_NOERROR)return false; /文件格式错误ckInfo.ckid = mmioFOURCC(f,m,t, ); /设定区块类型mmResult = mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK); if(mmResult != MMSYSERR_NOERROR)return false;/文件格式错误if(mmioRead(hmmio,(HPSTR)&swfmt,sizeof(swfmt) = -1) /读取档案格式return false;/文件读取格式失败mmResult = mmioAscend(hmmio,&ckInfo,0); /跳出子区块ckInfo.ckid = mmioFOURCC(d,a,t,a); /设定区块类型mmResult = mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK);/搜寻区块if(mmResult != MMSYSERR_NOERROR)return false; /文件格式错误;size = ckInfo.cksize; /取得实际资料大小/mmioClose(hmmio,0);return true;bool DSound:BuildSecondBuffer()/private load memset(&desc,0,sizeof(desc);desc.dwSize = sizeof(desc);desc.dwBufferBytes = size;desc.lpwfxFormat = &swfmt;desc.dwFlags = DSBCAPS_STATIC|DSBCAPS_CTRLPAN| DSBCAPS_CTRLVOLUME|DSBCAPS_GLOBALFOCUS;/|DSBCAPS_GLOBAFOCUS;if(FAILED(pDS-CreateSoundBuffer(&desc,&pSBuf,NULL)return false;return true;bool DSound:LoadInSecondBuffer()LPVOID pAudio;DWORD bytesAudio;BuildSecondBuffer();if(FAILED(pSBuf-Lock(0,size,&pAudio,&bytesAudio,NULL,NULL,NULL)return false;/锁定缓冲失败mmResult = mmioRead(hmmio,(HPSTR)pAudio,bytesAudio);if(mmResult = -1)return false;/读取音文件数据失败if(FAILED(pSBuf-Unlock(pAudio,bytesAudio,NULL,NULL)return false;/解除锁定缓冲区失败mmioClose(hmmio,0);return true;void DSound:Play(HWND hwnd)InitializeDSound(hwnd)SetFormat();if

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论