应用Time和Duration类

This commit is contained in:
Nomango 2018-07-22 00:41:24 +08:00
parent 7d17c3b225
commit c3ebe2545a
13 changed files with 155 additions and 52 deletions

View File

@ -24,7 +24,7 @@ bool e2d::Action::isRunning()
void e2d::Action::resume() void e2d::Action::resume()
{ {
_running = true; _running = true;
_last = Game::getInstance()->getTotalTime(); _last = Game::getInstance()->getTotalDuration().seconds();
} }
void e2d::Action::pause() void e2d::Action::pause()
@ -56,7 +56,7 @@ void e2d::Action::reset()
{ {
_initialized = false; _initialized = false;
_done = false; _done = false;
_last = Game::getInstance()->getTotalTime(); _last = Game::getInstance()->getTotalDuration().seconds();
} }
bool e2d::Action::_isDone() bool e2d::Action::_isDone()
@ -74,7 +74,7 @@ void e2d::Action::_startWithTarget(Node* target)
void e2d::Action::_init() void e2d::Action::_init()
{ {
_initialized = true; _initialized = true;
_last = Game::getInstance()->getTotalTime(); _last = Game::getInstance()->getTotalDuration().seconds();
} }
void e2d::Action::_update() void e2d::Action::_update()

View File

@ -56,7 +56,8 @@ void e2d::Animate::_update()
return; return;
} }
while ((Game::getInstance()->getTotalTime() - _last) >= _animation->getInterval()) auto game = Game::getInstance();
while ((game->getTotalDuration().seconds() - _last) >= _animation->getInterval())
{ {
auto& frames = _animation->getFrames(); auto& frames = _animation->getFrames();
auto target = dynamic_cast<Sprite*>(_target); auto target = dynamic_cast<Sprite*>(_target);
@ -80,7 +81,7 @@ void e2d::Animate::_update()
void e2d::Animate::_resetTime() void e2d::Animate::_resetTime()
{ {
Action::_resetTime(); Action::_resetTime();
_last = Game::getInstance()->getTotalTime(); _last = Game::getInstance()->getTotalDuration().seconds();
} }
void e2d::Animate::reset() void e2d::Animate::reset()

View File

@ -31,7 +31,7 @@ void e2d::Delay::_update()
{ {
Action::_update(); Action::_update();
_delta = Game::getInstance()->getTotalTime() - _last; _delta = Game::getInstance()->getTotalDuration().seconds() - _last;
if (_delta >= _delay) if (_delta >= _delay)
{ {
@ -42,5 +42,5 @@ void e2d::Delay::_update()
void e2d::Delay::_resetTime() void e2d::Delay::_resetTime()
{ {
Action::_resetTime(); Action::_resetTime();
_last = Game::getInstance()->getTotalTime() - _delta; _last = Game::getInstance()->getTotalDuration().seconds() - _delta;
} }

View File

@ -28,7 +28,7 @@ void e2d::FiniteTimeAction::_update()
} }
else else
{ {
_delta = std::min((Game::getInstance()->getTotalTime() - _last) / _duration, 1.0); _delta = std::min((Game::getInstance()->getTotalDuration().seconds() - _last) / _duration, 1.0);
if (_delta >= 1) if (_delta >= 1)
{ {
@ -40,5 +40,5 @@ void e2d::FiniteTimeAction::_update()
void e2d::FiniteTimeAction::_resetTime() void e2d::FiniteTimeAction::_resetTime()
{ {
Action::_resetTime(); Action::_resetTime();
_last = Game::getInstance()->getTotalTime() - _delta * _duration; _last = Game::getInstance()->getTotalDuration().seconds() - _delta * _duration;
} }

View File

@ -15,7 +15,7 @@ e2d::Game::Game()
{ {
CoInitialize(nullptr); CoInitialize(nullptr);
_start = _last = _now = steady_clock::now(); _start = _last = _now = Time::now();
} }
e2d::Game::~Game() e2d::Game::~Game()
@ -67,16 +67,16 @@ void e2d::Game::start()
window->poll(); window->poll();
// ¿ªÊ¼ÓÎÏ· // ¿ªÊ¼ÓÎÏ·
const milliseconds frameInterval(15LL); Duration frameInterval(15), interval;
milliseconds wait, interval; int wait = 0;
_ended = false; _ended = false;
_last = _now = steady_clock::now(); _last = _now = Time::now();
while (!_ended) while (!_ended)
{ {
_now = steady_clock::now(); _now = Time::now();
interval = duration_cast<milliseconds>(_now - _last); interval = _now - _last;
if (frameInterval < interval) if (frameInterval < interval)
{ {
@ -93,10 +93,10 @@ void e2d::Game::start()
} }
else else
{ {
wait = frameInterval - interval; wait = (frameInterval - interval).milliseconds() - 1;
if (wait.count() > 1LL) if (wait > 1)
{ {
std::this_thread::sleep_for(wait - milliseconds(1LL)); std::this_thread::sleep_for(milliseconds(wait));
} }
} }
} }
@ -111,7 +111,7 @@ void e2d::Game::resume()
{ {
if (_paused && !_ended) if (_paused && !_ended)
{ {
_last = _now = steady_clock::now(); _last = _now = Time::now();
Timer::getInstance()->updateTime(); Timer::getInstance()->updateTime();
ActionManager::getInstance()->updateTime(); ActionManager::getInstance()->updateTime();
} }
@ -141,9 +141,9 @@ e2d::Config* e2d::Game::getConfig()
return _config; return _config;
} }
double e2d::Game::getTotalTime() const e2d::Duration e2d::Game::getTotalDuration() const
{ {
return duration_cast<microseconds>(steady_clock::now() - _start).count() / 1000.0 / 1000.0; return std::move(_now - _start);
} }
void e2d::Game::quit() void e2d::Game::quit()

View File

@ -161,11 +161,12 @@ void e2d::Renderer::_renderFps()
{ {
++_renderTimes; ++_renderTimes;
double fDelay = Game::getInstance()->getTotalTime() - _lastRenderTime; double duration = Game::getInstance()->getTotalDuration().seconds();
double fDelay = duration - _lastRenderTime;
if (fDelay >= 0.1) if (fDelay >= 0.1)
{ {
_fpsText = String::format(L"FPS: %.1lf", (1 / fDelay) * _renderTimes); _fpsText = String::format(L"FPS: %.1lf", (1 / fDelay) * _renderTimes);
_lastRenderTime = Game::getInstance()->getTotalTime(); _lastRenderTime = duration;
_renderTimes = 0; _renderTimes = 0;
} }

View File

@ -3,15 +3,70 @@
using namespace std::chrono; using namespace std::chrono;
e2d::Duration::Duration() e2d::Duration::Duration()
: ms()
{ {
} }
e2d::Duration e2d::Duration::operator+(Duration const & size) const e2d::Duration::Duration(int ms)
: ms(ms)
{ {
return Duration();
} }
e2d::Duration e2d::Duration::operator-(Duration const & size) const int e2d::Duration::milliseconds() const
{ {
return Duration(); return static_cast<int>(ms.count());
}
double e2d::Duration::seconds() const
{
return ms.count() / 1000.0;
}
double e2d::Duration::minutes() const
{
return ms.count() / 1000.0 / 60.0;
}
bool e2d::Duration::operator==(const Duration & other) const
{
return ms == other.ms;
}
bool e2d::Duration::operator!=(const Duration & other) const
{
return ms != other.ms;
}
bool e2d::Duration::operator>(const Duration & other) const
{
return ms > other.ms;
}
bool e2d::Duration::operator>=(const Duration & other) const
{
return ms >= other.ms;
}
bool e2d::Duration::operator<(const Duration & other) const
{
return ms < other.ms;
}
bool e2d::Duration::operator<=(const Duration & other) const
{
return ms <= other.ms;
}
e2d::Duration e2d::Duration::operator+(Duration const & other) const
{
Duration result;
result.ms = ms + other.ms;
return std::move(result);
}
e2d::Duration e2d::Duration::operator-(Duration const & other) const
{
Duration result;
result.ms = ms - other.ms;
return std::move(result);
} }

View File

@ -7,12 +7,28 @@ e2d::Time::Time()
{ {
} }
e2d::Time e2d::Time::operator+(Duration const & size) const time_t e2d::Time::getTimeStamp() const
{ {
return Time(); auto now = time_point_cast<milliseconds>(time).time_since_epoch();
return static_cast<time_t>(now.count());
} }
e2d::Duration e2d::Time::operator-(Time const & size) const e2d::Time e2d::Time::operator+(Duration const & other) const
{ {
return Duration(); Time result;
result.time = time - other.ms;
return std::move(result);
}
e2d::Duration e2d::Time::operator-(Time const & other) const
{
int ms = static_cast<int>(duration_cast<milliseconds>(time - other.time).count());
return std::move(Duration(ms));
}
e2d::Time e2d::Time::now()
{
Time now;
now.time = steady_clock::now();
return std::move(now);
} }

View File

@ -60,7 +60,7 @@ bool e2d::Task::isReady() const
{ {
return true; return true;
} }
if ((Game::getInstance()->getTotalTime() - _lastTime) >= _delay) if ((Game::getInstance()->getTotalDuration().seconds() - _lastTime) >= _delay)
{ {
return true; return true;
} }
@ -80,5 +80,5 @@ e2d::String e2d::Task::getName() const
void e2d::Task::updateTime() void e2d::Task::updateTime()
{ {
_lastTime = Game::getInstance()->getTotalTime(); _lastTime = Game::getInstance()->getTotalDuration().seconds();
} }

View File

@ -4,7 +4,7 @@
e2d::Transition::Transition(double duration) e2d::Transition::Transition(double duration)
: _end(false) : _end(false)
, _last(0) , _last()
, _delta(0) , _delta(0)
, _outScene(nullptr) , _outScene(nullptr)
, _inScene(nullptr) , _inScene(nullptr)
@ -45,7 +45,7 @@ void e2d::Transition::_init(Scene * prev, Scene * next)
throw SystemException(L"场景过渡动画图层创建失败"); throw SystemException(L"场景过渡动画图层创建失败");
} }
_last = Game::getInstance()->getTotalTime(); _last = Game::getInstance()->getTotalDuration();
_outScene = prev; _outScene = prev;
_inScene = next; _inScene = next;
GC::retain(_outScene); GC::retain(_outScene);
@ -64,7 +64,8 @@ void e2d::Transition::_update()
} }
else else
{ {
_delta = std::min((Game::getInstance()->getTotalTime() - _last) / _duration, 1.0); _delta = (Game::getInstance()->getTotalDuration() - _last).seconds() / _duration;
_delta = std::min(_delta, 1.0);
} }
this->_updateCustom(); this->_updateCustom();

View File

@ -46,7 +46,8 @@ public:
// »ñÈ¡ÓÎÏ·ÅäÖà // »ñÈ¡ÓÎÏ·ÅäÖÃ
Config* getConfig(); Config* getConfig();
double getTotalTime() const; // 获取游戏总时长
Duration getTotalDuration() const;
private: private:
Game(); Game();
@ -59,9 +60,9 @@ private:
bool _ended; bool _ended;
bool _paused; bool _paused;
Config* _config; Config* _config;
std::chrono::steady_clock::time_point _start; Time _start;
std::chrono::steady_clock::time_point _now; Time _now;
std::chrono::steady_clock::time_point _last; Time _last;
static Game * _instance; static Game * _instance;
}; };

View File

@ -410,11 +410,31 @@ class Duration
public: public:
Duration(); Duration();
Duration operator + (Duration const & size) const; explicit Duration(
Duration operator - (Duration const & size) const; int ms
);
protected: // 获取毫秒数
std::chrono::milliseconds _duration; int milliseconds() const;
// 获取秒数
double seconds() const;
// 获取分钟数
double minutes() const;
bool operator== (const Duration &) const;
bool operator!= (const Duration &) const;
bool operator> (const Duration &) const;
bool operator>= (const Duration &) const;
bool operator< (const Duration &) const;
bool operator<= (const Duration &) const;
Duration operator + (Duration const & other) const;
Duration operator - (Duration const & other) const;
public:
std::chrono::milliseconds ms;
}; };
@ -424,11 +444,19 @@ class Time
public: public:
Time(); Time();
Time operator + (Duration const & size) const; // 获取时间戳
Duration operator - (Time const & size) const; time_t getTimeStamp() const;
protected: // 计算时间间隔后的时间点
std::chrono::steady_clock::time_point _time; Time operator + (Duration const & other) const;
// 计算两时间点的时间间隔
Duration operator - (Time const & other) const;
// 获取当前时间
static Time now();
public:
std::chrono::steady_clock::time_point time;
}; };

View File

@ -46,9 +46,9 @@ protected:
protected: protected:
bool _end; bool _end;
double _last;
double _duration; double _duration;
double _delta; double _delta;
Duration _last;
Size _windowSize; Size _windowSize;
Scene * _outScene; Scene * _outScene;
Scene * _inScene; Scene * _inScene;