www.pudn.com > T3D-3.rar > t3dlib2.cpp
// T3DLIB2.CPP - Game Engine Part II // INCLUDES /////////////////////////////////////////////// #define WIN32_LEAN_AND_MEAN // #define INITGUID #include// include important windows stuff #include #include #include #include // include important C/C++ stuff #include #include #include #include #include #include #include #include #include #include #include // directX includes #include #include "T3DLIB1.H" #include "T3DLIB2.H" // DEFINES //////////////////////////////////////////////// // TYPES ////////////////////////////////////////////////// // PROTOTYPES ///////////////////////////////////////////// // EXTERNALS ///////////////////////////////////////////// extern HWND main_window_handle; // access to main window handle in main module extern HINSTANCE main_instance; // save the instance // GLOBALS //////////////////////////////////////////////// // directinput globals LPDIRECTINPUT8 lpdi = NULL; // dinput object LPDIRECTINPUTDEVICE8 lpdikey = NULL; // dinput keyboard LPDIRECTINPUTDEVICE8 lpdimouse = NULL; // dinput mouse LPDIRECTINPUTDEVICE8 lpdijoy = NULL; // dinput joystick GUID joystickGUID; // guid for main joystick char joyname[80]; // name of joystick // these contain the target records for all di input packets UCHAR keyboard_state[256]; // contains keyboard state table DIMOUSESTATE mouse_state; // contains state of mouse DIJOYSTATE joy_state; // contains state of joystick int joystick_found = 0; // tracks if joystick was found and inited // FUNCTIONS ////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// BOOL CALLBACK DInput_Enum_Joysticks(LPCDIDEVICEINSTANCE lpddi, LPVOID guid_ptr) { // this function enumerates the joysticks, but // stops at the first one and returns the // instance guid of it, so we can create it *(GUID*)guid_ptr = lpddi->guidInstance; // copy name into global strcpy(joyname, (char *)lpddi->tszProductName); // stop enumeration after one iteration return(DIENUM_STOP); } // end DInput_Enum_Joysticks ////////////////////////////////////////////////////////////////////////////// int DInput_Init(void) { // this function initializes directinput if (FAILED(DirectInput8Create(main_instance, DIRECTINPUT_VERSION, IID_IDirectInput8, (void **)&lpdi,NULL))) return(0); // return success return(1); } // end DInput_Init /////////////////////////////////////////////////////////// void DInput_Shutdown(void) { // this function shuts down directinput if (lpdi) lpdi->Release(); } // end DInput_Shutdown /////////////////////////////////////////////////////////// int DInput_Init_Joystick(int min_x, int max_x, int min_y, int max_y, int dead_zone) { // this function initializes the joystick, it allows you to set // the minimum and maximum x-y ranges // first find the fucking GUID of your particular joystick lpdi->EnumDevices(DI8DEVCLASS_GAMECTRL, DInput_Enum_Joysticks, &joystickGUID, DIEDFL_ATTACHEDONLY); // create a temporary IDIRECTINPUTDEVICE (1.0) interface, so we query for 2 LPDIRECTINPUTDEVICE lpdijoy_temp = NULL; if (lpdi->CreateDevice(joystickGUID, &lpdijoy, NULL)!=DI_OK) return(0); // set cooperation level if (lpdijoy->SetCooperativeLevel(main_window_handle, DISCL_NONEXCLUSIVE | DISCL_BACKGROUND)!=DI_OK) return(0); // set data format if (lpdijoy->SetDataFormat(&c_dfDIJoystick)!=DI_OK) return(0); // set the range of the joystick DIPROPRANGE joy_axis_range; // first x axis joy_axis_range.lMin = min_x; joy_axis_range.lMax = max_x; joy_axis_range.diph.dwSize = sizeof(DIPROPRANGE); joy_axis_range.diph.dwHeaderSize = sizeof(DIPROPHEADER); joy_axis_range.diph.dwObj = DIJOFS_X; joy_axis_range.diph.dwHow = DIPH_BYOFFSET; lpdijoy->SetProperty(DIPROP_RANGE,&joy_axis_range.diph); // now y-axis joy_axis_range.lMin = min_y; joy_axis_range.lMax = max_y; joy_axis_range.diph.dwSize = sizeof(DIPROPRANGE); joy_axis_range.diph.dwHeaderSize = sizeof(DIPROPHEADER); joy_axis_range.diph.dwObj = DIJOFS_Y; joy_axis_range.diph.dwHow = DIPH_BYOFFSET; lpdijoy->SetProperty(DIPROP_RANGE,&joy_axis_range.diph); // and now the dead band DIPROPDWORD dead_band; // here's our property word // scale dead zone by 100 dead_zone*=100; dead_band.diph.dwSize = sizeof(dead_band); dead_band.diph.dwHeaderSize = sizeof(dead_band.diph); dead_band.diph.dwObj = DIJOFS_X; dead_band.diph.dwHow = DIPH_BYOFFSET; // deadband will be used on both sides of the range +/- dead_band.dwData = dead_zone; // finally set the property lpdijoy->SetProperty(DIPROP_DEADZONE,&dead_band.diph); dead_band.diph.dwSize = sizeof(dead_band); dead_band.diph.dwHeaderSize = sizeof(dead_band.diph); dead_band.diph.dwObj = DIJOFS_Y; dead_band.diph.dwHow = DIPH_BYOFFSET; // deadband will be used on both sides of the range +/- dead_band.dwData = dead_zone; // finally set the property lpdijoy->SetProperty(DIPROP_DEADZONE,&dead_band.diph); // acquire the joystick if (lpdijoy->Acquire()!=DI_OK) return(0); // set found flag joystick_found = 1; // return success return(1); } // end DInput_Init_Joystick /////////////////////////////////////////////////////////// int DInput_Init_Mouse(void) { // this function intializes the mouse // create a mouse device if (lpdi->CreateDevice(GUID_SysMouse, &lpdimouse, NULL)!=DI_OK) return(0); // set cooperation level // change to EXCLUSIVE FORGROUND for better control if (lpdimouse->SetCooperativeLevel(main_window_handle, DISCL_NONEXCLUSIVE | DISCL_BACKGROUND)!=DI_OK) return(0); // set data format if (lpdimouse->SetDataFormat(&c_dfDIMouse)!=DI_OK) return(0); // acquire the mouse if (lpdimouse->Acquire()!=DI_OK) return(0); // return success return(1); } // end DInput_Init_Mouse /////////////////////////////////////////////////////////// int DInput_Init_Keyboard(void) { // this function initializes the keyboard device // create the keyboard device if (lpdi->CreateDevice(GUID_SysKeyboard, &lpdikey, NULL)!=DI_OK) return(0); // set cooperation level if (lpdikey->SetCooperativeLevel(main_window_handle, DISCL_NONEXCLUSIVE | DISCL_BACKGROUND)!=DI_OK) return(0); // set data format if (lpdikey->SetDataFormat(&c_dfDIKeyboard)!=DI_OK) return(0); // acquire the keyboard if (lpdikey->Acquire()!=DI_OK) return(0); // return success return(1); } // end DInput_Init_Keyboard /////////////////////////////////////////////////////////// int DInput_Read_Joystick(void) { // this function reads the joystick state // make sure the joystick was initialized if (!joystick_found) return(0); if (lpdijoy) { // this is needed for joysticks only if (lpdijoy->Poll()!=DI_OK) return(0); if (lpdijoy->GetDeviceState(sizeof(DIJOYSTATE), (LPVOID)&joy_state)!=DI_OK) return(0); } else { // joystick isn't plugged in, zero out state memset(&joy_state,0,sizeof(joy_state)); // return error return(0); } // end else // return sucess return(1); } // end DInput_Read_Joystick /////////////////////////////////////////////////////////// int DInput_Read_Mouse(void) { // this function reads the mouse state if (lpdimouse) { if (lpdimouse->GetDeviceState(sizeof(DIMOUSESTATE), (LPVOID)&mouse_state)!=DI_OK) return(0); } else { // mouse isn't plugged in, zero out state memset(&mouse_state,0,sizeof(mouse_state)); // return error return(0); } // end else // return sucess return(1); } // end DInput_Read_Mouse /////////////////////////////////////////////////////////// int DInput_Read_Keyboard(void) { // this function reads the state of the keyboard if (lpdikey) { if (lpdikey->GetDeviceState(256, (LPVOID)keyboard_state)!=DI_OK) return(0); } else { // keyboard isn't plugged in, zero out state memset(keyboard_state,0,sizeof(keyboard_state)); // return error return(0); } // end else // return sucess return(1); } // end DInput_Read_Keyboard /////////////////////////////////////////////////////////// void DInput_Release_Joystick(void) { // this function unacquires and releases the joystick if (lpdijoy) { lpdijoy->Unacquire(); lpdijoy->Release(); } // end if } // end DInput_Release_Joystick /////////////////////////////////////////////////////////// void DInput_Release_Mouse(void) { // this function unacquires and releases the mouse if (lpdimouse) { lpdimouse->Unacquire(); lpdimouse->Release(); } // end if } // end DInput_Release_Mouse /////////////////////////////////////////////////////////// void DInput_Release_Keyboard(void) { // this function unacquires and releases the keyboard if (lpdikey) { lpdikey->Unacquire(); lpdikey->Release(); } // end if } // end DInput_Release_Keyboard