Использование дельта-времени для перемещения текстуры, когда между кадрами [duplicate]

Хорошо,

отбросил старый ответ. После некоторого поиска я нашел способ сделать это.

  ImageIcon icon = .. [анимированный gif без цикла] .. .... label1.setIcon (значок);  // анимация воспроизводится один раз .... // теперь время, чтобы удалить значок из метки1 и добавить его в label2 label1.setIcon (null);  icon.getImage () на одном уровне ().  // сбрасываем ресурс, используемый изображением label2.setIcon (значок);  ....  

Java Api: изображение # flush ()

btw. если вы оставите строку label1.setIcon (null); , она все равно повторит анимацию значка только для метки2. label1 остается на последнем кадре.

4
задан Martin 4 December 2014 в 13:04
поделиться

2 ответа

Ну, конечно, вам нужно действительно дождаться, пока> = 1ms не пройдет, прежде чем обновлять ваш последний счетчик галочек

void Application::Update()
{
    Uint32  current_time = SDL_GetTicks();
    Uint32  delta_time = current_time - last_update_time;

    SDL_Event event;
    while(SDL_PollEvent(&event))
    {
        switch(event.type)
        {
            case SDL_QUIT:
            {
                should_close = true;
            }
            break;

            default:
                break;
        }
    }

    if (delta_time >= 1)
    {
        // Update game objects with delta_time

        last_update_time = current_time;
    }   
}
0
ответ дан Gunther Van Butsele 15 August 2018 в 17:12
поделиться

Вы не можете использовать SDL_GetTicks (), если хотите более высокую точность, но есть много других альтернатив. Если вы хотите быть независимым от платформы, вам нужно быть осторожным, но вот пример портативного C ++ 11, который поможет вам начать:

#include <iostream>
#include <chrono>
typedef std::chrono::high_resolution_clock Clock;

int main()
{
    auto t1 = Clock::now();
    auto t2 = Clock::now();
    std::cout << "Delta t2-t1: " 
              << std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count()
              << " nanoseconds" << std::endl;
}

Запуск этого на ideone.com дал мне:

Delta t2-t1: 282 nanoseconds
5
ответ дан Martin 15 August 2018 в 17:12
поделиться
  • 1
    Полностью зависит от компилятора и ОС. Например, не будет работать в GCC, Windows или MSVC 2013. – metamorphosis 21 February 2016 в 00:05
  • 2
    Это не зависит от ОС, но да, вам нужен компилятор, способный компилировать C ++ 11, который, как я полагаю, у вас нет. – Martin 21 February 2016 в 08:16
  • 3
    На самом деле это зависит от ОС, поскольку разные ОС имеют разные внутренние счетчики, некоторые лучше других. Ни один из основных компиляторов в Windows на данный момент не имеет функционирующего хронографа, который способен выполнять фактические наносекунды. – metamorphosis 22 February 2016 в 04:43
Другие вопросы по тегам:

Похожие вопросы: