mirror of https://github.com/bsnes-emu/bsnes.git
Update to bsnes v041r04? release.
Okay, new WIP. That's the best I can possibly do. For all six axes, I now ignore input until the state changes for the first time. If it goes from 0 to > 24576 in a single poll, it considers the axis to be a button. Otherwise it treats it as a stick. Positive on a stick means down or right, so it's less likely users will hit this first (up, left are more common for assignment as they're first in the control lists.) To minimize the damage of a bad map, I now map each axis to their own value without regard for axis vs analog button indexing. Eg you will have { axis00, axis01, analogbutton02, analogbutton03, axis04, axis05 } instead of { axis00, axis01, analogbutton00, analogbutton01, axis02, axis03 }. That way if you do screw up the mapping and restart, the indexes won't change on you. I don't do that on Linux to allow as many axes + analog buttons as possible, and because it's not needed. I had to choose what to bias, so I went with axes as they seem more important overall. Eg -32768 to +24575 = stick; +24576 to +32767 = button. That means it's easier to map a button as an axis than vice versa. It's unfortunately still quite easy to map these incorrectly, eg if you slam down on a button or smack a stick as hard as you can down or to the right. But it was basically ... have a chance of mapping inputs wrong, or don't let them be mappable at all. The former seems better in that case. If _anyone_ has a proper solution for this problem, I'd greatly appreciate it. In fact, let's put a bounty on it. I'll pitch in $20 for the solution (a way to get the true state of axes without requiring the user to press a button first.) I also used EnumObjects over all absolute axes to map them to -32768 to +32767. That should help with the Xbox 360 controller that defaults to half that range or whatever (fuck you, XInput.) Testing would be appreciated. Both for the Windows and Linux ports, though I can't foresee there being any problems with the Linux one. --- SDL on Win32 does the same thing ... not surprising since it just uses DirectInput anyway. #include <SDL/SDL.h> SDL_Joystick *gamepad; int __stdcall WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { SDL_InitSubSystem(SDL_INIT_JOYSTICK); SDL_JoystickEventState(SDL_IGNORE); gamepad = SDL_JoystickOpen(0); while(true) { SDL_JoystickUpdate(); unsigned axes = SDL_JoystickNumAxes(gamepad); for(unsigned n = 0; n < axes; n++) { printf("%d = %6d; ", n, SDL_JoystickGetAxis(gamepad, n)); } printf("\n"); } return 0; } [No archive available]
This commit is contained in:
parent
9ac912d100
commit
e2a44195cd