开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1367|回复: 2
收起左侧

[源码分享] 游戏开发学习笔记-2.引擎初现

[复制链接]
结帖率:96% (24/25)
发表于 2015-6-11 09:59:32 | 显示全部楼层 |阅读模式   广东省深圳市
本帖最后由 小生怕怕啊 于 2015-6-11 10:03 编辑

继上一篇,增加了一个微小的引擎类,此类还不具备基本的引擎功能,后面慢慢填充。
首先是引擎类的头文件声明
  1. #ifndef _ENGINE_H_
  2. #define _ENGINE_H_

  3. #include <windows.h>
  4. #include <d3d9.h>
  5. #include <d3dx9.h>
  6. #include "Functions.h"

  7. #pragma comment(lib,"d3d9.lib")
  8. #pragma comment(lib,"d3dx9.lib")

  9. //引擎类 ~引擎虽小,五脏俱全
  10. class Engine
  11. {
  12. public:
  13. Engine();
  14. ~Engine();

  15. bool Init(HWND hwnd,UINT uWidth,UINT uHeight,bool bFullscreen=false );//初始化 ~看字明意
  16. void ClearScreen(D3DCOLOR color=D3DCOLOR_XRGB(0,0,0)); //清屏 ~简洁明了
  17. void StartRender(); //开始渲染 ~看字明意
  18. void EndRender();//结束渲染 ~看字明意
  19. void Shutdown();//关闭 ~看字明意

  20. private:
  21. LPDIRECT3D9 m_D3d; //D3D接口指针
  22. LPDIRECT3DDEVICE9 m_Dev; //D3D设备
  23. HWND hMainHwnd; //窗口句柄 ~不知道要不要用
  24. };
  25. #endif
复制代码

然后是引擎类的实现
  1. #include "Engine.h"

  2. Engine::Engine()
  3. {
  4. m_Dev=NULL;
  5. m_D3d=NULL;
  6. hMainHwnd=NULL;
  7. }

  8. Engine::~Engine()
  9. {
  10. Shutdown(); //关闭引擎
  11. }

  12. bool Engine::Init( HWND hwnd,UINT uWidth,UINT uHeight,bool bFullscreen )
  13. {
  14. if (NULL==(m_D3d=Direct3DCreate9(D3D_SDK_VERSION))) //获取D3D接口指针
  15. {
  16. ShowMessage("创建D3D接口失败!");
  17. return false;
  18. }
  19. D3DPRESENT_PARAMETERS d3dpp;
  20. ZeroMemory(&d3dpp,sizeof(d3dpp));
  21. d3dpp.BackBufferCount=1; //缓冲数量
  22. d3dpp.BackBufferWidth=uWidth; //缓冲宽度
  23. d3dpp.BackBufferHeight=uHeight; //缓冲高度
  24. d3dpp.BackBufferFormat=D3DFMT_X8R8G8B8; //缓冲格式
  25. d3dpp.EnableAutoDepthStencil=TRUE; //开启自动深度缓冲
  26. d3dpp.AutoDepthStencilFormat=D3DFMT_D24S8; //深度缓冲格式
  27. d3dpp.Windowed=!bFullscreen; //是否全屏
  28. d3dpp.hDeviceWindow=hwnd; //设备窗口
  29. d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD; //交换效果
  30. //创建D3D设备
  31. if (FAILED(m_D3d->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwnd,D3DCREATE_HARDWARE_VERTEXPROCESSING,&d3dpp,&m_Dev)))
  32. {
  33. ShowMessage("创建D3D设备失败!");
  34. return false;
  35. }
  36. return true;

  37. }

  38. void Engine::Shutdown()
  39. {
  40. SAFE_RELEASE(m_Dev);
  41. SAFE_RELEASE(m_D3d);
  42. }

  43. void Engine::ClearScreen( D3DCOLOR color/*=D3DCOLOR_XRGB(0,0,0)*/ )
  44. {
  45. m_Dev->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,color,1.0f,0);
  46. }

  47. void Engine::StartRender()
  48. {
  49. m_Dev->BeginScene();
  50. }

  51. void Engine::EndRender()
  52. {
  53. m_Dev->EndScene();
  54. m_Dev->Present(NULL,NULL,NULL,NULL);
  55. }
