游戏开发学习笔记-4.加载X模型

来源:互联网 发布:udid定制后台源码 编辑:程序博客网 时间:2024/06/07 20:35

继续充实我们的引擎类!

上一篇顶点类绘画只是作为一个DEMO,不写入引擎类,因此,此次已经顶点类的移除!如果后续需要,再考虑增加!

这次主要实现X模型加载功能。

首先增加了一个定义文件,用于定义我们的模型。

#ifndef _DEFINES_H_#define _DEFINES_H_#include "Functions.h"struct Model {D3DMATERIAL9* pMaterials; //材质数组指针LPDIRECT3DTEXTURE9* pTextures; //纹理数组指针DWORD MaterialCount; //材质纹理数量LPD3DXMESH Mesh; //网格对象void Release() //释放指针{SAFE_DELETES(pMaterials);SAFE_DELETES(pTextures);}};#endif


 

之后是载入模型的封装的具体实现

//载入模型bool Engine::LoadModel( LPCSTR filePath,Model* pModel ){LPD3DXBUFFER Material;DWORD dwCount;LPD3DXMESH mesh;D3DXMATERIAL* pMaterial;//从文件加载模型if (FAILED(D3DXLoadMeshFromX(filePath,D3DXMESH_MANAGED,m_Dev,NULL,&Material,NULL,&dwCount,&mesh))){return false;}//获取模型数据pMaterial=(D3DXMATERIAL*)Material->GetBufferPointer();pModel->MaterialCount=dwCount;pModel->Mesh=mesh;pModel->pMaterials=new D3DMATERIAL9[dwCount]; //初始化材质数组pModel->pTextures=new LPDIRECT3DTEXTURE9[dwCount]; //初始化纹理数组for (DWORD i=0;i<dwCount;i++){pModel->pMaterials[i]=pMaterial[i].MatD3D; //材质对象pModel->pMaterials[i].Ambient=pModel->pMaterials[i].Diffuse; //环境光等于漫反射光pModel->pTextures[i]=NULL;//从文件创建纹理if (FAILED(D3DXCreateTextureFromFile(m_Dev,pMaterial[i].pTextureFilename,&(pModel->pTextures[i])))){char chText[128];sprintf(chText,"加载纹理文件 %s 失败!",pMaterial[i].pTextureFilename);ShowMessage(chText);return false;}}return true;}


然后是画模型实现

此方法需要一个我们自定义的模型结构指针

 

//画模型void Engine::DrawModel( Model* pModel ){for (DWORD i=0;i<pModel->MaterialCount;i++){//设置材质m_Dev->SetMaterial(&(pModel->pMaterials[i]));//设置纹理m_Dev->SetTexture(0,pModel->pTextures[i]);//画子模型pModel->Mesh->DrawSubset(i);}}


 

然后是main函数, 定义了一个模型对象,和3个看名知意的函数

Engine engine; //引擎对象Model pModel; //模型//游戏初始化bool GameInit(HWND hwnd);//游戏循环void GameLoop();//游戏结束void GameEnd();


修改的地方在于,将原来的引擎初始化,关闭,函数移入了这3个函数中。

//Game循环void GameLoop(){engine.ClearScreen();engine.StartRender(); //开始渲染engine.DrawModel(&pModel);engine.EndRender(); //结束渲染}//Game开始bool GameInit(HWND hwnd){if (!engine.Init(hwnd,WIN_WIDTH,WIN_HEIGHT)){return false;}if (!engine.LoadModel("edificio1.X",&pModel)){ShowMessage("载入模型失败!");return false;}return true;}//GameOvervoid GameEnd(){//模型释放pModel.Release();//关闭引擎engine.Shutdown();}


 

最后是释放指针的宏

#ifndef _FUNCTIONS_H_#define _FUNCTIONS_H_#include <windows.h>#define SAFE_RELEASE(P) {if (P!=NULL){P->Release();P=NULL;}}#define SAFE_DELETE(P) {if (P!=NULL){delete P; P=NULL;}}#define SAFE_DELETES(P) {if (P!=NULL){delete[] P; P=NULL;}}void ShowMessage(LPCSTR lpStr);#endif


 

载入模型之后,却还是不能看到模型,那是因为还没有经过矩阵的变换,下一篇,矩阵变换

 

源代码下载:

http://download.csdn.net/detail/qq578023708/8796929

0 0