Как заставить спрайт подпрыгнуть, с силой тяжести? - PullRequest
1 голос
/ 09 октября 2011

Хорошо, так что я следовал учебнику о плавающих и заставлял спрайт двигаться со скоростью ниже 1 пикселя за кадр.Довольно легко.Теперь я получаю следующее задание:

Добавьте гравитационное влияние к расчету позиции нового танка, чтобы он автоматически падал, вместо того, чтобы каждый раз отскакивать от вершины.*

Как бы я сделал эту гравитацию?Я только научился добавлять к значениям x и y ... Простое добавление к значению y каждого кадра, конечно, не работает хорошо и не является гравитацией.Я действительно не понимаю, что я должен делать здесь.

Чтобы получить представление о коротком руководстве, вот ссылка.Это просто.http://www.devmaster.net/articles/intro-to-c++-with-game-dev/part6.php

Вот мой плохой код для того, чтобы заставить танк двигаться в четырех направлениях и сделать его невидимым при спуске.Я добавил поплавки из-за учебника.

 Sprite theSprite( new Surface("assets/ctankbase.tga"), 16 );


        float SpriteX = 50;
    float SpriteY = 0;    //the sprite starts at the top of the screen (2D coords system)
    float screenBottom = 400; //I'm assuming your screen is 200 pixels high, change to your size
    float speedY = 0.01; //the initial speed of the sprite
    float accelY = 0.01;  //the change in speed with each tick
    bool  Bottom = false;

    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;
            Bottom = true;
        }

        if(Bottom == false)
        {
        SpriteY += speedY;
        }

        speedY += accelY;

    }

Так как бы я заставил этот танк подпрыгивать по экрану с «гравитацией» в менее запаздывающем коде?Благодарю.Извините, если это глупый вопрос, но я его не вижу.

Ответы [ 3 ]

2 голосов
/ 09 октября 2011

То, что я обычно делаю, когда мне нужно что-то вроде «гравитации» (которую также можно назвать ускорением, направленным только вниз), это определение переменных 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;
}

Этот код вообще не тестируется, поэтому, возможно, придется поиграть с ним, чтобы он действительно работал.Также значения являются произвольными, но логика остается прежней.Я попытался удалить все вещи, которые не имеют прямого отношения к прыжкам, дайте мне знать, как это работает.

Надеюсь, это помогло.

0 голосов
/ 09 октября 2011

вам нужно будет отслеживать текущую скорость вашего спрайта.

на каждой итерации, вы должны добавить константу к скорости (эта константа является ускорением), затем нарисовать спрайт, как если бы он двигался в соответствии с текущей скоростью, то есть добавить скорость к текущей позиции. конечно, для хорошего результата скорость и ускорение должны быть двухмерными векторами.

на земле, гравитация - это ускорение со значением 9.81 m/(sec^2), направленное к Земле. это означает, что каждую секунду скорость объекта увеличивается на 9.81 m/s в направлении земли.

0 голосов
/ 09 октября 2011

Это просто простая физика.

Вам нужна переменная для позиции и скорости. Скорость будет увеличиваться линейно со временем, поэтому вы просто добавляете к ней постоянную каждый кадр Затем вы добавляете скорость в положение, и вы получаете поведение гравитации.

...