diff options
Diffstat (limited to 'src/libjin/time')
-rw-r--r-- | src/libjin/time/je_timer.cpp | 122 | ||||
-rw-r--r-- | src/libjin/time/je_timer.h | 137 |
2 files changed, 259 insertions, 0 deletions
diff --git a/src/libjin/time/je_timer.cpp b/src/libjin/time/je_timer.cpp new file mode 100644 index 0000000..8dc5e86 --- /dev/null +++ b/src/libjin/time/je_timer.cpp @@ -0,0 +1,122 @@ +#include "../core/je_configuration.h" +#if defined(jin_time) + +#include "je_timer.h" + +namespace JinEngine +{ + namespace Time + { + + + Timer::Timer() + : mHandlers() + { + } + + Timer::~Timer() + { + for (int i = 0; i < mHandlers.size(); ++i) + delete mHandlers[i]; + } + + void Timer::update(float dt) + { + // Process handler. + std::vector<Handler*>::iterator it = mHandlers.begin(); + for (; it != mHandlers.end(); ++it) + (*it)->process(dt); + // Erase canceled handler. + for (it = mHandlers.begin(); it != mHandlers.end();) + { + if ((*it)->canceled) + { + Handler* h = *it; + it = mHandlers.erase(it); + delete h; + } + else + ++it; + } + } + + void Timer::cancel(Handler* handler) + { + if(handler != nullptr) + handler->canceled = true; + } + + void Timer::cancelAll() + { + for (auto h : mHandlers) + cancel(h); + } + + Timer::Handler* Timer::every(float dt, TimerCallback callback, void* p, FinishCallback finish) + { + Handler* t = new Handler(Handler::EVERY, dt, 0, callback, p, finish); + mHandlers.push_back(t); + return t; + } + + Timer::Handler* Timer::after(float dt, TimerCallback callback, void* p, FinishCallback finish) + { + Handler* t = new Handler(Handler::AFTER, dt, 0, callback, p, finish); + mHandlers.push_back(t); + return t; + } + + Timer::Handler* Timer::repeat(float dt, int count, TimerCallback callback, void* p, FinishCallback finish) + { + Handler* t = new Handler(Handler::REPEAT, dt, count, callback, p, finish); + mHandlers.push_back(t); + return t; + } + + Timer::Handler::Handler(Type t, float d, int c, TimerCallback f, void* p, FinishCallback finishcallback) + : type(t) + , duration(d) + , count(c) + , tickdown(d) + , countdown(c) + , callback(f) + , paramters(p) + , canceled(false) + , finishCallback(finishcallback) + { + } + + Timer::Handler::~Handler() + { + if (finishCallback != nullptr) + finishCallback(paramters); + } + + void Timer::Handler::process(float dt) + { + tickdown -= dt; + if (tickdown <= 0) + { + tickdown += duration; + if (!canceled && callback != nullptr) + callback(paramters); + if (type == EVERY) + { + } + else if (type == AFTER) + { + canceled = true; + } + else if (type == REPEAT) + { + --countdown; + if (countdown <= 0) + canceled = true; + } + } + } + + } // namespace Time +} // namespace JinEngine + +#endif // defined(jin_time)
\ No newline at end of file diff --git a/src/libjin/time/je_timer.h b/src/libjin/time/je_timer.h new file mode 100644 index 0000000..31cd322 --- /dev/null +++ b/src/libjin/time/je_timer.h @@ -0,0 +1,137 @@ +#ifndef __JE_TIMER_H__ +#define __JE_TIMER_H__ +#include "../core/je_configuration.h" +#if defined(jin_time) + +#include <vector> +#include <functional> + +#include "SDL2/SDL.h" + +namespace JinEngine +{ + namespace Time + { + + /// + /// + /// + class Timer + { + public: + + typedef std::function<void(void*)> TimerCallback; + + typedef std::function<void(void*)> FinishCallback; + + /// + /// + /// + class Handler + { + public: + friend class Timer; + enum Type + { + EVERY, + AFTER, + REPEAT, + }; + Handler(Type type, float duration, int count = 0, TimerCallback callback = nullptr, void* paramters = nullptr, FinishCallback finishcallback = nullptr); + virtual ~Handler(); + void process(float dt); + + protected: + int count; + int countdown; + float duration; + float tickdown; + Type type; + TimerCallback callback; + FinishCallback finishCallback; + void* paramters; + bool canceled; + }; + + /// + /// + /// + Timer(); + + /// + /// + /// + ~Timer(); + + /// + /// + /// + void update(float dt); + + /// + /// + /// + Handler* every(float dt, TimerCallback callback, void* paramters, FinishCallback finish); + + /// + /// + /// + Handler* after(float dt, TimerCallback callback, void* paramters, FinishCallback finish); + + /// + /// + /// + Handler* repeat(float dt, int count, TimerCallback callback, void* paramters, FinishCallback finish); + + /// + /// + /// + void cancel(Handler* handler); + + /// + /// + /// + void cancelAll(); + + private: + + std::vector<Handler*> mHandlers; + + }; + + /// + /// + /// + inline void sleep(int ms) + { + #if jin_time == jin_time_sdl + SDL_Delay(ms); + #endif + } + + /// + /// + /// + inline double getSecond() + { + #if jin_time == jin_time_sdl + return SDL_GetTicks() / 1000.f; + #endif + } + + /// + /// + /// + inline double getMilliSecond() + { + #if jin_time == jin_time_sdl + return SDL_GetTicks(); + #endif + } + + } // namespace Time +} // namespace JinEngine + +#endif // defined(jin_time) + +#endif // __JE_TIMER_H__
\ No newline at end of file |