开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

查看: 1723|回复: 1
收起左侧

[源码分享] 游戏开发学习笔记-6.输入控制

[复制链接]
结帖率:96% (24/25)
发表于 2015-6-18 08:56:56 | 显示全部楼层 |阅读模式   广东省深圳市
继上一篇加入摄像机后,接下来加入输入控制功能,控制摄像机的自由移动。

p1.jpg

  1. #include "Input.h"


  2. bool CInput::Init(HWND hwnd)
  3. {
  4. //窗口句柄
  5. m_Hwnd=hwnd;
  6. //创建dxinput接口对象
  7. if (FAILED(DirectInput8Create(GetModuleHandle(NULL),DIRECTINPUT_VERSION,IID_IDirectInput8,(void**)&m_Input,NULL)))
  8. {
  9. return false;
  10. }
  11. //创建键盘对象
  12. if (FAILED(m_Input->CreateDevice(GUID_SysKeyboard,&m_KeyBoard,NULL)))
  13. {
  14. return false;
  15. }
  16. if (m_KeyBoard==NULL)
  17. {
  18. return false;
  19. }
  20. if (FAILED(m_KeyBoard->SetDataFormat(&c_dfDIKeyboard)))
  21. {
  22. return false;
  23. }
  24. //设置数据格式
  25. m_KeyBoard->SetCooperativeLevel(m_Hwnd,DISCL_FOREGROUND|DISCL_NONEXCLUSIVE); //设置协作级别

  26. //创建鼠标对象
  27. if (FAILED(m_Input->CreateDevice(GUID_SysMouse,&m_Mouse,NULL)))
  28. {
  29. return false;
  30. }
  31. m_Mouse->SetDataFormat(&c_dfDIMouse); //设置鼠标接受数据格式
  32. m_Mouse->SetCooperativeLevel(m_Hwnd,DISCL_FOREGROUND|DISCL_NONEXCLUSIVE); //设置非独占模式


  33. return true;
  34. }

  35. void CInput::Update()
  36. {
  37. m_KeyBoard->Acquire();
  38. m_KeyBoard->Poll();
  39. m_Mouse->Acquire();
  40. m_Mouse->Poll();
  41. m_KeyBoard->GetDeviceState(sizeof(keys),(LPVOID)&keys);
  42. m_Mouse->GetDeviceState(sizeof(m_MouseState),(LPVOID)&m_MouseState);
  43. }

  44. bool CInput::IsKeyDown( char key )
  45. {
  46. if (keys[key] & 0x80)
  47. {
  48. return true;
  49. }
  50. return false;
  51. }

  52. CInput::CInput()
  53. {
  54. m_Hwnd=NULL;
  55. m_Input=NULL;
  56. m_KeyBoard=NULL;
  57. m_Mouse=NULL;
  58. }

  59. CInput::~CInput()
  60. {

  61. }

  62. void CInput::GetMouseMoveState( long* plX,long* plY )
  63. {
  64. *plX=m_MouseState.lX;
  65. *plY=m_MouseState.lY;
  66. }
