t3dlib2.cpp
上传用户:husern
上传日期:2018-01-20
资源大小:42486k
文件大小:9k
源码类别:

游戏

开发平台:

Visual C++

  1. // T3DLIB2.CPP - Game Engine Part II
  2.  
  3. // INCLUDES ///////////////////////////////////////////////
  4. #define WIN32_LEAN_AND_MEAN  
  5. // #define INITGUID
  6. #include <windows.h>   // include important windows stuff
  7. #include <windowsx.h> 
  8. #include <mmsystem.h>
  9. #include <objbase.h>
  10. #include <iostream.h> // include important C/C++ stuff
  11. #include <conio.h>
  12. #include <stdlib.h>
  13. #include <malloc.h>
  14. #include <memory.h>
  15. #include <string.h>
  16. #include <stdarg.h>
  17. #include <stdio.h>
  18. #include <math.h>
  19. #include <io.h>
  20. #include <fcntl.h>
  21. #include <ddraw.h>  // directX includes
  22. #include <dinput.h>
  23. #include "T3DLIB1.H"
  24. #include "T3DLIB2.H"
  25. // DEFINES ////////////////////////////////////////////////
  26. // TYPES //////////////////////////////////////////////////
  27. // PROTOTYPES /////////////////////////////////////////////
  28. // EXTERNALS /////////////////////////////////////////////
  29. extern HWND main_window_handle;     // access to main window handle in main module
  30. extern HINSTANCE main_instance; // save the instance
  31. // GLOBALS ////////////////////////////////////////////////
  32. // directinput globals
  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. // these contain the target records for all di input packets
  40. UCHAR keyboard_state[256]; // contains keyboard state table
  41. DIMOUSESTATE mouse_state;  // contains state of mouse
  42. DIJOYSTATE joy_state;      // contains state of joystick
  43. int joystick_found = 0;    // tracks if joystick was found and inited
  44. // FUNCTIONS //////////////////////////////////////////////
  45. //////////////////////////////////////////////////////////////////////////////
  46. BOOL CALLBACK DInput_Enum_Joysticks(LPCDIDEVICEINSTANCE lpddi,
  47. LPVOID guid_ptr) 
  48. {
  49. // this function enumerates the joysticks, but
  50. // stops at the first one and returns the
  51. // instance guid of it, so we can create it
  52. *(GUID*)guid_ptr = lpddi->guidInstance; 
  53. // copy name into global
  54. strcpy(joyname, (char *)lpddi->tszProductName);
  55. // stop enumeration after one iteration
  56. return(DIENUM_STOP);
  57. } // end DInput_Enum_Joysticks
  58. //////////////////////////////////////////////////////////////////////////////
  59. int DInput_Init(void)
  60. {
  61. // this function initializes directinput
  62. if (FAILED(DirectInput8Create(main_instance, DIRECTINPUT_VERSION, IID_IDirectInput8, (void **)&lpdi,NULL)))
  63.    return(0);
  64. // return success
  65. return(1);
  66. } // end DInput_Init
  67. ///////////////////////////////////////////////////////////
  68. void DInput_Shutdown(void)
  69. {
  70. // this function shuts down directinput
  71. if (lpdi)
  72.    lpdi->Release();
  73. } // end DInput_Shutdown
  74. ///////////////////////////////////////////////////////////
  75. int DInput_Init_Joystick(int min_x, int max_x, int min_y, int max_y, int dead_zone)
  76. {
  77. // this function initializes the joystick, it allows you to set
  78. // the minimum and maximum x-y ranges 
  79. // first find the fucking GUID of your particular joystick
  80. lpdi->EnumDevices(DI8DEVCLASS_GAMECTRL, 
  81.                   DInput_Enum_Joysticks, 
  82.                   &joystickGUID, 
  83.                   DIEDFL_ATTACHEDONLY); 
  84. // create a temporary IDIRECTINPUTDEVICE (1.0) interface, so we query for 2
  85. LPDIRECTINPUTDEVICE lpdijoy_temp = NULL;
  86. if (lpdi->CreateDevice(joystickGUID, &lpdijoy, NULL)!=DI_OK)
  87.    return(0);
  88. // set cooperation level
  89. if (lpdijoy->SetCooperativeLevel(main_window_handle, 
  90.                  DISCL_NONEXCLUSIVE | DISCL_BACKGROUND)!=DI_OK)
  91.    return(0);
  92. // set data format
  93. if (lpdijoy->SetDataFormat(&c_dfDIJoystick)!=DI_OK)
  94.    return(0);
  95. // set the range of the joystick
  96. DIPROPRANGE joy_axis_range;
  97. // first x axis
  98. joy_axis_range.lMin = min_x;
  99. joy_axis_range.lMax = max_x;
  100. joy_axis_range.diph.dwSize       = sizeof(DIPROPRANGE); 
  101. joy_axis_range.diph.dwHeaderSize = sizeof(DIPROPHEADER); 
  102. joy_axis_range.diph.dwObj        = DIJOFS_X;
  103. joy_axis_range.diph.dwHow        = DIPH_BYOFFSET;
  104. lpdijoy->SetProperty(DIPROP_RANGE,&joy_axis_range.diph);
  105. // now y-axis
  106. joy_axis_range.lMin = min_y;
  107. joy_axis_range.lMax = max_y;
  108. joy_axis_range.diph.dwSize       = sizeof(DIPROPRANGE); 
  109. joy_axis_range.diph.dwHeaderSize = sizeof(DIPROPHEADER); 
  110. joy_axis_range.diph.dwObj        = DIJOFS_Y;
  111. joy_axis_range.diph.dwHow        = DIPH_BYOFFSET;
  112. lpdijoy->SetProperty(DIPROP_RANGE,&joy_axis_range.diph);
  113. // and now the dead band
  114. DIPROPDWORD dead_band; // here's our property word
  115. // scale dead zone by 100
  116. dead_zone*=100;
  117. dead_band.diph.dwSize       = sizeof(dead_band);
  118. dead_band.diph.dwHeaderSize = sizeof(dead_band.diph);
  119. dead_band.diph.dwObj        = DIJOFS_X;
  120. dead_band.diph.dwHow        = DIPH_BYOFFSET;
  121. // deadband will be used on both sides of the range +/-
  122. dead_band.dwData            = dead_zone;
  123. // finally set the property
  124. lpdijoy->SetProperty(DIPROP_DEADZONE,&dead_band.diph);
  125. dead_band.diph.dwSize       = sizeof(dead_band);
  126. dead_band.diph.dwHeaderSize = sizeof(dead_band.diph);
  127. dead_band.diph.dwObj        = DIJOFS_Y;
  128. dead_band.diph.dwHow        = DIPH_BYOFFSET;
  129. // deadband will be used on both sides of the range +/-
  130. dead_band.dwData            = dead_zone;
  131. // finally set the property
  132. lpdijoy->SetProperty(DIPROP_DEADZONE,&dead_band.diph);
  133. // acquire the joystick
  134. if (lpdijoy->Acquire()!=DI_OK)
  135.    return(0);
  136. // set found flag
  137. joystick_found = 1;
  138. // return success
  139. return(1);
  140. } // end DInput_Init_Joystick
  141. ///////////////////////////////////////////////////////////
  142. int DInput_Init_Mouse(void)
  143. {
  144. // this function intializes the mouse
  145. // create a mouse device 
  146. if (lpdi->CreateDevice(GUID_SysMouse, &lpdimouse, NULL)!=DI_OK)
  147.    return(0);
  148. // set cooperation level
  149. // change to EXCLUSIVE FORGROUND for better control
  150. if (lpdimouse->SetCooperativeLevel(main_window_handle, 
  151.                        DISCL_NONEXCLUSIVE | DISCL_BACKGROUND)!=DI_OK)
  152.    return(0);
  153. // set data format
  154. if (lpdimouse->SetDataFormat(&c_dfDIMouse)!=DI_OK)
  155.    return(0);
  156. // acquire the mouse
  157. if (lpdimouse->Acquire()!=DI_OK)
  158.    return(0);
  159. // return success
  160. return(1);
  161. } // end DInput_Init_Mouse
  162. ///////////////////////////////////////////////////////////
  163. int DInput_Init_Keyboard(void)
  164. {
  165. // this function initializes the keyboard device
  166. // create the keyboard device  
  167. if (lpdi->CreateDevice(GUID_SysKeyboard, &lpdikey, NULL)!=DI_OK)
  168.    return(0);
  169. // set cooperation level
  170. if (lpdikey->SetCooperativeLevel(main_window_handle, 
  171.                  DISCL_NONEXCLUSIVE | DISCL_BACKGROUND)!=DI_OK)
  172.     return(0);
  173. // set data format
  174. if (lpdikey->SetDataFormat(&c_dfDIKeyboard)!=DI_OK)
  175.    return(0);
  176. // acquire the keyboard
  177. if (lpdikey->Acquire()!=DI_OK)
  178.    return(0);
  179. // return success
  180. return(1);
  181. } // end DInput_Init_Keyboard
  182. ///////////////////////////////////////////////////////////
  183. int DInput_Read_Joystick(void)
  184. {
  185. // this function reads the joystick state
  186. // make sure the joystick was initialized
  187. if (!joystick_found)
  188.    return(0);
  189. if (lpdijoy)
  190.     {
  191.     // this is needed for joysticks only    
  192.     if (lpdijoy->Poll()!=DI_OK)
  193.         return(0);
  194.     if (lpdijoy->GetDeviceState(sizeof(DIJOYSTATE), (LPVOID)&joy_state)!=DI_OK)
  195.         return(0);
  196.     }
  197. else
  198.     {
  199.     // joystick isn't plugged in, zero out state
  200.     memset(&joy_state,0,sizeof(joy_state));
  201.     // return error
  202.     return(0);
  203.     } // end else
  204. // return sucess
  205. return(1);
  206. } // end DInput_Read_Joystick
  207. ///////////////////////////////////////////////////////////
  208. int DInput_Read_Mouse(void)
  209. {
  210. // this function reads  the mouse state
  211. if (lpdimouse)    
  212.     {
  213.     if (lpdimouse->GetDeviceState(sizeof(DIMOUSESTATE), (LPVOID)&mouse_state)!=DI_OK)
  214.         return(0);
  215.     }
  216. else
  217.     {
  218.     // mouse isn't plugged in, zero out state
  219.     memset(&mouse_state,0,sizeof(mouse_state));
  220.     // return error
  221.     return(0);
  222.     } // end else
  223. // return sucess
  224. return(1);
  225. } // end DInput_Read_Mouse
  226. ///////////////////////////////////////////////////////////
  227. int DInput_Read_Keyboard(void)
  228. {
  229. // this function reads the state of the keyboard
  230. if (lpdikey)
  231.     {
  232.     if (lpdikey->GetDeviceState(256, (LPVOID)keyboard_state)!=DI_OK)
  233.        return(0);
  234.     }
  235. else
  236.     {
  237.     // keyboard isn't plugged in, zero out state
  238.     memset(keyboard_state,0,sizeof(keyboard_state));
  239.     // return error
  240.     return(0);
  241.     } // end else
  242. // return sucess
  243. return(1);
  244. } // end DInput_Read_Keyboard
  245. ///////////////////////////////////////////////////////////
  246. void DInput_Release_Joystick(void)
  247. {
  248. // this function unacquires and releases the joystick
  249. if (lpdijoy)
  250.     {    
  251.     lpdijoy->Unacquire();
  252.     lpdijoy->Release();
  253.     } // end if
  254. } // end DInput_Release_Joystick
  255. ///////////////////////////////////////////////////////////
  256. void DInput_Release_Mouse(void)
  257. {
  258. // this function unacquires and releases the mouse
  259. if (lpdimouse)
  260.     {    
  261.     lpdimouse->Unacquire();
  262.     lpdimouse->Release();
  263.     } // end if
  264. } // end DInput_Release_Mouse
  265. ///////////////////////////////////////////////////////////
  266. void DInput_Release_Keyboard(void)
  267. {
  268. // this function unacquires and releases the keyboard
  269. if (lpdikey)
  270.     {
  271.     lpdikey->Unacquire();
  272.     lpdikey->Release();
  273.     } // end if
  274. } // end DInput_Release_Keyboard