Environment: VC6
Requires: DirectX 8 SDK
Use this class to setup and handle input from keyboard, mouse, and one joystick.
Instructions(DI only):
- Derive a class from CDirectInput8
- Override the input processing functions for each device used: HRESULT
ProcessMouse(); HRESULT ProcessKB(); HRESULT ProcessJoy();(Don’t forget to
call base function at the beginning of each function.) - Call "InitDI(HWND hWnd, HINSTANCE hInstance, DWORD ToUse)"
- The "ToUse" can take any combination of "USEMOUSE",
"USEKEYBOARD", "USEJOYSTICK" flags depending on what
devices you want to use
Instructions(Used in conjunction with D3D8 Framework):
- Perform all steps above
- Call "HRESULT InitDeviceObjects(LPDIRECT3DDEVICE8 pd3dDevice, TCHAR* pCursorFile =
NULL/*Cursor image file*/)" in "InitDeviceObjects" of derived
framework class - Call "HRESULT DrawMouse(LPDIRECT3DDEVICE8 pd3dDevice)" in
"Render" of derived framework class - Call "HRESULT DeleteDeviceObjects() in "DeleteDeviceObjects"
of derived framework class - Call "HRESULT InvalidateDeviceObjects() in "InvalidateDeviceObjects"
of derived framework class - Call "HRESULT RestoreDeviceObjects(LPDIRECT3DDEVICE8 pd3dDevice) in
"RestoreDeviceObjects" of derived framework class
Call ProcessMouse, ProcessKB. and/or ProcessJoy in each render loop to poll
each device
Use m_js, m_MouseState and buffer members to access joy, mouse, and
keyboard data respectively
EDIT THE CODE AS YOU NEED. NO RESTRICTIONS
Definitions (Not including implementation):
#define KEYDOWN(name, key) (name[key] & 0x80) #define KEYUP(name, key) (!(name[key] & 0x80)) #define USEKEYBOARD 0x00000001L #define USEMOUSE 0x00000002L #define USEJOYSTICK 0x00000004L //////////////////////////////////////////////////////////// //Cursor vertex structure for Direct3D struct CV2D_T1D { D3DXVECTOR4 p; DWORD diffuse; float tu; float tv; }; #define D3DFVF_CV2D_T1D (D3DFVF_XYZRHW|D3DFVF_DIFFUSE|D3DFVF_TEX0) inline CV2D_T1D InitCV2D_T1D( D3DXVECTOR4 p, D3DCOLOR diffuse, float tu, float tv) { CV2D_T1D v; v.p = p; v.diffuse = diffuse; v.tu = tu; v.tv = tv; return v; } //////////////////////////////////////////////////////////// class CDirectInput8 { public: //Load cursor tex from resource //Set cursor hot spot void SetHotSpot(POINT hspot); //8 Element Array, TRUE if Button [n] is up BOOL* m_bMouseUp; //Mouse Position POINT* m_pMousePos; //Cursor HotSpot POINT* m_pHotSpot; //DI Device Objects LPDIRECTINPUTDEVICE8 m_pDIJoy; LPDIRECTINPUTDEVICE8 m_pDIKeybrd; LPDIRECTINPUTDEVICE8 m_pDIMouse; //Device State Buffers DIJOYSTATE2 m_js; DIMOUSESTATE2 m_MouseState; char buffer[256]; DWORD m_dwElements; //DI Object LPDIRECTINPUT8 m_pDI; //Cursor Vertex Buffer LPDIRECT3DVERTEXBUFFER8 m_pVB; //Cursor Texture LPDIRECT3DTEXTURE8 m_pCursorTex; //DI Device Capabilities DIDEVCAPS m_DIDevCaps; //Initialize Direct Input HRESULT InitDI(HWND hWnd, HINSTANCE hInstance, DWORD ToUse); //Overridable Input Processing Methods virtual HRESULT ProcessMouse(); virtual HRESULT ProcessKB(); virtual HRESULT ProcessJoy(); //Check if Mouse Buttons Up BOOL MButtonUp(BYTE button); BOOL AllMouseUp(); //Release and Delete DI Objects void DIShutdown(); //Required for D3D Framework HRESULT InitDeviceObjects( LPDIRECT3DDEVICE8 pd3dDevice, TCHAR* pCursorFile = NULL); HRESULT DrawMouse(LPDIRECT3DDEVICE8 pd3dDevice); HRESULT DeleteDeviceObjects(); HRESULT InvalidateDeviceObjects(); HRESULT RestoreDeviceObjects(LPDIRECT3DDEVICE8 pd3dDevice); //Construction/Destruction CDirectInput8(); virtual ~CDirectInput8(); protected: //Mouse Handle HANDLE m_hMouse; HRESULT hr; private:
//Joystick callbacks friend BOOL __stdcall EnumAxesCallback( const DIDEVICEOBJECTINSTANCE* pdidoi, VOID* pContext ); friend BOOL __stdcall EnumJoysticksCallback( const DIDEVICEINSTANCE* pdidInstance, VOID* pContext ); }; //Global CDirectInput8 Instance extern CDirectInput8* g_pDI8;