Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Gravity with air-time, acceleration and speed gaining



I am trying to accomplish a gravity, where airtime is included, and also acceleration.
I have tried using usual gravity, which looks something like this:

velocity += gravity * dt;
position += velocity * dt;


This would probably work good enough for a normal platformer game, but I am trying to make a game inspired by "The helicopter game", where you have to navigate through a tunnel, without touching the walls.

what I want to do different, is that I want to be able to save up speed on the way down, which will be used on the way up again, so I will have some acceleration at the beginning.
I also want some kind of airtime, so when you hit the top it would not force you down as fast as It would, if I had used the gravity from the code sample.

This image illustrates the curve I would like to have:
Link to curve

Please note that the whole controlling is done by one key, so for example you would fly up if you held down space, and dive if you released it.
The character also never moves left or right, since it will have a static X position on the screen, so vectors can't be used.

I have spent hours trying to make it work, but with no success. I have also tried searching on the internet, but without any luck.

The game "Whale Trails" got the gravity I kind of want.
Here is a link for a video of the game: http://www.youtube.com/watch?v=5OQ0OWcuDJs

I'm not that big of a physics guy, so it would be cool if you could give an example of the actual code
I hope anyone can help me figure this out.

like image 220
Basic Avatar asked Nov 24 '11 23:11

Basic


1 Answers

Gravity is the force that pulls objects down. Your player is the force that pulls objects up. Accordingly your code must be:

if(keyPressed) {
  velocity += POWER_OF_PLAYER;
}

velocity += G;
position += velocity;

This is enough to create a curve like you illustrated. Of course POWER_OF_PLAYER must be of a different sign and the absolute value must be greater to make this work.

G = -9.81
POWER_OF_PLAYER = 20

Saving power is then a simple check.

if(keyPressed) {
  if(powerSaved > 0) {
    velocity += POWER_OF_PLAYER;
    powerSaved -= SOMETHING;
  }
} else if (velocity >= SOME_MINIMUM_SPEED_BEFORE_GETTING_POWER) {
  powerSaved += SOMETHING;
}

SOME_MINIMUM_SPEED_BEFORE_GETTING_POWER should be something less or equal 0.

P.S. I assumed your Y axis starts at ground and shoots into the sky. Signs put accordingly.

like image 177
Marcel Jackwerth Avatar answered Sep 25 '22 20:09

Marcel Jackwerth