游戏开发学习笔记-4.加载X模型
2015-06-11 17:22
603 查看
继续充实我们的引擎类!
上一篇顶点类绘画只是作为一个DEMO,不写入引擎类,因此,此次已经顶点类的移除!如果后续需要,再考虑增加!
这次主要实现X模型加载功能。
首先增加了一个定义文件,用于定义我们的模型。
之后是载入模型的封装的具体实现
然后是画模型实现
此方法需要一个我们自定义的模型结构指针
然后是main函数, 定义了一个模型对象,和3个看名知意的函数
修改的地方在于,将原来的引擎初始化,关闭,函数移入了这3个函数中。
最后是释放指针的宏
载入模型之后,却还是不能看到模型,那是因为还没有经过矩阵的变换,下一篇,矩阵变换
源代码下载:
http://download.csdn.net/detail/qq578023708/8796929
上一篇顶点类绘画只是作为一个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
相关文章推荐
- leetcode 日经贴,Cpp code -Implement Stack using Queues
- Object C学习笔记3-对象的使用和定义
- mybatis中关于sqlMapConfig配置
- 基于FSL的DTI数据预处理流程
- Java程序员应当掌握的排序算法
- 进度计划管理软件 PowerPlan (包含GRID,甘特图,直方图,网络图,跟踪逻辑,时标概要图等功能)
- 在mysql的命令行中设置字符集
- 七牛curl命令实现上传和下载
- 两个链表的第一个公共结点
- python 时间字符串格式转换
- xcode6.3 真机运行设备选不上
- 浅析数据库连接池(二)
- Entity Framework 实体框架的形成之旅--几种数据库操作的代码介绍(9)
- 算法-大整数加法
- RecyclerView设置verticalSapcing等
- 最近进度
- SSH无密码登录
- 产品开发篇
- [转]C语言之单向链表的创建插入删除等功能
- php+jquery+ajax+json简单小例子