将分解的C++RPG引擎分配到VC++6.0 DirectX9.0 AppWizard项目中

因为项目需要,我们打算用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. 修改所有setget方法参数为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()

// 作用:创建D3DXSpriteCOM对象

// ------------------------------------------------------------

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.hrmxftmpl.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

      

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值