diff --git a/apps/openmw/mwinput/inputmanagerimp.cpp b/apps/openmw/mwinput/inputmanagerimp.cpp index e875064080..a09e66b316 100644 --- a/apps/openmw/mwinput/inputmanagerimp.cpp +++ b/apps/openmw/mwinput/inputmanagerimp.cpp @@ -518,28 +518,17 @@ namespace MWInput // joystick movement float xAxis = mInputBinder->getChannel(A_MoveLeftRight)->getValue(); float yAxis = mInputBinder->getChannel(A_MoveForwardBackward)->getValue(); - if (xAxis < .5) + if (xAxis != .5) { triedToMove = true; - mPlayer->setLeftRight (-1); - } - else if (xAxis > .5) - { - triedToMove = true; - mPlayer->setLeftRight (1); + mPlayer->setLeftRight((xAxis - 0.5f) * 2); } - if (yAxis < .5) + if (yAxis != .5) { triedToMove = true; mPlayer->setAutoMove (false); - mPlayer->setForwardBackward (1); - } - else if (yAxis > .5) - { - triedToMove = true; - mPlayer->setAutoMove (false); - mPlayer->setForwardBackward (-1); + mPlayer->setForwardBackward((yAxis - 0.5f) * 2 * -1); } else if(mPlayer->getAutoMove()) { diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index cdeeece94e..44a0f87ff4 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -1956,6 +1956,23 @@ void CharacterController::update(float duration, bool animationOnly) osg::Vec3f rot = cls.getRotationVector(mPtr); speed = cls.getSpeed(mPtr); + if(isPlayer) + { + // Joystick anologue movement. + float xAxis = std::abs(cls.getMovementSettings(mPtr).mPosition[0]); + float yAxis = std::abs(cls.getMovementSettings(mPtr).mPosition[1]); + float analogueMovement = ((xAxis > yAxis) ? xAxis : yAxis); + + // If Strafing, our max speed is slower so multiply by X axis instead. + if(std::abs(vec.x()/2.0f) > std::abs(vec.y())) + analogueMovement = xAxis; + + // Due to the half way split between walking/running, we multiply speed by 2 while walking, unless a keyboard was used. + if(!isrunning && !sneak && !flying && analogueMovement <= 0.5f) + speed *= 2; + + speed *= (analogueMovement); + } vec.x() *= speed; vec.y() *= speed; diff --git a/apps/openmw/mwworld/player.cpp b/apps/openmw/mwworld/player.cpp index a615c9978a..f152b2cae3 100644 --- a/apps/openmw/mwworld/player.cpp +++ b/apps/openmw/mwworld/player.cpp @@ -154,16 +154,16 @@ namespace MWWorld if (mAutoMove) value = 1; - ptr.getClass().getMovementSettings(ptr).mPosition[1] = static_cast(value); + ptr.getClass().getMovementSettings(ptr).mPosition[1] = value; } - void Player::setLeftRight (int value) + void Player::setLeftRight (float value) { MWWorld::Ptr ptr = getPlayer(); - ptr.getClass().getMovementSettings(ptr).mPosition[0] = static_cast(value); + ptr.getClass().getMovementSettings(ptr).mPosition[0] = value; } - void Player::setForwardBackward (int value) + void Player::setForwardBackward (float value) { MWWorld::Ptr ptr = getPlayer(); @@ -172,7 +172,7 @@ namespace MWWorld if (mAutoMove) value = 1; - ptr.getClass().getMovementSettings(ptr).mPosition[1] = static_cast(value); + ptr.getClass().getMovementSettings(ptr).mPosition[1] = value; } void Player::setUpDown(int value) diff --git a/apps/openmw/mwworld/player.hpp b/apps/openmw/mwworld/player.hpp index 7f37de0100..e2632f2104 100644 --- a/apps/openmw/mwworld/player.hpp +++ b/apps/openmw/mwworld/player.hpp @@ -42,7 +42,7 @@ namespace MWWorld CellStore* mMarkedCell; bool mAutoMove; - int mForwardBackward; + float mForwardBackward; bool mTeleported; int mCurrentCrimeId; // the id assigned witnesses @@ -94,9 +94,9 @@ namespace MWWorld bool getAutoMove() const; void setAutoMove (bool enable); - void setLeftRight (int value); + void setLeftRight (float value); - void setForwardBackward (int value); + void setForwardBackward (float value); void setUpDown(int value); void setRunState(bool run);