|
|
这原先是昨天晚上我改了好久, 也不能让它支持两个手柄, 不知道是哪个关键代码错了. 其实有这方面经验的人只要稍稍指导一下就可以了, 帮帮我好不好?
比如要两个手柄, 是要有两个手柄的GUID呢, 还是要一个? 等等...
无论怎么写, 都不能让另外一个手柄好用...
我不想让你们看令人头疼的海量代码, 我只列出了部分关键代码..
这是照windows 2D游戏编程大师改的. 粘到下面格式就变得非常诡异了....
#include "GameConsole.h"
// GLOBALS ////////////////////////////////////////////////
extern char buffer[80]; // used to print text
extern HWND main_window_handle; // globally track main window
extern int window_closed; // tracks if window is closed
extern HINSTANCE main_instance; // globally track hinstance
// directinput globals
LPDIRECTINPUT8 lpdi = NULL; // dinput object
LPDIRECTINPUTDEVICE8 lpdikey = NULL; // dinput keyboard
LPDIRECTINPUTDEVICE8 lpdimouse = NULL; // dinput mouse
LPDIRECTINPUTDEVICE8 lpdijoya = NULL; // dinput joystick a
LPDIRECTINPUTDEVICE8 lpdijoyb = NULL; // dinput joystick b
GUID joystickaGUID; // guid for main joystick
GUID joystickbGUID; // guid for slave joystick
// 这步昨天晚上就感觉出好像错了...
char joyname[80]; // name of joystick
// these contain the target records for all di input packets
DIJOYSTATE joya_state; // contains state of joystick a
DIJOYSTATE joyb_state; // contains state of joystick b
// demo globals
/* * * * * * * * * * * * * * * * * * * * * * * *
* WIN T2D GAME PROGRAMMING CONSOLE FUNCTIONS *
* * * * * * * * * * * * * * * * * * * * * * * */
BOOL CALLBACK DI_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 DI_Enum_Joysticks
// GAME PROGRAMMING CONSOLE FUNCTIONS ////////////////
int Game_Init(void *parms, int num_parms)
{
int index; // looping var
char filename[80]; // used to build up files names
// joystick creation section ////////////////////////////////
// first create the direct input object
if ( DirectInput8Create( main_instance, DIRECTINPUT_VERSION,
IID_IDirectInput8,
(void **)&lpdi, NULL ) != DI_OK )
return( 0 );
// 是要这么弄两次么?
lpdi->EnumDevices( DI8DEVCLASS_GAMECTRL, DI_Enum_Joysticks,
&joystickaGUID,
DIEDFL_ATTACHEDONLY );
lpdi->EnumDevices( DI8DEVCLASS_GAMECTRL,
DI_Enum_Joysticks, &joystickbGUID,
DIEDFL_ATTACHEDONLY );
if ( lpdi->CreateDevice( joystickaGUID, &lpdijoya, NULL ) != DI_OK ) return( 0 );
if ( lpdi->CreateDevice( joystickaGUID, &lpdijoyb, NULL ) != DI_OK ) return( 0 );
// 如果第二方程的第一个参数我用joystickbGUID 会错的. 但是用joystickaGUID的话..也不对啊..
// set cooperation level
if ( lpdijoya->SetCooperativeLevel( main_window_handle,
DISCL_NONEXCLUSIVE |
DISCL_BACKGROUND ) != DI_OK )
return( 0 );
if ( lpdijoyb->SetCooperativeLevel( main_window_handle, DISCL_NONEXCLUSIVE |
DISCL_BACKGROUND ) != DI_OK )
return( 0 );
// set data format
if ( lpdijoya->SetDataFormat( &c_dfDIJoystick ) != DI_OK ) return( 0 );
if ( lpdijoyb->SetDataFormat( &c_dfDIJoystick ) != DI_OK ) return( 0 );
//////////////////////////////////////////////////////////////////////////
// 好了, 到此为止了, 估计问题就在上面的这些语句里面了, 但是我就是不知道怎么解决....
//////////////////////////////////////////////////////////////////////////
// set the range of the joystick
DIPROPRANGE joy_axis_range;
// first x axis
joy_axis_range.lMin = -1;
joy_axis_range.lMax = 1;
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;
lpdijoya->SetProperty( DIPROP_RANGE, &joy_axis_range.diph );
// first x axis
joy_axis_range.lMin = -2;
joy_axis_range.lMax = 2;
joy_axis_range.diph.dwObj = DIJOFS_X;
joy_axis_range.diph.dwHow = DIPH_BYOFFSET;
lpdijoyb->SetProperty( DIPROP_RANGE, &joy_axis_range.diph );
// now y-axis
joy_axis_range.lMin = -1;
joy_axis_range.lMax = 1;
joy_axis_range.diph.dwObj = DIJOFS_Y;
joy_axis_range.diph.dwHow = DIPH_BYOFFSET;
lpdijoya->SetProperty( DIPROP_RANGE, &joy_axis_range.diph );
lpdijoyb->SetProperty( DIPROP_RANGE, &joy_axis_range.diph );
//////////////////////////////////////////////////////////////////////////
// and now the dead band
DIPROPDWORD dead_band; // here's our property word
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;
// 10% will be used on both sides of the range +/-
dead_band.dwData = 1000;
// finally set the property
lpdijoya->SetProperty( DIPROP_DEADZONE, &dead_band.diph );
lpdijoyb->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;
// 10% will be used on both sides of the range +/-
dead_band.dwData = 1000;
// finally set the property
lpdijoya->SetProperty( DIPROP_DEADZONE, &dead_band.diph );
lpdijoyb->SetProperty( DIPROP_DEADZONE, &dead_band.diph );
// acquire the joystick
if ( lpdijoya->Acquire() != DI_OK ) return( 0 );
if ( lpdijoyb->Acquire() != DI_OK ) return( 0 );
///////////////////////////////////////////////////////////
} // end Game_Init
///////////////////////////////////////////////////////////
谁能帮我稍稍看一下, 说一下关键所在啊?
在此谢谢了[em3][em3][em3][em3][em3][em3][em3][em3][em3][em3][em3][em3][em3][em3][em3][em3][em3][em3]
[em3] [em3] [em3] [em3] [em3] [em4] [em2] [em2] [em3] |
|