Posted By

aday on 02/16/11


Tagged

input control mouse keyboard directx Direct


Versions (?)

DirectInput Easy Implementation


 / Published in: C++
 

You have to link to "dinput8.lib" and include SDK folder into your project settings. This code works using DirectX SDK (June 2010). I made it on a Singleton to make the access to it easier. Comments in spanish because I'm spanish. Be happy! :)

  1. ---------------------------------- DirectInput.h -------------------------------------------
  2.  
  3. /* Esto se utilizar���¡ para poder manejar en cualquier programa los eventos de interacci���³n.
  4. Se han puesto en una clase aparte para obtener m���¡s portabilidad de este c���³digo. */
  5.  
  6. /* By Aday Meli���¡n Carrillo for the common knowledge */
  7.  
  8. #define INITGUID
  9. #define DIRECTINPUT_VERSION 0x0800 // Utilizaremos la versi���³n 8 de DirectInput
  10. #include "dinput.h"
  11. #include "Singleton.h"
  12.  
  13. // Definimos macros que nos ayuden a detectar las pulsaciones
  14. #define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
  15. #define KEY_UP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)
  16.  
  17. // Mouse Buttons
  18. #define MOUSE_LEFTBUTTON 0
  19. #define MOUSE_RIGHTBUTTON 1
  20. #define MOUSE_MIDDLEBUTTON 2
  21. #define MOUSE_4BUTTON 3
  22. #define MOUSE_5BUTTON 4
  23. #define MOUSE_6BUTTON 5
  24. #define MOUSE_7BUTTON 6
  25. #define MOUSE_8BUTTON 7
  26.  
  27. // Necesitaremos incluir en el Linker las siguientes librer���­as situadas en el directorio de DirectX:
  28. //"dinput8.lib"
  29. //"dxguid.lib"
  30.  
  31. class ManejadorDirectInput: public Singleton<ManejadorDirectInput> {
  32. private:
  33. // Variables Necesarias
  34. LPDIRECTINPUT8 din; // Puntero a nuestra interfaz DirectInput
  35. // Teclado
  36. LPDIRECTINPUTDEVICE8 dinkeyboard; // Puntero al dispositivo del teclado
  37. BYTE keystate[256]; // El almacenamiento de los estados de las teclas del teclado
  38. // Rat���³n
  39. LPDIRECTINPUTDEVICE8 dinmouse; // Puntero al dispositivo de rat���³n
  40. DIMOUSESTATE mousestate; // Almacenamiento de la informaci���³n del rat���³n
  41. POINT RatonPos;
  42. public:
  43. void initDInput(HINSTANCE hInstance, HWND hWnd); // Inicializamos DirectInput
  44. void detect_input(void); // Obtenemos el estado actual de las entradas
  45. bool MousePressedButton(int Boton); // Obtenemos si el bot���³n pasado por par���¡metro est���¡ pulsado
  46. bool MouseReleasedButton(int Boton); // Obtenemos si el bot���³n pasado por par���¡metro est���¡ suelto
  47. POINT GetMousePosition(void); // Obtenemos la posici���³n absoluta actual del rat���³n
  48. void cleanDInput(void); // Deinicializa DirectInput y libera la memoria
  49. };
  50.  
  51. ---------------------------------- DirectInput.cpp -----------------------------------------
  52.  
  53. #include "DirectInput.h"
  54.  
  55. // Inicializaci���³n de DirectInput
  56. void ManejadorDirectInput::initDInput(HINSTANCE hInstance, HWND hWnd)
  57. {
  58. // Creamos las interfaz DirectInput
  59. DirectInput8Create(hInstance, // Manejador de la aplicaci���³n
  60. DIRECTINPUT_VERSION, // Versi���³n compatible
  61. IID_IDirectInput8, // Versi���³n de la interfaz de DirectInput
  62. (void**)&din, // El puntero a la interfaz
  63. NULL); // Opciones de COM, lo dejaremos a NULL
  64. dinmouse = NULL;
  65. dinkeyboard = NULL;
  66. // Creamos el dispositivo de Teclado
  67. din->CreateDevice(GUID_SysKeyboard, // El ID del teclado por defecto que se est���¡ usando
  68. &dinkeyboard, // El puntero a la interfaz del dispositivo
  69. NULL); // Opciones de COM, lo dejaremos a NULL
  70. // Creamos el dispositivo del rat���³n
  71. din->CreateDevice(GUID_SysMouse,
  72. &dinmouse,
  73. NULL);
  74.  
  75. // Asignamos el formato de datos al formato de datos por defecto
  76. dinkeyboard->SetDataFormat(&c_dfDIKeyboard);
  77. dinmouse->SetDataFormat(&c_dfDIMouse);
  78.  
  79. // Asignamos el control que tendremos en la ventana sobre los dispositivos y su relaci���³n con otras aplicaciones
  80. dinkeyboard->SetCooperativeLevel(hWnd, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND);
  81. dinmouse->SetCooperativeLevel(hWnd, DISCL_NONEXCLUSIVE | DISCL_BACKGROUND);
  82.  
  83. // Obtenemos la posici���³n inicial del rat���³n
  84. GetCursorPos(&RatonPos);
  85. }
  86.  
  87. // Obtenci���³n de datos actuales introducidos.
  88. void ManejadorDirectInput::detect_input(void)
  89. {
  90. // Obtenemos acceso por si no lo tenemos
  91. dinkeyboard->Acquire();
  92. // Obtenemos los datos de entrada y los volcamos en la variable apropiada
  93. dinkeyboard->GetDeviceState(256, (LPVOID)keystate);
  94.  
  95. dinmouse->Acquire();
  96. dinmouse->GetDeviceState(sizeof(DIMOUSESTATE),(LPVOID)&mousestate);
  97. // Le ponemos l���­mite al movimiento del rat���³n
  98. RECT rc;
  99. GetWindowRect(GetDesktopWindow(), &rc);
  100. if(RatonPos.x+mousestate.lX < rc.right && RatonPos.x+mousestate.lX > rc.left)RatonPos.x+=mousestate.lX;
  101. if(RatonPos.y+mousestate.lY < rc.bottom && RatonPos.y+mousestate.lY > rc.top)RatonPos.y+=mousestate.lY;
  102. }
  103.  
  104. bool ManejadorDirectInput::MousePressedButton(int Boton){
  105. return mousestate.rgbButtons[Boton];
  106. }
  107. bool ManejadorDirectInput::MouseReleasedButton(int Boton){
  108. return !mousestate.rgbButtons[Boton];
  109. }
  110.  
  111. POINT ManejadorDirectInput::GetMousePosition(void){
  112. return RatonPos;
  113. }
  114. // Deinicializamos DirectInput.
  115. void ManejadorDirectInput::cleanDInput(void)
  116. {
  117. dinkeyboard->Unacquire(); // Nos aseguramos que el teclado no est���© en uso
  118. dinmouse->Unacquire(); // Nos aseguramos que el teclado no est���¡ en uso
  119. din->Release(); // Cerramos DirectInput antes de finalizar
  120. }

Report this snippet  

You need to login to post a comment.