🎉 Celebrating 25 Years of GameDev.net! 🎉

Not many can claim 25 years on the Internet! Join us in celebrating this milestone. Learn more about our history, and thank you for being a part of our community!

What's the issue with my movement code?

Started by
1 comment, last by JoeJ 3 years, 1 month ago
 if (sf::Keyboard::isKeyPressed(sf::Keyboard::W))  
{
 if (velocity.y > -_maxVelocity)
  velocity.y -= _accel;
}
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::S)) // when going from W to S there is a noticeable friction delay before moving // we should check this eventually
{
 if (velocity.y < _maxVelocity)
  velocity.y += _accel;
}
else
{
 Clamp(velocity.y, 0.f, 5.f);
 Clamp(velocity.x, -5.f, 0.f);

 if (velocity.y > 0.f)
 {
  velocity.y -= _deccel;
 }
 else if (velocity.y < 0.f)
 {
  velocity.y += _deccel;
 }
}
// X Movement
if (sf::Keyboard::isKeyPressed(sf::Keyboard::A))
{
 if (velocity.x > -_maxVelocity)
  velocity.x -= _accel;
}
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::D))
{
 if (velocity.x < _maxVelocity)
  velocity.x += _accel;
}
else
{
 Clamp(velocity.x, 0.f, 5.f);
 Clamp(velocity.x, -5.f, 0.f);

 if (velocity.x > 0.f)
 {
  velocity.x -= _deccel;
 }
 else if (velocity.x < 0.f)
 {
  velocity.x += _deccel;
 }
}

Move(velocity * dt.asSeconds());

Advertisement

Elit3d said:
Clamp(velocity.y, 0.f, 5.f); Clamp(velocity.x, -5.f, 0.f);

You wrote x but meant y, i guess.

Elit3d said:
Clamp(velocity.x, 0.f, 5.f); Clamp(velocity.x, -5.f, 0.f);

like here, but his won't work as it sets to zero depending on sign.
You likely wanted vel = clamp(vel, -5, 5);

Notice those clamps never happen as long as we keep the key pressed, so likely you want to move the clamping logic outside of key press conditions.

If you want to model movement with constant acceleration as it seems, the proper way usually is:

const float dt = 0.16f;
const float K = 5; // constant acceleration
float acceleration = 0;
if (KeyDown('LEFT') acceleration = -K;
if (KeyDown('RIGHT') acceleration = K;
velocity += acceleration * dt;
position += v * dt;

Notice position is affected by squared timestep, which is missing in your code.

This topic is closed to new replies.

Advertisement