您的位置:首页 > 其它

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

2015-06-11 17:22 603 查看
继续充实我们的引擎类!

上一篇顶点类绘画只是作为一个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;
}

//GameOver
void 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: