Обработка времени в SFML

в 14:09, , рубрики: c++, game development, SFML, время, обработка, Программирование

Обработка времени в SFML - 1

От переводчика: данная статья является пятой в цикле переводов официального руководства по библиотеке SFML. Прошлую статью можно найти тут. Данный цикл статей ставит своей целью предоставить людям, не знающим язык оригинала, возможность ознакомится с этой библиотекой. SFML — это простая и кроссплатформенная мультимедиа библиотека. SFML обеспечивает простой интерфейс для разработки игр и прочих мультимедийных приложений. Оригинал статьи можно найти тут. Начнем.

В отличие от многих других библиотек, в которых время представлено uint32 числом секунд, или дробным числом секунд, SFML не навязывает какую либо единицу или тип для значений времени. Вместо этого она оставляет этот выбор пользователю, предоставляя класс sf::Time. Все классы и функции, манипулирующие значениями времени, используют этот класс.

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

Конвертирование времени

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

sf::Time t1 = sf::microseconds(10000);
sf::Time t2 = sf::milliseconds(10);
sf::Time t3 = sf::seconds(0.01f); 

Заметьте, что все три значения времени равны.

Аналогично, sf:Time может быть обратно преобразован в секунды, милисекунды и микросекунды:

sf::Time time = ...;

sf::Int64 usec = time.asMicroseconds();
sf::Int32 msec = time.asMilliseconds();
float     sec  = time.asSeconds();

Играемся со временем

sf::Time — это просто количество времени, поэтому этот класс поддерживает арифметические операции, такие как сложение, вычитание, умножение и так далее. Время так же может быть отрицательным.

sf::Time t1 = ...;
sf::Time t2 = t1 * 2;
sf::Time t3 = t1 + t2;
sf::Time t4 = -t3;

bool b1 = (t1 == t2);
bool b2 = (t3 > t4);

Измерение времени

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

В SFML есть очень простой класс, предназначенный для измерения времени: sf::Clock. В этом классе есть только два метода: getElapsedTime, предназначенный для получения времени с момента последнего перезапуска, и restart, предназначенный для перезапуска часов.

sf::Clock clock; // часы запускаются
...
sf::Time elapsed1 = clock.getElapsedTime();
std::cout << elapsed1.asSeconds() << std::endl;
clock.restart();
...
sf::Time elapsed2 = clock.getElapsedTime();
std::cout << elapsed2.asSeconds() << std::endl;

Помните, что метод restart также возвращает прошедшее время, так что вы можете избежать незначительной задержки, которая будет вызвана в случае, если getElapsedTimе вызывается перед restart.

Ниже приведен пример использования прошедшего времени для осуществления итераций цикла обновления игровой логики:

sf::Clock clock;
while (window.isOpen())
{
    sf::Time elapsed = clock.restart();
    updateGame(elapsed);
    ...
}

Следующая статье: Потоки в SFML.

Автор: HighMem

Источник

Поделиться новостью

* - обязательные к заполнению поля