因为项目需要,我们打算用vc++6.0 中的DirectX9.0 AppWizard工程框架。
此框架可以实现MFC与DirectX的结合,可以免去很多麻烦。
但之前研究的DX代码都是基于Win32,所以有移植的问题。
需要 C++ -Game Programming RPGs With DirectX 中带的引擎代码转换到框架中可用。
最重要的是Graphics_Core,所以对此我将它中的所有类进行了分解,并修改,同时加到框架中进行测试,以下是测试步骤:
首先修改StdAfx.h文件,添加:
#define ReleaseCOM(x) if(x) { x->Release(); x = NULL; }
#include "d3d9.h"
#include "dmusici.h"
#include "dsound.h"
#include "dplay8.h"
#include "dpaddr.h"
#include "dinput.h"
#include "dshow.h"
#include "d3dx9core.h"
1. 测试cFont类
a. 新建头文件cFont.h,修改#include为"StdAfx.h"
b. 新建cpp文件cFont.cpp
c. 在工程.h中增加#include "cFont.h"
d. CAppForm增加新成员cFont m_Font;
e. 在工程.cpp中的HRESULT CAppForm::RestoreDeviceObjects()中增加代码:
m_Font.Create(m_pd3dDevice,"Times New Roman");//创建font |
f. 在HRESULT CAppForm::InvalidateDeviceObjects()中增加代码
m_Font.Free();//释放对象。如果不释放,在关闭对话框时会提示。 |
g. 运行成功
2. 测试cLight类
a. 新建头文件cLight.h,步骤同上。
b. 新建cpp文件cLight.cpp
c. 在工程.h中增加#include "cLight.h"
d. CAppForm增加新成员 cLight m_Light;
e. 在工程.cpp中的HRESULT CAppForm::RestoreDeviceObjects()中增加代码:
m_Light.SetType(D3DLIGHT_SPOT); m_Light.Point(0,0,-4,0,0,0); m_Light.Range(20); m_Light.SetDiffuseColor(255,255,0); m_Light.SetAmbientColor(255,255,0); m_Light.SetTheta(D3DX_PI/100); m_Light.SetPhi(D3DX_PI/150); m_pd3dDevice->SetLight(0,m_Light.getLight()); m_pd3dDevice->LightEnable(0,TRUE); |
f. 运行成功
g. 扩展:cAppForm增加新成员函数:
BOOL SetCurrentLight(int num, cLight *light, BOOL andOpenIt = TRUE);// 设置灯光 BOOL OpenLight(int num, BOOL Open = TRUE); // 开启、禁用灯光 |
// ------------------------------------------------------------ // 名称:SetCurrentLight() // 作用:设置当前灯光,可选择是否同时开启此灯光 // ------------------------------------------------------------ BOOL CAppForm::SetCurrentLight(int num, cLight *light, BOOL andOpenIt /* = TRUE */) { if(m_pd3dDevice == NULL) { return FALSE; } if(light == NULL) { return FALSE; }
m_pd3dDevice->SetLight(num,light->getLight());
// 判断是否同时开启此灯光 if(andOpenIt == TRUE) { m_pd3dDevice->LightEnable(num,TRUE); }
return TRUE; }
|
// ------------------------------------------------------------ // 名称:OpenLight() // 作用:开启指定灯光 // ------------------------------------------------------------ BOOL CAppForm::OpenLight(int num, BOOL Open /* = TRUE */) { m_pd3dDevice->LightEnable(num, Open);
return TRUE; }
|
h. 测试成功
3. 测试cMaterial类
ps. 修改所有set,get方法参数为float类型。
a. 新建头文件cMaterial.h,步骤同上
b. 新建cpp文件cMaterial.cpp
c. 在工程.h中增加#include "cMaterial.h"
d. CAppForm增加新成员 cMaterial m_Material;
e. 在工程.cpp中的HRESULT CAppForm::RestoreDeviceObjects()中增加代码(覆盖原设置材质的代码):
m_Material.SetDiffuseColor(0,255,0); m_Material.SetAmbientColor(0,255,0); m_pd3dDevice->SetMaterial( m_Material.GetMaterial() ); |
f. 测试成功
g. 增加新成员函数:
BOOL SetCurrentMaterial(cMaterial *mtrl); // 设置材质 |
// ------------------------------------------------------------ // 名称:SetCurrentMaterial() // 作用:设置当前材质 // ------------------------------------------------------------ BOOL CAppForm::SetCurrentMaterial(cMaterial *mtrl) { m_pd3dDevice->SetMaterial(mtrl->GetMaterial());
return TRUE; }
|
f. 测试成功
4. 测试cCamera类:
a. 新建头文件cCamera.h步骤同上
b. 新建cpp文件cCamera.cpp
c. 在工程.h中增加#include "cCamera.h"
d. CAppForm增加新成员 cCamera.h m_Camera
e. 增加新成员函数:
BOOL SetCamera(cCamera *Camera); // 设置摄像头 |
// ------------------------------------------------------------ // 名称:SetCamera() // 作用:设置摄像头 // ------------------------------------------------------------ BOOL CAppForm::SetCamera(cCamera *Camera) { if(Camera == NULL) { return FALSE; }
if(m_pd3dDevice == NULL) { return FALSE; }
m_pd3dDevice->SetTransform(D3DTS_VIEW, Camera->GetMatrix()); }
|
f. HRESULT CAppForm::RestoreDeviceObjects()中增加以下代码(需先覆盖以前的view矩阵):
m_Camera.Point(0,0,-4,0,0,0); SetCamera(&m_Camera); |
g. 测试成功
5. 测试cTexture类:
a. 新建头文件cTexture.h,步骤同上
b. 新建cpp文件cTexture.cpp
c. 在工程.h中增加#include "cTexture.h"
d. CAppForm增加新成员cTexture m_Texture, ID3DSprite* m_Sprite;
e. HRESULT CAppForm::RestoreDeviceObjects()中增加以下代码
m_Texture.Load(m_pd3dDevice,"Data//men2.bmp"); D3DXCreateSprite(m_pd3dDevice,&m_Sprite); |
f. 在Render()中增加以下代码:
m_Texture.Blit(m_Sprite,20,20,0); |
g. 在HRESULT CAppForm::InvalidateDeviceObjects()中增加代码
m_Texture.Free(); m_Sprite->Release(); |
h. 测试成功
i. 扩展:
增加成员函数:
BOOL CreateSpriteCOM(); // 创建SpriteCOM |
// ------------------------------------------------------------ // 名称:CreateSpriteCOM() // 作用:创建D3DXSprite的COM对象 // ------------------------------------------------------------ BOOL CAppForm::CreateSpriteCOM() { if(m_pd3dDevice == NULL) { return FALSE; }
if(FAILED(D3DXCreateSprite(m_pd3dDevice,&m_Sprite))) { return FALSE; }
return TRUE; }
|
6. 测试cMesh,cObject,cAnimation,cWorldPosition:
首先测试cMesh,cObject:
a. cObject,cWorldPosition按以上方法即可。
b. cMesh,cAnimation因为涉及到两个头文件:rmxfguid.h,rmxftmpl.h,所以要放在同一个文件中,而工程中有一个d3dfile.cpp,
也需要这两个头文件,所以将cMesh,cAnimation的实现(即其对应的cpp)全部放到d3dfile.cpp中。
这样做的原因是这两个头文件中有初始化数据 不能把它放到.h文件也不能重复放置,否则会出现LNK2005错误。
c. CAppForm中添加新成员cMesh m_Mesh, cObject m_Object.
d. HRESULT CAppForm::RestoreDeviceObjects()中添加
m_Mesh.Load(m_pd3dDevice,"Data//ren.x","Data//"); m_Obj.Create(m_pd3dDevice,&m_Mesh); m_Obj.Move(0,2,0); |
e. Render()中添加:
m_Obj.Render(); |
f. HRESULT CAppForm::InvalidateDeviceObjects()中释放资源:
m_Mesh.Free(); m_Obj.Free(); |
g. 测试成功
在测试cAnimation:
a. CAppForm新增成员cAnimation m_Animation.
b. 在HRESULT CAppForm::RestoreDeviceObjects()添加如下代码:
m_Mesh.Load(m_pd3dDevice,"Data//Yodan.x","Data//"); m_Animation.Load("Data//Yodan.x",&m_Mesh); m_Obj.Create(m_pd3dDevice,&m_Mesh); m_Animation.SetLoop(TRUE,"Walk"); m_Obj.SetAnimation(&m_Animation,"Walk",timeGetTime()); m_Obj.UpdateAnimation(timeGetTime()/20,TRUE); |
c. Render()添加如下代码:
m_Obj.Move(0,0,-1); m_Obj.Scale(.009,.009,.009); m_Obj.Render(); m_Obj.UpdateAnimation(timeGetTime()/30,TRUE); |
d. HRESULT CAppForm::InvalidateDeviceObjects()中释放资源:
m_Animation.Free(); |
e. 测试成功
7. 测试cVertexBuffer:
a. 按以上方法。
b. CAppForm中添加新成员cVertexBuffer m_VB
c. 工程.cpp中添加测试顶点
typedef struct Vertex // 测试cVertexBuffer类 { FLOAT x, y, z, rhw; D3DCOLOR color ; }; #define FVF_VERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE) |
d. HRESULT CAppForm::RestoreDeviceObjects()添加代码:
m_VB.Create(m_pd3dDevice,4,FVF_VERTEX,sizeof(Vertex)); Vertex vers[4] = { { 0.0f, 0.0f, 1.0f,1.0f, D3DCOLOR_RGBA(255,0,255,255) }, { 200.0f, 0.0f, 1.0f,1.0f, D3DCOLOR_RGBA(255,0,255,255) }, { 0.0f, 200.0f, 1.0f,1.0f, D3DCOLOR_RGBA(255,0,255,255) }, { 200.0f, 200.0f, 1.0f,1.0f, D3DCOLOR_RGBA(255,0,255,255) }, }; m_VB.Set(0,4,(void*)&vers); |
e. Render()添加代码:
m_VB.Render(0,2,D3DPT_TRIANGLESTRIP); |
f. HRESULT CAppForm::InvalidateDeviceObjects()中释放资源:
m_VB.Free(); |
g. 测试成功
SUNJIAHAOZ