Спрайт движение - PullRequest
       15

Спрайт движение

0 голосов
/ 05 января 2011

Я рву волосы над этим. По какой-то странной причине я не могу узнать / подумать о том, как переместить спрайт в SFML и / или SDL. Обучающие программы, которые я посмотрел для обеих библиотек, ничего не говорят об этом; поэтому я предполагаю, что это скорее вещь C ++, чем библиотека.

Так что мне было интересно; как ты двигаешь спрайт?

(когда я говорю «двигаться», я имею в виду, что спрайт «скользит» по окну с заданной скоростью)

Ответы [ 2 ]

1 голос
/ 05 января 2011

Вам нужен цикл, который вызывается фиксированное число раз в секунду, а затем вы обновляете значения x, y спрайта в каждом кадре.

Для SFML у вас есть sprite.move

while (App.IsOpened())
{
    // Process events
    sf::Event Event;
    while (App.GetEvent(Event))
    {
        if (Event.Type == sf::Event::Closed)
            App.Close();
    }

    // Get elapsed time
    float ElapsedTime = App.GetFrameTime();

    // Move the sprite
    if (App.GetInput().IsKeyDown(sf::Key::Left))  Sprite.Move(-100 * ElapsedTime, 0);
    if (App.GetInput().IsKeyDown(sf::Key::Right)) Sprite.Move( 100 * ElapsedTime, 0);
    if (App.GetInput().IsKeyDown(sf::Key::Up))    Sprite.Move(0, -100 * ElapsedTime);
    if (App.GetInput().IsKeyDown(sf::Key::Down))  Sprite.Move(0,  100 * ElapsedTime);
}
0 голосов
/ 05 января 2011

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

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

...