T3D图形库(五)

 DInput库文件部分

 

  1. /*2008.10.1
  2. T3D图形库
  3. ——<<windows游戏
  4. 编程大师技巧>>
  5. */
  6. // DI_lib.cpp
  7. // INCLUDES ///
  8. #define WIN32_LEAN_AND_MEAN  
  9. #include <windows.h>   // include important windows stuff
  10. #include <windowsx.h> 
  11. #include <mmsystem.h>
  12. #include <objbase.h>  // 它提供一些系统默认GUID 如GUID_SysMouse
  13. #include <iostream.h> // include important C/C++ stuff
  14. #include <conio.h>
  15. #include <stdlib.h>
  16. #include <malloc.h>
  17. #include <memory.h>
  18. #include <string.h>
  19. #include <stdarg.h>
  20. #include <stdio.h>
  21. #include <math.h>
  22. #include <io.h>
  23. #include <fcntl.h>
  24. #include <ddraw.h>  // directX includes
  25. #include <dinput.h>
  26. //#include "DDraw_lib.h"
  27. #include "DI_lib.h"
  28. // EXTERNALS /
  29. //extern HWND main_window_handle;   
  30. //extern HINSTANCE main_instance; 
  31. // GLOBALS 
  32. // directinput全局变量
  33. LPDIRECTINPUT8       lpdi      = NULL;    // dinput object
  34. LPDIRECTINPUTDEVICE8 lpdikey   = NULL;    // dinput keyboard
  35. LPDIRECTINPUTDEVICE8 lpdimouse = NULL;    // dinput mouse
  36. LPDIRECTINPUTDEVICE8 lpdijoy   = NULL;    // dinput joystick
  37. GUID                 joystickGUID;        // guid for main joystick
  38. char                 joyname[80];         // name of joystick
  39. UCHAR keyboard_state[256]; // 包含键盘消息
  40. DIMOUSESTATE mouse_state;  // 包含鼠标状态
  41. DIJOYSTATE joy_state;      // 包含游戏杆状态
  42. int joystick_found = 0;    // 检测游戏杆是否被发现
  43. // 函数定义 //
  44. BOOL CALLBACK DInput_Enum_Joysticks(LPCDIDEVICEINSTANCE lpddi,
  45.                                     LPVOID guid_ptr)
  46. {
  47.   //这是一个回调函数,当搜索到有游戏杆设备时会调用此函数
  48.   //将检测到的游戏杆设备的GUID赋予调用函数传入的GUID指针
  49.   *(GUID*)guid_ptr = lpddi->guidInstance;
  50.   //保存游戏杆设备名
  51.   strcpy(joyname,(char*)lpddi->tszProductName);
  52.   //找到一个游戏杆设备即停止枚举
  53.   return(DIENUM_STOP);
  54. }
  55. int DInput_Init(void)
  56. {
  57.   //初始化DirectInput
  58.   if (FAILED(DirectInput8Create(main_instance,DIRECTINPUT_VERSION,IID_IDirectInput8,(void**)&lpdi,NULL)))
  59.     return(0);
  60.   return(1);
  61. }
  62. void DInput_Shutdown(void)
  63. {
  64.   //释放DI资源
  65.   if (lpdi)
  66.     lpdi->Release();
  67. }
  68. int DInput_Init_Joystick(int min_x/* =-256 */int max_x/* =256 */
  69.                          int min_y/* =-256 */int max_y/* =256 */,
  70.                          int dead_zone /* = 10 */)
  71. {
  72.   //初始化游戏杆
  73.   //寻找游戏杆设备
  74.   lpdi->EnumDevices(DI8DEVCLASS_GAMECTRL,
  75.                     DInput_Enum_Joysticks,  //回调函数
  76.                     &joystickGUID,       //传入回调函数的GUID变量地址
  77.                     DIEDFL_ATTACHEDONLY);
  78.   //创建游戏杆设备
  79.   if (lpdi->CreateDevice(joystickGUID,&lpdijoy,NULL)!=DI_OK)
  80.     return(0);
  81.   if (lpdijoy->SetCooperativeLevel(main_window_handle,
  82.                         DISCL_NONEXCLUSIVE | DISCL_BACKGROUND)!=DI_OK)
  83.       return(0);
  84.   
  85.   if (lpdijoy->SetDataFormat(&c_dfDIJoystick)!=DI_OK)
  86.      return(0);
  87.   //设置 X/Y方向摇杆 范围
  88.   DIPROPRANGE joy_axis_range;
  89.   joy_axis_range.lMin = min_x;
  90.   joy_axis_range.lMax = max_x;
  91.   joy_axis_range.diph.dwSize       =sizeof(DIPROPRANGE);
  92.   joy_axis_range.diph.dwHeaderSize =sizeof(DIPROPHEADER);
  93.   joy_axis_range.diph.dwObj        =DIJOFS_X;
  94.   joy_axis_range.diph.dwHow        =DIPH_BYOFFSET;
  95.   lpdijoy->SetProperty(DIPROP_RANGE,&joy_axis_range.diph);
  96.   joy_axis_range.lMin = min_y;
  97.   joy_axis_range.lMax = max_y;
  98.   joy_axis_range.diph.dwSize       = sizeof(DIPROPRANGE); 
  99.   joy_axis_range.diph.dwHeaderSize = sizeof(DIPROPHEADER); 
  100.   joy_axis_range.diph.dwObj        = DIJOFS_Y;
  101.   joy_axis_range.diph.dwHow        = DIPH_BYOFFSET;
  102.   lpdijoy->SetProperty(DIPROP_RANGE,&joy_axis_range.diph);
  103.   //设置死区 X/Y 方向的值(取0~10000)
  104.   DIPROPDWORD dead_band;
  105.   dead_zone*=100;
  106.   dead_band.diph.dwSize       = sizeof(dead_band);
  107.   dead_band.diph.dwHeaderSize = sizeof(dead_band.diph);
  108.   dead_band.diph.dwObj        = DIJOFS_X;
  109.   dead_band.diph.dwHow        = DIPH_BYOFFSET;
  110.   dead_band.dwData            = dead_zone;
  111.   lpdijoy->SetProperty(DIPROP_DEADZONE,&dead_band.diph);
  112.   dead_band.diph.dwSize       = sizeof(dead_band);
  113.   dead_band.diph.dwHeaderSize = sizeof(dead_band.diph);
  114.   dead_band.diph.dwObj        = DIJOFS_Y;
  115.   dead_band.diph.dwHow        = DIPH_BYOFFSET;
  116.   dead_band.dwData            = dead_zone;
  117.   lpdijoy->SetProperty(DIPROP_DEADZONE,&dead_band.diph);
  118.   //获取游戏杆设备
  119.   if (lpdijoy->Acquire()!=DI_OK)
  120.     return(0);
  121.   //设置标记
  122.   joystick_found = 1;
  123.   return(1);
  124.       
  125. }
  126. int DInput_Init_Mouse(void)
  127. {
  128.   //初始化鼠标设备
  129.   if (lpdi->CreateDevice(GUID_SysMouse, &lpdimouse, NULL)!=DI_OK)
  130.     return(0);
  131.   if (lpdimouse->SetCooperativeLevel(main_window_handle, 
  132.                        DISCL_NONEXCLUSIVE | DISCL_BACKGROUND)!=DI_OK)
  133.     return(0);
  134.   if (lpdimouse->SetDataFormat(&c_dfDIMouse)!=DI_OK)
  135.     return(0);
  136.   if (lpdimouse->Acquire()!=DI_OK)
  137.     return(0);
  138.   return(1);
  139. int DInput_Init_Keyboard(void)
  140. {
  141.   //初始化键盘设备
  142.   if (lpdi->CreateDevice(GUID_SysKeyboard, &lpdikey, NULL)!=DI_OK)
  143.     return(0);
  144.   if (lpdikey->SetCooperativeLevel(main_window_handle, 
  145.                  DISCL_NONEXCLUSIVE | DISCL_BACKGROUND)!=DI_OK)
  146.     return(0);
  147.   if (lpdikey->SetDataFormat(&c_dfDIKeyboard)!=DI_OK)
  148.     return(0);
  149.   if (lpdikey->Acquire()!=DI_OK)
  150.     return(0);
  151.   return(1);
  152. int DInput_Read_Joystick(void)
  153. {
  154.   // 读游戏杆设备
  155.   if (!joystick_found)
  156.     return(0);
  157.   if (lpdijoy)
  158.    {
  159.      // 轮询游戏杆设备  
  160.      if (lpdijoy->Poll()!=DI_OK)
  161.         return(0);
  162.     if (lpdijoy->GetDeviceState(sizeof(DIJOYSTATE), (LPVOID)&joy_state)!=DI_OK)
  163.         return(0);
  164.   }
  165.   else
  166.   {
  167.     memset(&joy_state,0,sizeof(joy_state));
  168.     return(0);
  169.   } 
  170.   return(1);
  171. }
  172. int DInput_Read_Mouse(void)
  173. {
  174.   //读鼠标设备
  175.   if (lpdimouse)    
  176.    {
  177.      if (lpdimouse->GetDeviceState(sizeof(DIMOUSESTATE), (LPVOID)&mouse_state)!=DI_OK)
  178.         return(0);
  179.    }
  180.   else
  181.    {
  182.      memset(&mouse_state,0,sizeof(mouse_state));
  183.      return(0);
  184.    } 
  185.   return(1);
  186. int DInput_Read_Keyboard(void)
  187. {
  188.   //读键盘设备
  189.   if (lpdikey)
  190.    {
  191.      if (lpdikey->GetDeviceState(256, (LPVOID)keyboard_state)!=DI_OK)
  192.         return(0);
  193.    }
  194.   else
  195.    {
  196.      memset(keyboard_state,0,sizeof(keyboard_state));
  197.      return(0);
  198.    } 
  199.   return(1);
  200. void DInput_Release_Joystick(void)
  201. {
  202.   //归还/释放游戏杆设备资源
  203.   if (lpdijoy)
  204.    {    
  205.       lpdijoy->Unacquire();
  206.       lpdijoy->Release();
  207.    } 
  208. void DInput_Release_Mouse(void)
  209. {
  210.   //归还/释放鼠标资源
  211.   if (lpdimouse)
  212.    {    
  213.       lpdimouse->Unacquire();
  214.       lpdimouse->Release();
  215.    }
  216. void DInput_Release_Keyboard(void)
  217. {
  218.   //归还/释放键盘资源
  219.   
  220.   if (lpdikey)
  221.    {
  222.       lpdikey->Unacquire();
  223.       lpdikey->Release();
  224.    } 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值