复制代码
  1. #include "Engine.h"

  2. #define WIN_CLASS "dx01"//窗体类名
  3. #define WIN_NAME "3D摄像机自动导航" //窗体标题
  4. #define WIN_WIDTH 800 //窗体宽度
  5. #define WIN_HEIGHT 600 //窗体高度
  6. #define WIN_FULLSCREEN false //是否全屏


  7. Engine engine; //引擎对象
  8. Model pModel; //模型
  9. LPDIRECT3DDEVICE9 dev=NULL;
  10. CCamera* g_pCamera=NULL; //摄像机
  11. CInput* g_pInput=NULL; //输入设备

  12. float angle=0.0f;
  13. UINT uStep=1;
  14. float RotationSpeed=0.005f;
  15. float ForwardSpeed=1.0f;

  16. //游戏初始化
  17. bool GameInit(HWND hwnd);
  18. //游戏循环
  19. void GameLoop(HWND hwnd);
  20. //更新
  21. void GameUpdate(HWND hwnd);
  22. //游戏结束
  23. void GameEnd();


  24. //Windows消息回调函数
  25. LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
  26. {
  27. switch(msg)
  28. {
  29. case WM_DESTROY:
  30. PostQuitMessage(0);
  31. break;
  32. case WM_KEYUP:
  33. if (wparam==VK_ESCAPE)
  34. {
  35. PostQuitMessage(0);
  36. }
  37. break;
  38. }
  39. return DefWindowProc(hwnd,msg,wparam,lparam);
  40. }

  41. //Window入口函数
  42. int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
  43. {
  44. //设置窗口结构类属性
  45. WNDCLASSEX wc={sizeof(WNDCLASSEX),CS_CLASSDC,WndProc,0,0,hInstance,NULL,NULL,NULL,NULL,WIN_CLASS,NULL};
  46. //注册窗口类型
  47. RegisterClassEx(&wc);
  48. //创建窗口
  49. HWND hwnd= CreateWindow(WIN_CLASS,WIN_NAME,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,WIN_WIDTH,WIN_HEIGHT,NULL,NULL,hInstance,NULL);
  50. if (hwnd)
  51. {
  52. ShowWindow(hwnd,nShowCmd); //显示窗口
  53. UpdateWindow(hwnd); //更新窗口

  54. if (GameInit(hwnd))
  55. {
  56. MSG msg;
  57. ZeroMemory(&msg,sizeof(msg));
  58. //窗口消息循环
  59. while (msg.message!=WM_QUIT)
  60. {
  61. if (PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))
  62. {
  63. TranslateMessage(&msg); //转换消息
  64. DispatchMessage(&msg); //分派消息
  65. }
  66. else
  67. {
  68. GameLoop(hwnd);
  69. }
  70. }
  71. GameEnd();
  72. }
  73. }
  74. UnregisterClass(WIN_CLASS,wc.hInstance);
  75. return 0;
  76. }
  77. //Game循环
  78. void GameLoop(HWND hwnd)
  79. {
  80. engine.ClearScreen();
  81. GameUpdate(hwnd);
  82. engine.StartRender(); //开始渲染

  83. engine.DrawModel(&pModel);

  84. engine.EndRender(); //结束渲染
  85. }

  86. //Game开始
  87. bool GameInit(HWND hwnd)
  88. {
  89. if (!engine.Init(hwnd,WIN_WIDTH,WIN_HEIGHT))
  90. {
  91. return false;
  92. }
  93. if (!engine.LoadModel("edificio1.X",&pModel))
  94. {
  95. ShowMessage("载入模型失败!");
  96. return false;
  97. }
  98. dev= engine.GetDev();

  99. dev->SetRenderState(D3DRS_LIGHTING,false); //关闭光照
  100. dev->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE); //背面消隐

  101. g_pCamera=new CCamera(dev);
  102. g_pCamera->SetCameraPosition(&D3DXVECTOR3(0.0f,50.0f,-300.0f)); //设置初始摄像机位置
  103. g_pCamera->SetLookPosition(&D3DXVECTOR3(0.0f,50.0f,0.0f)); //设置初始观察点位置
  104. g_pCamera->SetViewMatrix(); //初始化取景变换矩阵
  105. g_pCamera->SetProjMatrix(WIN_WIDTH,WIN_HEIGHT); //初始化投影变换矩阵

  106. g_pInput=new CInput();
  107. if (!g_pInput->Init(hwnd))
  108. {
  109. return false;
  110. }



  111. return true;
  112. }

  113. //GameOver
  114. void GameEnd()
  115. {
  116. //模型释放
  117. pModel.Release();
  118. //关闭引擎
  119. engine.Shutdown();
  120. g_pCamera->~CCamera();
  121. SAFE_DELETE(g_pCamera);
  122. }

  123. void GameUpdate(HWND hwnd)
  124. {
  125. g_pInput->Update(); //更新键盘鼠标缓冲区数据
  126. if (g_pInput->IsKeyDown(DIK_W)) g_pCamera->MoveAlongLook(ForwardSpeed); //向前
  127. if(g_pInput->IsKeyDown(DIK_S)) g_pCamera->MoveAlongLook(-ForwardSpeed); //向后
  128. if(g_pInput->IsKeyDown(DIK_A)) g_pCamera->MoveAlongRight(-ForwardSpeed); //向左
  129. if(g_pInput->IsKeyDown(DIK_D)) g_pCamera->MoveAlongRight(ForwardSpeed); //向右
  130. long x,y;
  131. g_pInput->GetMouseMoveState(&x,&y); //获取鼠标数据
  132. g_pCamera->RotationUp(x*0.001f); //左右旋转
  133. g_pCamera->RotationRight(y*0.001f); //上下旋转
  134. D3DXMATRIX MatrixView;
  135. g_pCamera->CalcViewMatrix(&MatrixView);
  136. dev->SetTransform(D3DTS_VIEW,&MatrixView);

  137. //控制鼠标坐标
  138. POINT pos1;
  139. pos1.x=WIN_WIDTH/2;
  140. pos1.y=WIN_HEIGHT/2;
  141. SetCursorPos(pos1.x,pos1.y);

  142. }
复制代码

运行截图:



同步博客:http://blog.csdn.net/qq578023708/article/details/46536247
交流群:87341183

源码:
dx01.rar (937.53 KB, 下载次数: 1)
结帖率:67% (4/6)

签到天数: 5 天

发表于 2015-6-18 09:03:22 | 显示全部楼层   四川省遂宁市
看不懂然而不下载
回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

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

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

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