2011-01-05 3 views
0

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

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

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

ответ

1

Вам нужен цикл, который вызывается фиксированное количество раз в секунду, а затем обновить х , 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

Большое вам спасибо! – Lemmons

0

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

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

+0

Я бы все равно разницу между кадрами, так как 20 миллисекунд никоим образом не гарантируется. – Lalaland