mirror of
https://github.com/SFML/SFML.git
synced 2025-01-31 13:45:13 +08:00
dff83039aa
Using \a command displays the next word in italics ignoring the markdown format so \a `something` display `something` in italics including backticks. Removing \a so that backticks are properly interpreted.
501 lines
17 KiB
C++
501 lines
17 KiB
C++
////////////////////////////////////////////////////////////
|
|
//
|
|
// SFML - Simple and Fast Multimedia Library
|
|
// Copyright (C) 2007-2024 Laurent Gomila (laurent@sfml-dev.org)
|
|
//
|
|
// This software is provided 'as-is', without any express or implied warranty.
|
|
// In no event will the authors be held liable for any damages arising from the use of this software.
|
|
//
|
|
// Permission is granted to anyone to use this software for any purpose,
|
|
// including commercial applications, and to alter it and redistribute it freely,
|
|
// subject to the following restrictions:
|
|
//
|
|
// 1. The origin of this software must not be misrepresented;
|
|
// you must not claim that you wrote the original software.
|
|
// If you use this software in a product, an acknowledgment
|
|
// in the product documentation would be appreciated but is not required.
|
|
//
|
|
// 2. Altered source versions must be plainly marked as such,
|
|
// and must not be misrepresented as being the original software.
|
|
//
|
|
// 3. This notice may not be removed or altered from any source distribution.
|
|
//
|
|
////////////////////////////////////////////////////////////
|
|
|
|
#pragma once
|
|
|
|
////////////////////////////////////////////////////////////
|
|
// Headers
|
|
////////////////////////////////////////////////////////////
|
|
#include <chrono>
|
|
|
|
#include <cstdint>
|
|
|
|
|
|
namespace sf
|
|
{
|
|
////////////////////////////////////////////////////////////
|
|
/// \brief Represents a time value
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
class Time
|
|
{
|
|
public:
|
|
////////////////////////////////////////////////////////////
|
|
/// \brief Default constructor
|
|
///
|
|
/// Sets the time value to zero.
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
constexpr Time() = default;
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \brief Construct from `std::chrono::duration`
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
template <typename Rep, typename Period>
|
|
constexpr Time(const std::chrono::duration<Rep, Period>& duration);
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \brief Return the time value as a number of seconds
|
|
///
|
|
/// \return Time in seconds
|
|
///
|
|
/// \see `asMilliseconds`, `asMicroseconds`
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
[[nodiscard]] constexpr float asSeconds() const;
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \brief Return the time value as a number of milliseconds
|
|
///
|
|
/// \return Time in milliseconds
|
|
///
|
|
/// \see `asSeconds`, `asMicroseconds`
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
[[nodiscard]] constexpr std::int32_t asMilliseconds() const;
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \brief Return the time value as a number of microseconds
|
|
///
|
|
/// \return Time in microseconds
|
|
///
|
|
/// \see `asSeconds`, `asMilliseconds`
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
[[nodiscard]] constexpr std::int64_t asMicroseconds() const;
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \brief Return the time value as a `std::chrono::duration`
|
|
///
|
|
/// \return Time in microseconds
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
[[nodiscard]] constexpr std::chrono::microseconds toDuration() const;
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \brief Implicit conversion to `std::chrono::duration`
|
|
///
|
|
/// \return Duration in microseconds
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
template <typename Rep, typename Period>
|
|
constexpr operator std::chrono::duration<Rep, Period>() const;
|
|
|
|
////////////////////////////////////////////////////////////
|
|
// Static member data
|
|
////////////////////////////////////////////////////////////
|
|
// NOLINTNEXTLINE(readability-identifier-naming)
|
|
static const Time Zero; //!< Predefined "zero" time value
|
|
|
|
private:
|
|
////////////////////////////////////////////////////////////
|
|
// Member data
|
|
////////////////////////////////////////////////////////////
|
|
std::chrono::microseconds m_microseconds{}; //!< Time value stored as microseconds
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \relates Time
|
|
/// \brief Construct a time value from a number of seconds
|
|
///
|
|
/// \param amount Number of seconds
|
|
///
|
|
/// \return Time value constructed from the amount of seconds
|
|
///
|
|
/// \see `milliseconds`, `microseconds`
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
[[nodiscard]] constexpr Time seconds(float amount);
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \relates Time
|
|
/// \brief Construct a time value from a number of milliseconds
|
|
///
|
|
/// \param amount Number of milliseconds
|
|
///
|
|
/// \return Time value constructed from the amount of milliseconds
|
|
///
|
|
/// \see `seconds`, `microseconds`
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
[[nodiscard]] constexpr Time milliseconds(std::int32_t amount);
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \relates Time
|
|
/// \brief Construct a time value from a number of microseconds
|
|
///
|
|
/// \param amount Number of microseconds
|
|
///
|
|
/// \return Time value constructed from the amount of microseconds
|
|
///
|
|
/// \see `seconds`, `milliseconds`
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
[[nodiscard]] constexpr Time microseconds(std::int64_t amount);
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \relates Time
|
|
/// \brief Overload of `operator==` to compare two time values
|
|
///
|
|
/// \param left Left operand (a time)
|
|
/// \param right Right operand (a time)
|
|
///
|
|
/// \return `true` if both time values are equal
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
[[nodiscard]] constexpr bool operator==(Time left, Time right);
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \relates Time
|
|
/// \brief Overload of `operator!=` to compare two time values
|
|
///
|
|
/// \param left Left operand (a time)
|
|
/// \param right Right operand (a time)
|
|
///
|
|
/// \return `true` if both time values are different
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
[[nodiscard]] constexpr bool operator!=(Time left, Time right);
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \relates Time
|
|
/// \brief Overload of `operator<` to compare two time values
|
|
///
|
|
/// \param left Left operand (a time)
|
|
/// \param right Right operand (a time)
|
|
///
|
|
/// \return `true` if `left` is lesser than `right`
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
[[nodiscard]] constexpr bool operator<(Time left, Time right);
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \relates Time
|
|
/// \brief Overload of `operator>` to compare two time values
|
|
///
|
|
/// \param left Left operand (a time)
|
|
/// \param right Right operand (a time)
|
|
///
|
|
/// \return `true` if `left` is greater than `right`
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
[[nodiscard]] constexpr bool operator>(Time left, Time right);
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \relates Time
|
|
/// \brief Overload of `operator<=` to compare two time values
|
|
///
|
|
/// \param left Left operand (a time)
|
|
/// \param right Right operand (a time)
|
|
///
|
|
/// \return `true` if `left` is lesser or equal than `right`
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
[[nodiscard]] constexpr bool operator<=(Time left, Time right);
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \relates Time
|
|
/// \brief Overload of `operator>=` to compare two time values
|
|
///
|
|
/// \param left Left operand (a time)
|
|
/// \param right Right operand (a time)
|
|
///
|
|
/// \return `true` if `left` is greater or equal than `right`
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
[[nodiscard]] constexpr bool operator>=(Time left, Time right);
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \relates Time
|
|
/// \brief Overload of unary `operator-` to negate a time value
|
|
///
|
|
/// \param right Right operand (a time)
|
|
///
|
|
/// \return Opposite of the time value
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
[[nodiscard]] constexpr Time operator-(Time right);
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \relates Time
|
|
/// \brief Overload of binary `operator+` to add two time values
|
|
///
|
|
/// \param left Left operand (a time)
|
|
/// \param right Right operand (a time)
|
|
///
|
|
/// \return Sum of the two times values
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
[[nodiscard]] constexpr Time operator+(Time left, Time right);
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \relates Time
|
|
/// \brief Overload of binary `operator+=` to add/assign two time values
|
|
///
|
|
/// \param left Left operand (a time)
|
|
/// \param right Right operand (a time)
|
|
///
|
|
/// \return Sum of the two times values
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
constexpr Time& operator+=(Time& left, Time right);
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \relates Time
|
|
/// \brief Overload of binary `operator-` to subtract two time values
|
|
///
|
|
/// \param left Left operand (a time)
|
|
/// \param right Right operand (a time)
|
|
///
|
|
/// \return Difference of the two times values
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
[[nodiscard]] constexpr Time operator-(Time left, Time right);
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \relates Time
|
|
/// \brief Overload of binary `operator-=` to subtract/assign two time values
|
|
///
|
|
/// \param left Left operand (a time)
|
|
/// \param right Right operand (a time)
|
|
///
|
|
/// \return Difference of the two times values
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
constexpr Time& operator-=(Time& left, Time right);
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \relates Time
|
|
/// \brief Overload of binary `operator*` to scale a time value
|
|
///
|
|
/// \param left Left operand (a time)
|
|
/// \param right Right operand (a number)
|
|
///
|
|
/// \return `left` multiplied by `right`
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
[[nodiscard]] constexpr Time operator*(Time left, float right);
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \relates Time
|
|
/// \brief Overload of binary `operator*` to scale a time value
|
|
///
|
|
/// \param left Left operand (a time)
|
|
/// \param right Right operand (a number)
|
|
///
|
|
/// \return `left` multiplied by `right`
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
[[nodiscard]] constexpr Time operator*(Time left, std::int64_t right);
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \relates Time
|
|
/// \brief Overload of binary `operator*` to scale a time value
|
|
///
|
|
/// \param left Left operand (a number)
|
|
/// \param right Right operand (a time)
|
|
///
|
|
/// \return `left` multiplied by `right`
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
[[nodiscard]] constexpr Time operator*(float left, Time right);
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \relates Time
|
|
/// \brief Overload of binary `operator*` to scale a time value
|
|
///
|
|
/// \param left Left operand (a number)
|
|
/// \param right Right operand (a time)
|
|
///
|
|
/// \return `left` multiplied by `right`
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
[[nodiscard]] constexpr Time operator*(std::int64_t left, Time right);
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \relates Time
|
|
/// \brief Overload of binary `operator*=` to scale/assign a time value
|
|
///
|
|
/// \param left Left operand (a time)
|
|
/// \param right Right operand (a number)
|
|
///
|
|
/// \return `left` multiplied by `right`
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
constexpr Time& operator*=(Time& left, float right);
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \relates Time
|
|
/// \brief Overload of binary `operator*=` to scale/assign a time value
|
|
///
|
|
/// \param left Left operand (a time)
|
|
/// \param right Right operand (a number)
|
|
///
|
|
/// \return `left` multiplied by `right`
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
constexpr Time& operator*=(Time& left, std::int64_t right);
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \relates Time
|
|
/// \brief Overload of binary `operator/` to scale a time value
|
|
///
|
|
/// \param left Left operand (a time)
|
|
/// \param right Right operand (a number)
|
|
///
|
|
/// \return `left` divided by `right`
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
[[nodiscard]] constexpr Time operator/(Time left, float right);
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \relates Time
|
|
/// \brief Overload of binary `operator/` to scale a time value
|
|
///
|
|
/// \param left Left operand (a time)
|
|
/// \param right Right operand (a number)
|
|
///
|
|
/// \return `left` divided by `right`
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
[[nodiscard]] constexpr Time operator/(Time left, std::int64_t right);
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \relates Time
|
|
/// \brief Overload of binary `operator/=` to scale/assign a time value
|
|
///
|
|
/// \param left Left operand (a time)
|
|
/// \param right Right operand (a number)
|
|
///
|
|
/// \return `left` divided by `right`
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
constexpr Time& operator/=(Time& left, float right);
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \relates Time
|
|
/// \brief Overload of binary `operator/=` to scale/assign a time value
|
|
///
|
|
/// \param left Left operand (a time)
|
|
/// \param right Right operand (a number)
|
|
///
|
|
/// \return `left` divided by `right`
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
constexpr Time& operator/=(Time& left, std::int64_t right);
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \relates Time
|
|
/// \brief Overload of binary `operator/` to compute the ratio of two time values
|
|
///
|
|
/// \param left Left operand (a time)
|
|
/// \param right Right operand (a time)
|
|
///
|
|
/// \return `left` divided by `right`
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
[[nodiscard]] constexpr float operator/(Time left, Time right);
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \relates Time
|
|
/// \brief Overload of binary `operator%` to compute remainder of a time value
|
|
///
|
|
/// \param left Left operand (a time)
|
|
/// \param right Right operand (a time)
|
|
///
|
|
/// \return `left` modulo `right`
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
[[nodiscard]] constexpr Time operator%(Time left, Time right);
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \relates Time
|
|
/// \brief Overload of binary `operator%=` to compute/assign remainder of a time value
|
|
///
|
|
/// \param left Left operand (a time)
|
|
/// \param right Right operand (a time)
|
|
///
|
|
/// \return `left` modulo `right`
|
|
///
|
|
////////////////////////////////////////////////////////////
|
|
constexpr Time& operator%=(Time& left, Time right);
|
|
|
|
} // namespace sf
|
|
|
|
#include <SFML/System/Time.inl>
|
|
|
|
|
|
////////////////////////////////////////////////////////////
|
|
/// \class sf::Time
|
|
/// \ingroup system
|
|
///
|
|
/// `sf::Time` encapsulates a time value in a flexible way.
|
|
/// It allows to define a time value either as a number of
|
|
/// seconds, milliseconds or microseconds. It also works the
|
|
/// other way round: you can read a time value as either
|
|
/// a number of seconds, milliseconds or microseconds. It
|
|
/// even interoperates with the `<chrono>` header. You can
|
|
/// construct an `sf::Time` from a `chrono::duration` and read
|
|
/// any `sf::Time` as a chrono::duration.
|
|
///
|
|
/// By using such a flexible interface, the API doesn't
|
|
/// impose any fixed type or resolution for time values,
|
|
/// and let the user choose its own favorite representation.
|
|
///
|
|
/// Time values support the usual mathematical operations:
|
|
/// you can add or subtract two times, multiply or divide
|
|
/// a time by a number, compare two times, etc.
|
|
///
|
|
/// Since they represent a time span and not an absolute time
|
|
/// value, times can also be negative.
|
|
///
|
|
/// Usage example:
|
|
/// \code
|
|
/// sf::Time t1 = sf::seconds(0.1f);
|
|
/// std::int32_t milli = t1.asMilliseconds(); // 100
|
|
///
|
|
/// sf::Time t2 = sf::milliseconds(30);
|
|
/// std::int64_t micro = t2.asMicroseconds(); // 30000
|
|
///
|
|
/// sf::Time t3 = sf::microseconds(-800000);
|
|
/// float sec = t3.asSeconds(); // -0.8
|
|
///
|
|
/// sf::Time t4 = std::chrono::milliseconds(250);
|
|
/// std::chrono::microseconds micro2 = t4.toDuration(); // 250000us
|
|
/// \endcode
|
|
///
|
|
/// \code
|
|
/// void update(sf::Time elapsed)
|
|
/// {
|
|
/// position += speed * elapsed.asSeconds();
|
|
/// }
|
|
///
|
|
/// update(sf::milliseconds(100));
|
|
/// \endcode
|
|
///
|
|
/// \see `sf::Clock`
|
|
///
|
|
////////////////////////////////////////////////////////////
|