SFML community forums
Help => Window => Topic started by: jindocai on January 26, 2008, 07:13:57 am
-
I'm using v1.1 (v1.2 doesn't work for me).
OS: Vista 32bit
Compiler: VS2005SP1
Joypad: Logitech Dual Action, microsoft driver.
I get no joystick events (buttons & motion). Mouse & Keyboard work fine.
Anyone have this problem or know of a solution?
Thanks
-
I have no way of testing joystick input since the last modification of the code, but so far nobody reported me such errors.
It will be hard for me to help you more on this problem, sorry.
-
I just tested my joystick, and it doesnt work either..
there are two things I had to change to make it work, the first one was more a hack, which probably isnt good if you have 2 joysticks, but I dunno how the whole joystick concept is supposed to work, but hopefully laurent will be able to fix it correctly:
in Joystick::Initialize, myIndex gets too big, since the loop checks for all joysticks, so for joystick index 0 the myIndex for my joystick was set to 1.
you need to break out of the loop at the end of the check for (Error == JOYERR_NOERROR)
the second fix is no hack anymore, there was a check in Joystick::UpdateState:
if ( joyGetDevCaps(myIndex, &Caps, sizeof(Caps)) )
which should be:
if ( joyGetDevCaps(myIndex, &Caps, sizeof(Caps)) == JOYERR_NOERROR )
-
Thank you very much for your feedback :) I can't test it myself, and I don't get much feedback usually.
I fixed the second thing, nice catch.
However I'm not sure I understand what's wrong with the first problem. Could you give more details ?
-
this is what happens:
Joystick::Initialize gets called for the first joystick ( 0 )
it checks the while loop, the loop returns true, so it steps inside,
it checks if there was no error, if so set the properties
then it increases myIndex and checks the loop again.. it fails and the function is done..
but myIndex is now 1, not 0.
so I guess there are 2 fixes for this:
either make the while loop look like this:
for( ; ((myIndex - JOYSTICKID1 <= Index) && (Error = joyGetPosEx(myIndex, &JoyInfo)) != JOYERR_PARMS; myIndex++ )
{
// Check if the current joystick is connected
if (Error == JOYERR_NOERROR)
{
....
}
}
or decrease myIndex by one at the end of the function
but in the end, I guess this still wont work with multiple joysticks, it probably has to look like this:
void Joystick::Initialize(unsigned int Index)
{
// Reset state
myIndex = JOYSTICKID1;
myNbAxes = 0;
myNbButtons = 0;
// Get the Index-th connected joystick
MMRESULT Error;
JOYINFOEX JoyInfo;
for( int joysticksFound = 0; (Error = joyGetPosEx(myIndex, &JoyInfo)) != JOYERR_PARMS; myIndex++ )
{
// Check if the current joystick is connected
if (Error == JOYERR_NOERROR) {
if ( joysticksFound == Index ) {
// Store its caps
JOYCAPS Caps;
joyGetDevCaps(myIndex, &Caps, sizeof(Caps));
myNbAxes = Caps.wNumAxes;
myNbButtons = Caps.wNumButtons;
return;
}
joysticksFound++;
}
}
}
-
Ok, I get it :)
I've updated the code, if you try it let me know if it works.
Thanks for your help.
-
works
no problem
-
Cool :)
Did you test joystick events ? Real-time input ? Is everything really working fine ?
-
I did not actually test if the input is correct, but I receive button and axis events from my joystick.