Pull to refresh

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

Reading time 3 min
Views 16K


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

Оглавление:
0.1 Вступление

1. Приступая к работе

  1. SFML и Visual Studio
  2. SFML и Code::Blocks (MinGW)
  3. SFML и Linux
  4. SFML и Xcode (Mac OS X)
  5. Компиляция SFML с помощью CMake

2. Модуль System

  1. Обработка времени
  2. Потоки
  3. Работа с пользовательскими потоками данных

3. Модуль Window

  1. Открытие и управление окнами
  2. Обработка событий
  3. Работа с клавиатурой, мышью и джойстиками
  4. Использование OpenGL

4. Модуль Graphics

  1. Рисование 2D объектов
  2. Спрайты и текстуры
  3. Текст и шрифты
  4. Формы
  5. Проектирование ваших собственных объектов с помощью массивов вершин
  6. Позиция, вращение, масштаб: преобразование объектов
  7. Добавление специальных эффектов с шейдерами
  8. Контроль 2D камеры и вида

5. Модуль Audio

  1. Проигрывание звуков и музыки
  2. Запись аудио
  3. Пользовательские потоки аудио
  4. Спатиализация: звуки в 3D

6. Модуль Network

  1. Коммуникация с использованием сокетов
  2. Использование и расширение пакетов
  3. Веб-запросы с помощью HTTP
  4. Передача файлов с помощью FTP


Время в 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);
    ...
}


Следующая статье: Потоки.
Tags:
Hubs:
+8
Comments 5
Comments Comments 5

Articles