- Main Page
- Namespaces
- Classes
- Files

- File List

# Joystick.cpp

    00001
    00002 //
    00003 // SFML - Simple and Fast Multimedia Library
    00004 // Copyright (C) 2007-2009 Laurent Gomila (laurent.gom@gmail.com)
    00005 //
    00006 // This software is provided 'as-is', without any express or implied warranty.
    00007 // In no event will the authors be held liable for any damages arising from the use of this software.
    00008 //
    00009 // Permission is granted to anyone to use this software for any purpose,
    00010 // including commercial applications, and to alter it and redistribute it freely,
    00011 // subject to the following restrictions:
    00012 //
    00013 // 1. The origin of this software must not be misrepresented;
    00014 //    you must not claim that you wrote the original software.
    00015 //    If you use this software in a product, an acknowledgment
    00016 //    in the product documentation would be appreciated but is not required.
    00017 //
    00018 // 2. Altered source versions must be plainly marked as such,
    00019 //    and must not be misrepresented as being the original software.
    00020 //
    00021 // 3. This notice may not be removed or altered from any source distribution.
    00022 //
    00024
    00026 // Headers
    00028 #define _WIN32_WINDOWS 0x0501
    00029 #define _WIN32_WINNT   0x0501
    00030 #include <SFML/Window/Joystick.hpp>
    00031 #include <windows.h>
    00032 #include <mmsystem.h>
    00033
    00034
    00035 namespace sf
    00036 {
    00037 namespace priv
    00038 {
    00042 void Joystick::Initialize(unsigned int Index)
    00043 {
    00044     // Reset state
    00045     myIndex            = JOYSTICKID1;
    00046     myNbButtons        = 0;
    00047     myIsConnected      = false;
    00048     myHasContinuousPOV = false;
    00049     for (int i = 0; i < Joy::AxisCount; ++i)
    00050         myAxes[i] = false;
    00051
    00052     // Get the Index-th connected joystick
    00053     MMRESULT Error;
    00054     JOYINFOEX JoyInfo;
    00055     JoyInfo.dwSize = sizeof(JoyInfo);
    00056     JoyInfo.dwFlags = JOY_RETURNALL;
    00057     for (unsigned int NbFound = 0; (Error = joyGetPosEx(myIndex, &JoyInfo)) != JOYERR_PARMS; myIndex++)
    00058     {
    00059         // Check if the current joystick is connected
    00060         if (Error == JOYERR_NOERROR)
    00061         {
    00062             // Check if it's the required index
    00063             if (NbFound == Index)
    00064             {
    00065                 // Ok : store its parameters and return
    00066                 myIsConnected = true;
    00067                 JOYCAPS Caps;
    00068                 joyGetDevCaps(myIndex, &Caps, sizeof(Caps));
    00069                 myNbButtons = Caps.wNumButtons;
    00070                 if (myNbButtons > Joy::ButtonCount)
    00071                     myNbButtons = Joy::ButtonCount;
    00072
    00073                 myAxes[Joy::AxisX]   = true;
    00074                 myAxes[Joy::AxisY]   = true;
    00075                 myAxes[Joy::AxisZ]   = (Caps.wCaps & JOYCAPS_HASZ) != 0;
    00076                 myAxes[Joy::AxisR]   = (Caps.wCaps & JOYCAPS_HASR) != 0;
    00077                 myAxes[Joy::AxisU]   = (Caps.wCaps & JOYCAPS_HASU) != 0;
    00078                 myAxes[Joy::AxisV]   = (Caps.wCaps & JOYCAPS_HASV) != 0;
    00079                 myAxes[Joy::AxisPOV] = (Caps.wCaps & JOYCAPS_HASPOV) != 0;
    00080                 myHasContinuousPOV   = (Caps.wCaps & JOYCAPS_POVCTS) != 0;
    00081
    00082                 return;
    00083             }
    00084
    00085             // Go to the next valid joystick
    00086             ++NbFound;
    00087         }
    00088     }
    00089 }
    00090
    00091
    00095 JoystickState Joystick::UpdateState()
    00096 {
    00097     JoystickState State;
    00098
    00099     if (myIsConnected)
    00100     {
    00101         // Get the joystick caps (for range conversions)
    00102         JOYCAPS Caps;
    00103         if (joyGetDevCaps(myIndex, &Caps, sizeof(Caps)) == JOYERR_NOERROR)
    00104         {
    00105             // Get the current joystick state
    00106             JOYINFOEX Pos;
    00107             Pos.dwFlags  = JOY_RETURNX | JOY_RETURNY | JOY_RETURNZ | JOY_RETURNR | JOY_RETURNU | JOY_RETURNV | JOY_RETURNBUTTONS;
    00108             Pos.dwFlags |= myHasContinuousPOV ? JOY_RETURNPOVCTS : JOY_RETURNPOV;
    00109             Pos.dwSize   = sizeof(JOYINFOEX);
    00110             if (joyGetPosEx(myIndex, &Pos) == JOYERR_NOERROR)
    00111             {
    00112                 // Axes
    00113                 State.Axis[Joy::AxisX] = (Pos.dwXpos - (Caps.wXmax + Caps.wXmin) / 2.f) * 200.f / (Caps.wXmax - Caps.wXmin);
    00114                 State.Axis[Joy::AxisY] = (Pos.dwYpos - (Caps.wYmax + Caps.wYmin) / 2.f) * 200.f / (Caps.wYmax - Caps.wYmin);
    00115                 State.Axis[Joy::AxisZ] = (Pos.dwZpos - (Caps.wZmax + Caps.wZmin) / 2.f) * 200.f / (Caps.wZmax - Caps.wZmin);
    00116                 State.Axis[Joy::AxisR] = (Pos.dwRpos - (Caps.wRmax + Caps.wRmin) / 2.f) * 200.f / (Caps.wRmax - Caps.wRmin);
    00117                 State.Axis[Joy::AxisU] = (Pos.dwUpos - (Caps.wUmax + Caps.wUmin) / 2.f) * 200.f / (Caps.wUmax - Caps.wUmin);
    00118                 State.Axis[Joy::AxisV] = (Pos.dwVpos - (Caps.wVmax + Caps.wVmin) / 2.f) * 200.f / (Caps.wVmax - Caps.wVmin);
    00119
    00120                 // POV
    00121                 if (Pos.dwPOV != 0xFFFF)
    00122                     State.Axis[Joy::AxisPOV] = Pos.dwPOV / 100.f;
    00123                 else
    00124                     State.Axis[Joy::AxisPOV] = -1.f;
    00125
    00126                 // Buttons
    00127                 for (unsigned int i = 0; i < GetButtonsCount(); ++i)
    00128                     State.Buttons[i] = (Pos.dwButtons & (1 << i)) != 0;
    00129             }
    00130         }
    00131     }
    00132
    00133     return State;
    00134 }
    00135
    00136
    00140 bool Joystick::HasAxis(Joy::Axis Axis) const
    00141 {
    00142     return myAxes[Axis];
    00143 }
    00144
    00145
    00149 unsigned int Joystick::GetButtonsCount() const
    00150 {
    00151     return myNbButtons;
    00152 }
    00153
    00154
    00155 } // namespace priv
    00156
    00157 } // namespace sf

:: Copyright © 2007-2008 Laurent Gomila, all rights reserved :: Documentation generated by doxygen 1.5.2 ::