То, что я обычно делаю, когда мне нужно что-то вроде «гравитации» (которую также можно назвать ускорением, направленным только вниз), это определение переменных position
, speed
и acceleration
.Каждый тик, который вы добавляете speed
к position
, таким образом, ваш спрайт перемещается в заданном направлении каждый тик, теперь вам также нужно изменить speed
, чтобы направление движения постепенно изменялось, вот где появляется acceleration
, вы добавляете его в speed
каждый тик.
Псевдокод будет выглядеть следующим образом:
var posy = 50;
var speedy = 5;
var accely = -0.5;
tick() {
posy += speedy;
speedy += accely;
}
Таким образом, ваша скорость в конечном итоге станет отрицательной, и, таким образом, начнет перемещать спрайтbottom вместо up.
( Примечание: мои значения произвольны, вам придется поиграть с ними, чтобы достичь эффекта, который вам действительно нужен )
Воткод, который, я полагаю, подойдет для вашего случая, по соображениям простоты я предполагаю, что ваш шар движется только по оси Y
.Вам нужно добавить движение оси X
самостоятельно.
float SpriteX = 50;
float SpriteY = 100; //the sprite starts at the top of the screen (2D coords system)
float screenBottom = 200; //I'm assuming your screen is 200 pixels high, change to your size
float speedY = 0.23; //the initial speed of the sprite
float accelY = 0.02; //the change in speed with each tick
void Game::Tick( float a_DT )
{
m_Screen->Clear( 0 );
theSprite.Draw(SpriteX, SpriteY, m_Screen ); // Draws sprite
if(SpriteY >= screenBottom) //when we hit bottom we change the direction of speed and slow it
{
speedY = -speedY/2;
}
SpriteY += speedY;
speedY += accelY;
}
Этот код вообще не тестируется, поэтому, возможно, придется поиграть с ним, чтобы он действительно работал.Также значения являются произвольными, но логика остается прежней.Я попытался удалить все вещи, которые не имеют прямого отношения к прыжкам, дайте мне знать, как это работает.
Надеюсь, это помогло.