Archived

This topic is now archived and is closed to further replies.

parklife

Dinput problem

Recommended Posts

(Using ''Tricks of the windows game programming gurus'' by LaMothe.) If I try to initiate either the mouse or the keyboard (using t3dlib2) the game will just quit on me. I hate this, because I can''t debug it. Anyone know of any known problems using this peace of code from this book? *arrggh* //John ----------------------------------------- Swedish saying: "The one who joins the game must face the consequences of the game."

Share this post


Link to post
Share on other sites
YES!!! I know the problem....


That book uses direct input code for Dx5.0 i think.

BUT If you have the 8.0 api installed the code won''t compile.

You need to update the code for directx8.0

Here is some code that I updated for Windows Programming for dumbies" which uses a lot of the same code from "Gurus"
I think this is all hyou will need to change... My function names may be slightly different. ALso you may need to change a little more of the other functions but I can''t remember if you do. This should get you started


//globals

LPDIRECTINPUT8 lpdi; // dinput object
LPDIRECTINPUTDEVICE8 lpdikey; // dinput keyboard
LPDIRECTINPUTDEVICE8 lpdimouse; // dinput mouse
LPDIRECTINPUTDEVICE8 lpdijoy2; // dinput joystick


//functions

int DInput_Init(void)
{
// this function initializes directinput

if (DirectInput8Create(main_instance,DIRECTINPUT_VERSION,IID_IDirectInput8,(void**)&lpdi,NULL)!=DI_OK)
return(0);

// return success
return(1);

} // end DInput_Init

int DI_Init_Joystick(int min_x, int max_x, int min_y, int max_y)
{
// 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,
DI_Enum_Joysticks,
&joystickGUID,
DIEDFL_ATTACHEDONLY);

if (lpdi->CreateDevice(joystickGUID, &lpdijoy2, NULL)!=DI_OK)
return(0);


// set cooperation level
if (lpdijoy2->SetCooperativeLevel(main_window_handle,
DISCL_NONEXCLUSIVE | DISCL_BACKGROUND)!=DI_OK)
return(0);

// set data format
if (lpdijoy2->SetDataFormat(&c_dfDIJoystick2)!=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;

lpdijoy2->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;

lpdijoy2->SetProperty(DIPROP_RANGE,&joy_axis_range.diph);

// acquire the joystick
if (lpdijoy2->Acquire()!=DI_OK)
return(0);

// set found flag
joystick_found = 1;

// return success
return(1);

} // end DI_Init_Joystick

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

int DI_Read_Joystick(void)
{
// this function reads the joystick state

// make sure the joystick was initialized
if (!joystick_found)
return(0);

if (lpdijoy2)
{
// this is needed for joysticks only
if (FAILED(lpdijoy2->Poll()))
{


return(0);
}


if (FAILED(lpdijoy2->GetDeviceState(sizeof(DIJOYSTATE2), (LPVOID)&joy_state)))
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 DI_Read_Joystick

big kid with adult powers

Share this post


Link to post
Share on other sites
lets try this again:

  

//globals


LPDIRECTINPUT8 lpdi; // dinput object

LPDIRECTINPUTDEVICE8 lpdikey; // dinput keyboard

LPDIRECTINPUTDEVICE8 lpdimouse; // dinput mouse

LPDIRECTINPUTDEVICE8 lpdijoy2; // dinput joystick



//functions


int DInput_Init(void)
{
// this function initializes directinput


if (DirectInput8Create(main_instance,DIRECTINPUT_VERSION,IID_IDirectInput8,(void**)&lpdi,NULL)!=DI_OK)
return(0);

// return success

return(1);

} // end DInput_Init


int DI_Init_Joystick(int min_x, int max_x, int min_y, int max_y)
{
// 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,
DI_Enum_Joysticks,
&joystickGUID,
DIEDFL_ATTACHEDONLY);

if (lpdi->CreateDevice(joystickGUID, &lpdijoy2, NULL)!=DI_OK)
return(0);


// set cooperation level

if (lpdijoy2->SetCooperativeLevel(main_window_handle,
DISCL_NONEXCLUSIVE | DISCL_BACKGROUND)!=DI_OK)
return(0);

// set data format

if (lpdijoy2->SetDataFormat(&c_dfDIJoystick2)!=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;

lpdijoy2->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;

lpdijoy2->SetProperty(DIPROP_RANGE,&joy_axis_range.diph);

// acquire the joystick

if (lpdijoy2->Acquire()!=DI_OK)
return(0);

// set found flag

joystick_found = 1;

// return success

return(1);

} // end DI_Init_Joystick


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


int DI_Read_Joystick(void)
{
// this function reads the joystick state


// make sure the joystick was initialized

if (!joystick_found)
return(0);

if (lpdijoy2)
{
// this is needed for joysticks only

if (FAILED(lpdijoy2->Poll()))
{


return(0);
}


if (FAILED(lpdijoy2->GetDeviceState(sizeof(DIJOYSTATE2), (LPVOID)&joy_state)))
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 DI_Read_Joystick

Share this post


Link to post
Share on other sites
I Dig you!

You don''t have code for the other devices?


Hm. I get this error when I try to build. I think it''s because I''m missing some file, but I''m not sure.

"t3dlib2.obj : error LNK2001: unresolved external symbol _DirectInput8Create@20"

please help?

//John
-----------------------------------------
Swedish saying:
"The one who joins the game must face the consequences of the game."

Share this post


Link to post
Share on other sites
Yes, you are right. I made a search on gamedev and found out. But thanks anyway.

I love you gamedev''ers

//John
-----------------------------------------
Swedish saying:
"The one who joins the game must face the consequences of the game."

Share this post


Link to post
Share on other sites
Yup...

Sorry about that parklife... I forgot about dinput8.dll

D''OH!!!!!!!!!!


Anyway... The code for the other devices (mouse and keyboard)should work just fine. I think they changed DI for DX8 to support the XBOX controllers and other more complex joysticks that may come out in the future (just a guess though)

big kid with adult powers

Share this post


Link to post
Share on other sites