SFML community forums

Help => General => Topic started by: noaboa on January 11, 2016, 08:59:40 pm

Title: DeltaTime
Post by: noaboa on January 11, 2016, 08:59:40 pm
Hi, I am new to SFML and trying to make a moving rectangle. I am wondering if this is the correct use of deltaTime


while (window.isOpen()){
                sf::Event event;
               
                time = clock.restart();
                float dt = time.asSeconds();

                while (window.pollEvent(event)){

                        sf::Vector2f playerXY;
                       
                        if (acceleration > 1)
                                acceleration = 1;

                        if (event.type == sf::Event::Closed)
                                window.close();

                        else if (sf::Keyboard::isKeyPressed(sf::Keyboard::A)){
                                acceleration += 0.1;
                                playerXY = sf::Vector2f(-150.0f * dt, 0.0f);
                        }

                        else if (sf::Keyboard::isKeyPressed(sf::Keyboard::D)){
                                acceleration += 0.1;
                                playerXY = sf::Vector2f(150.0f * dt, 0.0f);
                        }
                        else{
                                acceleration = 0.2;
                        }

                        std::cout << dt << std::endl;

                        playerXY *= acceleration;

                        player.move(playerXY);
                       
                }
                window.clear();
                window.draw(player);
                window.display();
        }
 
Title: Re: DeltaTime
Post by: Hapax on January 12, 2016, 12:48:28 am
Anything that changes should be multiplied by delta time. That includes your modification of acceleration.
e.g. acceleration += 100.f * dt;
It will require larger numbers here since it's being multiplied by dt (a usually very small value) but that's okay because this is the rate of change for acceleration (https://en.wikipedia.org/wiki/Jerk_%28physics%29) and not the acceleration itself.

Acceleration is a float, of course, right?

I find playerXY to be an odd name for a vector offset but it's your choice to name it whatever you like  ;D
Title: Re: DeltaTime
Post by: Ventus on January 13, 2016, 03:28:41 pm
You are reseting the clock and storing the time as seconds after that, is that what you intended?
I might be mixing things up, but maybe you would want something like this:

float dt = clock.restart().asSeconds();

Then using it would be as simple as:

//Before the game loop
sf::Vector2f velocity(0.f, 0.f);
sf::Vector2f acceleration(0.f, 10.f);
...

//In the main loop
velocity.x = acceleration.x * dt;
velocity.y = acceleration.y * dt;

Then again, I might be mixing things up here.
Title: Re: DeltaTime
Post by: Hapax on January 13, 2016, 09:47:11 pm
float dt = clock.restart().asSeconds();
is equivalent to
sf::Time time = clock.restart();
float dt = time.asSeconds();
dt has the same value both ways.

The velcoty/acceleration way that Ventus mentioned is the usual way to do this. However, the acceleration should be added to the velocity, not just replace its current value. Also, you don't need to working with each component separately, thus:
velocity += acceleration * dt; // (sf::Vector2f += sf::Vector2f * float)
where acceleration is the "thrust" in a particular direction (a vector)
If you use acceleration as a single value, it will need to either be relative to the current velocity, or be multiplied by a unit vector in the same direction to the velocity

Also, as I mentioned earlier, change to acceleration would also be multiplied by dt so:
acceleration += jerk * dt; // (float += float * float)
or
acceleration += jerk * dt; // (sf::Vector2f += sf::Vector2f * float)
where "jerk" is the rate of change for acceleration (https://en.wikipedia.org/wiki/Jerk_%28physics%29)
This time, if you use acceleration as a vector and a single value for jerk, jerk will need to either be relative to the current acceleration, or be multiplied by a unit vector in the same direction as the acceleration.

A unit vector is a vector divided by its length (its length becomes one but its angle is the same).
Title: Re: DeltaTime
Post by: Ventus on January 13, 2016, 10:19:34 pm
float dt = clock.restart().asSeconds();
is equivalent to
sf::Time time = clock.restart();
float dt = time.asSeconds();
dt has the same value both ways.

Oh, my mistake, I must've over-read it. I thought he did something like this:
time = clock.restart();
float dt = clock.getElapsedTime().asSeconds();