DInput库文件部分
- /*2008.10.1
- T3D图形库
- ——<<windows游戏
- 编程大师技巧>>
- */
- // DI_lib.cpp
- // INCLUDES ///
- #define WIN32_LEAN_AND_MEAN
- #include <windows.h> // include important windows stuff
- #include <windowsx.h>
- #include <mmsystem.h>
- #include <objbase.h> // 它提供一些系统默认GUID 如GUID_SysMouse
- #include <iostream.h> // include important C/C++ stuff
- #include <conio.h>
- #include <stdlib.h>
- #include <malloc.h>
- #include <memory.h>
- #include <string.h>
- #include <stdarg.h>
- #include <stdio.h>
- #include <math.h>
- #include <io.h>
- #include <fcntl.h>
- #include <ddraw.h> // directX includes
- #include <dinput.h>
- //#include "DDraw_lib.h"
- #include "DI_lib.h"
- // EXTERNALS /
- //extern HWND main_window_handle;
- //extern HINSTANCE main_instance;
- // GLOBALS
- // directinput全局变量
- 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
- UCHAR keyboard_state[256]; // 包含键盘消息
- DIMOUSESTATE mouse_state; // 包含鼠标状态
- DIJOYSTATE joy_state; // 包含游戏杆状态
- int joystick_found = 0; // 检测游戏杆是否被发现
- // 函数定义 //
- BOOL CALLBACK DInput_Enum_Joysticks(LPCDIDEVICEINSTANCE lpddi,
- LPVOID guid_ptr)
- {
- //这是一个回调函数,当搜索到有游戏杆设备时会调用此函数
- //将检测到的游戏杆设备的GUID赋予调用函数传入的GUID指针
- *(GUID*)guid_ptr = lpddi->guidInstance;
- //保存游戏杆设备名
- strcpy(joyname,(char*)lpddi->tszProductName);
- //找到一个游戏杆设备即停止枚举
- return(DIENUM_STOP);
- }
- int DInput_Init(void)
- {
- //初始化DirectInput
- if (FAILED(DirectInput8Create(main_instance,DIRECTINPUT_VERSION,IID_IDirectInput8,(void**)&lpdi,NULL)))
- return(0);
- return(1);
- }
- void DInput_Shutdown(void)
- {
- //释放DI资源
- if (lpdi)
- lpdi->Release();
- }
- int DInput_Init_Joystick(int min_x/* =-256 */, int max_x/* =256 */,
- int min_y/* =-256 */, int max_y/* =256 */,
- int dead_zone /* = 10 */)
- {
- //初始化游戏杆
- //寻找游戏杆设备
- lpdi->EnumDevices(DI8DEVCLASS_GAMECTRL,
- DInput_Enum_Joysticks, //回调函数
- &joystickGUID, //传入回调函数的GUID变量地址
- DIEDFL_ATTACHEDONLY);
- //创建游戏杆设备
- if (lpdi->CreateDevice(joystickGUID,&lpdijoy,NULL)!=DI_OK)
- return(0);
- if (lpdijoy->SetCooperativeLevel(main_window_handle,
- DISCL_NONEXCLUSIVE | DISCL_BACKGROUND)!=DI_OK)
- return(0);
- if (lpdijoy->SetDataFormat(&c_dfDIJoystick)!=DI_OK)
- return(0);
- //设置 X/Y方向摇杆 范围
- DIPROPRANGE joy_axis_range;
- 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);
- 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);
- //设置死区 X/Y 方向的值(取0~10000)
- DIPROPDWORD dead_band;
- 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;
- dead_band.dwData = dead_zone;
- 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;
- dead_band.dwData = dead_zone;
- lpdijoy->SetProperty(DIPROP_DEADZONE,&dead_band.diph);
- //获取游戏杆设备
- if (lpdijoy->Acquire()!=DI_OK)
- return(0);
- //设置标记
- joystick_found = 1;
- return(1);
- }
- int DInput_Init_Mouse(void)
- {
- //初始化鼠标设备
- if (lpdi->CreateDevice(GUID_SysMouse, &lpdimouse, NULL)!=DI_OK)
- return(0);
- if (lpdimouse->SetCooperativeLevel(main_window_handle,
- DISCL_NONEXCLUSIVE | DISCL_BACKGROUND)!=DI_OK)
- return(0);
- if (lpdimouse->SetDataFormat(&c_dfDIMouse)!=DI_OK)
- return(0);
- if (lpdimouse->Acquire()!=DI_OK)
- return(0);
- return(1);
- }
- int DInput_Init_Keyboard(void)
- {
- //初始化键盘设备
- if (lpdi->CreateDevice(GUID_SysKeyboard, &lpdikey, NULL)!=DI_OK)
- return(0);
- if (lpdikey->SetCooperativeLevel(main_window_handle,
- DISCL_NONEXCLUSIVE | DISCL_BACKGROUND)!=DI_OK)
- return(0);
- if (lpdikey->SetDataFormat(&c_dfDIKeyboard)!=DI_OK)
- return(0);
- if (lpdikey->Acquire()!=DI_OK)
- return(0);
- return(1);
- }
- int DInput_Read_Joystick(void)
- {
- // 读游戏杆设备
- if (!joystick_found)
- return(0);
- if (lpdijoy)
- {
- // 轮询游戏杆设备
- if (lpdijoy->Poll()!=DI_OK)
- return(0);
- if (lpdijoy->GetDeviceState(sizeof(DIJOYSTATE), (LPVOID)&joy_state)!=DI_OK)
- return(0);
- }
- else
- {
- memset(&joy_state,0,sizeof(joy_state));
- return(0);
- }
- return(1);
- }
- int DInput_Read_Mouse(void)
- {
- //读鼠标设备
- if (lpdimouse)
- {
- if (lpdimouse->GetDeviceState(sizeof(DIMOUSESTATE), (LPVOID)&mouse_state)!=DI_OK)
- return(0);
- }
- else
- {
- memset(&mouse_state,0,sizeof(mouse_state));
- return(0);
- }
- return(1);
- }
- int DInput_Read_Keyboard(void)
- {
- //读键盘设备
- if (lpdikey)
- {
- if (lpdikey->GetDeviceState(256, (LPVOID)keyboard_state)!=DI_OK)
- return(0);
- }
- else
- {
- memset(keyboard_state,0,sizeof(keyboard_state));
- return(0);
- }
- return(1);
- }
- void DInput_Release_Joystick(void)
- {
- //归还/释放游戏杆设备资源
- if (lpdijoy)
- {
- lpdijoy->Unacquire();
- lpdijoy->Release();
- }
- }
- void DInput_Release_Mouse(void)
- {
- //归还/释放鼠标资源
- if (lpdimouse)
- {
- lpdimouse->Unacquire();
- lpdimouse->Release();
- }
- }
- void DInput_Release_Keyboard(void)
- {
- //归还/释放键盘资源
- if (lpdikey)
- {
- lpdikey->Unacquire();
- lpdikey->Release();
- }
- }