SFML community forums
Help => Window => Topic started by: TheMaskedFox on September 26, 2012, 04:35:49 am
-
I'm coming over to SFML from an SDL background. I'm porting a tool that was written in SDL and I've come across unexpected behavior when dealing with joysticks (on Mac). I've got a wired 360 controller from which SDL will deliver button events numbered 0 through 14. The A, B, X, and Y buttons are the 0 through 3. However, when using SFML, those buttons are mapped to 16 through 19.
SFML appears to number the 360 controller's buttons as 5 through 19 and has no buttons that correspond to 0 through 3. All 15 of the buttons still work, but it's really weird to have a joystick whose first button is 5 instead of 0. Is it possible I've done something wrong in code or is this common and expected behavior in SFML?
-
I have Win 7 x64, SFML 2.0, wired 360 controller
button A = number 0
button B = number 1
button X = number 2
button Y = number 3
-
This must be a Mac issue, on Linux and Windows the button numbers are simply those assigned by the joystick driver.
-
Ok so I'll have to improve https://github.com/SFML/SFML/blob/master/src/SFML/Window/OSX/JoystickImpl.cpp#L210 I suppose. Thanks for the feedback.
-
hey. saw this post. I am also looking into using x360 controller input for my game. Haven't tried anything yet, may be its quite straightforward. I am curious to know how did you interface x360 input's with sfml? Does the sfml's joystick class directly reads from the USB port or wireless adapter or there is something extra that needs to be done?
-
You can directly use SFML 2.0 without extra work but keep in mind what TheMaskedFox said above for the Mac version.
SFML appears to number the 360 controller's buttons as 5 through 19 and has no buttons that correspond to 0 through 3. All 15 of the buttons still work, but it's really weird to have a joystick whose first button is 5 instead of 0.
-
hey. saw this post. I am also looking into using x360 controller input for my game. Haven't tried anything yet, may be its quite straightforward. I am curious to know how did you interface x360 input's with sfml? Does the sfml's joystick class directly reads from the USB port or wireless adapter or there is something extra that needs to be done?
In Mac, I had to install a third-party driver from http://tattiebogle.net/index.php/ProjectRoot/Xbox360Controller/OsxDriver (http://tattiebogle.net/index.php/ProjectRoot/Xbox360Controller/OsxDriver) in order to use the 360 controller. However, once the driver was installed, the 360 controller was recognized in SDL and SFML without any extra work. It is treated like any other joystick. In my case, I'm just watching for joystick events (JoystickButtonPressed, JoystickMoved) from pollEvent(). The only issue I've encountered is the button numbering one that this topic is about.
-
Ok so I'll have to improve https://github.com/SFML/SFML/blob/master/src/SFML/Window/OSX/JoystickImpl.cpp#L210 I suppose. Thanks for the feedback.
I've been digging into SDL, SFML, and the source code for the driver I'm using (which is http://tattiebogle.net/index.php/ProjectRoot/Xbox360Controller/OsxDriver (http://tattiebogle.net/index.php/ProjectRoot/Xbox360Controller/OsxDriver)). Not being too familiar with any of the codebases, I'm not making much progress in figuring out why SDL sees the buttons as 0-15 and SFML sees them as 5 through 19. It's a really weird "bug". I find it highly unlikely that SDL specifically recognizes the 360 Mac driver and remaps 16, 17, 18, and 19 down to 0, 1, 2, and 3. So that leaves me trying to determine why, when both SDL and SFML are looking at the same output from the same driver, they get two different button mappings.
I probably need to go through the task of hooking the SFML source into my Xcode project so that I can directly debug SFML's recognition of my controller.
-
I'll have a look when I've some free time (unfortunately not in the near future) at SDL code. But, tell me, which version of SDL did you try ?
-
I'll have a look when I've some free time (unfortunately not in the near future) at SDL code. But, tell me, which version of SDL did you try ?
It was SDL 2.0 (which I think is just 1.3 without the 1.2 compatibility...).
Nevermind that though. I think I've found the problem and solved it. I'm not a contributor to SFML, so I've got no idea what the proper process is for submitting a patch. I would assume it starts with a fork on github.
In lieu of that, let me quickly explain what I did. First off, I defined a sort predicate for the joystick buttons as:
bool JoystickButtonSortPredicate(IOHIDElementRef d1, IOHIDElementRef d2)
{
return IOHIDElementGetUsage(d1) < IOHIDElementGetUsage(d2);
}
Then, after the for loop that goes through the elements, I added (truncated for-loop included):
// Go through all connected elements.
for (int i = 0; i < elementsCount; ++i) {
...
}
// Sort buttons according to HID Usage
std::sort(m_buttons.begin(), m_buttons.end(), JoystickButtonSortPredicate);
In doing so, my buttons are all exactly where I expect them to be and mesh properly with SDL's interpretation of them.
-
Thanks a lot! :D
I put your solution on the tracker until I have enough time to test it out with my own devices.