复制代码

另外增加了一个公共函数文件
  1. #ifndef _FUNCTIONS_H_
  2. #define _FUNCTIONS_H_

  3. #include <windows.h>

  4. #define SAFE_RELEASE(P) {if (P!=NULL){P->Release();P=NULL;}}

  5. void ShowMessage(LPCSTR lpStr);
  6. #endif
  7. <BLOCKQUOTE>
复制代码
  1. #include "Functions.h"

  2. void ShowMessage( LPCSTR lpStr )
  3. {
  4. MessageBox(NULL,lpStr,"Info",MB_OK);
  5. }
  6. <BLOCKQUOTE>
复制代码
最后是WinMain窗体的代码,继上一篇的代码,修改部分代码

  1. <P>#include <windows.h>
  2. #include "Engine.h"</P>
  3. <P>#define WIN_CLASS "dx01"//窗体类名
  4. #define WIN_NAME "dx01" //窗体标题
  5. #define WIN_WIDTH 800 //窗体宽度
  6. #define WIN_HEIGHT 600 //窗体高度
  7. #define WIN_FULLSCREEN false //是否全屏</P>
  8. <P>
  9. Engine engine; //引擎对象</P>
  10. <P>//循环
  11. void GameLoop();</P>
  12. <P>//Windows消息回调函数
  13. LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
  14. {
  15. switch(msg)
  16. {
  17. case WM_DESTROY:
  18.   PostQuitMessage(0);
  19.   break;
  20. case WM_KEYUP:
  21.   if (wparam==VK_ESCAPE)
  22.   {
  23.    PostQuitMessage(0);
  24.   }
  25.   break;
  26. }
  27. return DefWindowProc(hwnd,msg,wparam,lparam);
  28. }</P>
  29. <P>//Window入口函数
  30. int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
  31. {
  32. //设置窗口结构类属性
  33. WNDCLASSEX wc={sizeof(WNDCLASSEX),CS_CLASSDC,WndProc,0,0,hInstance,NULL,NULL,NULL,NULL,WIN_CLASS,NULL};
  34. //注册窗口类型
  35. RegisterClassEx(&wc);
  36. //创建窗口
  37. HWND hwnd= CreateWindow(WIN_CLASS,WIN_NAME,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,WIN_WIDTH,WIN_HEIGHT,NULL,NULL,hInstance,NULL);
  38. if (hwnd)
  39. {
  40.   ShowWindow(hwnd,nShowCmd); //显示窗口
  41.   UpdateWindow(hwnd); //更新窗口
  42.   
  43.   if (engine.Init(hwnd,WIN_WIDTH,WIN_HEIGHT))
  44.   {
  45.    MSG msg;
  46.    ZeroMemory(&msg,sizeof(msg));
  47.    //窗口消息循环
  48.    while (msg.message!=WM_QUIT)
  49.    {
  50.     if (PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))
  51.     {
  52.      TranslateMessage(&msg); //转换消息
  53.      DispatchMessage(&msg); //分派消息
  54.     }
  55.     else
  56.     {
  57.      GameLoop();
  58.     }
  59.    }
  60.    engine.Shutdown();
  61.   }
  62. }
  63. UnregisterClass(WIN_CLASS,wc.hInstance);
  64. return 0;
  65. }</P>
  66. <P>void GameLoop()
  67. {
  68. engine.StartRender(); //开始渲染</P>
  69. <P> engine.EndRender(); //结束渲染
  70. }</P>
复制代码

运行截图




源代码下载:
dx01.rar (1.77 MB, 下载次数: 2)
结帖率:68% (15/22)
发表于 2015-7-30 11:14:51 | 显示全部楼层   广东省佛山市
都不知道怎么运行啊
回复 支持 反对

使用道具 举报

结帖率:40% (2/5)

签到天数: 3 天

发表于 2015-6-11 10:03:07 | 显示全部楼层   四川省宜宾市
好高大上大感觉
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表