# SFML - Acceleration in Space?

## Recommended Posts

Yeap, me again, lol. The thing is, I'm trying to give my ship an acceleration as if it were moving in space (zero gravity), if a press the Up arrow key, the ship increases its acceleration, change its direction (to the mouse vector), and so forth. There's the code I already have:

sf::Vector2f Nave::getDirection(sf::Vector2f mousePOS, sf::Vector2f playerPOS, float acceleration, sf::Time& delta)
{
sf::Vector2f direction = mousePOS - playerPOS;

direction = direction / sqrt(direction .x * direction .x + direction .y * direction .y) * aceleration;

return direcion;
}

void Nave::update(sf::Time& delta, sf::Vector2f mousePOS)
{
...

if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
{
acceleration += 0.1f;
shipDir = getDirection( mousePOS, shipSprite.getPosition(), aceleration, delta );
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
{
acceleration -= 0.1f;
}

if( acceleration > 5.0f )
acceleration = 5.0f;
else if( acceleration < 0.0f )
acceleration = 0.0f;

shipSprite.move( shipDir.x, shipDir.y );
shipSprite.setAngle(angle);

...

}

float Nave::Angle( sf::Vector2f playerPOS, sf::Vector2f mousePOS )
{
float angle = atan2(mousePOS.y - playerPOS.y, mousePOS.x - playerPOS.x );
angle = angle * (180/PI);

if(angle < 0)
{
angle = 360 - (-angle);
}

return angle;
}



Of course there's an obvious problem, first, the deceleration, but most important, when I press the Up arrow again, the new vector direction totally f**ks the last direction, there's a video showing the problem:

Since I didn't find solution just looking at google (my poor English makes it harder, I think there aren't too much good gaming forums on Spanish), I'm looking for some help (duh).

Edit1:

there's a really explicit example of what i'm looking for:

Edited by Carlows

##### Share on other sites
Camilo    189

I would just keep one vector for the speed, then add the normalized mouse direction vector to it:

Vector2f position;
Vector2f speed;

void Nave::update(sf::Time& delta, sf::Vector2f mousePOS)
{
float mouseMagnitude = sqrt(mousePOS.x * mousePOS.x + mousePOS.y * mousePOS.y)
mousePOS = mousePOS / mouseMagnitude;  // probably need to divide this by some constant, too.
speed += mousePOS;
position += speed; // * delta if this is not called at regular intervals
}


##### Share on other sites

On a side-note; can I ask, where do you declare the variable 'aceleration'? There is also another variable 'acceleration' and these seem to be interchanged within the function, and its first usage. Is this just a typo? Or are you making use of the wrong variable at the wrong time?

##### Share on other sites

On a side-note; can I ask, where do you declare the variable 'aceleration'? There is also another variable 'acceleration' and these seem to be interchanged within the function, and its first usage. Is this just a typo? Or are you making use of the wrong variable at the wrong time?

Lol, that was my error traducing the code to English

##### Share on other sites

I would just keep one vector for the speed, then add the normalized mouse direction vector to it:

Vector2f position;
Vector2f speed;

void Nave::update(sf::Time& delta, sf::Vector2f mousePOS)
{
float mouseMagnitude = sqrt(mousePOS.x * mousePOS.x + mousePOS.y * mousePOS.y)
mousePOS = mousePOS / mouseMagnitude;  // probably need to divide this by some constant, too.
speed += mousePOS;
position += speed; // * delta if this is not called at regular intervals
}


I think that doesn't change anything on the behavior...

##### Share on other sites
Camilo    189

I would just keep one vector for the speed, then add the normalized mouse direction vector to it:

Vector2f position;
Vector2f speed;

void Nave::update(sf::Time& delta, sf::Vector2f mousePOS)
{
float mouseMagnitude = sqrt(mousePOS.x * mousePOS.x + mousePOS.y * mousePOS.y)
mousePOS = mousePOS / mouseMagnitude;  // probably need to divide this by some constant, too.
speed += mousePOS;
position += speed; // * delta if this is not called at regular intervals
}


I think that doesn't change anything on the behavior...

I think it does: I am treating the speed as a vector, while your "acceleration" (actually speed, I think) is a scalar.

##### Share on other sites

I would just keep one vector for the speed, then add the normalized mouse direction vector to it:

Vector2f position;
Vector2f speed;

void Nave::update(sf::Time& delta, sf::Vector2f mousePOS)
{
float mouseMagnitude = sqrt(mousePOS.x * mousePOS.x + mousePOS.y * mousePOS.y)
mousePOS = mousePOS / mouseMagnitude;  // probably need to divide this by some constant, too.
speed += mousePOS;
position += speed; // * delta if this is not called at regular intervals
}


I think that doesn't change anything on the behavior...

I think it does: I am treating the speed as a vector, while your "acceleration" (actually speed, I think) is a scalar.

You were right, my fault. Thanks!

Edited by Carlows