diff options
Diffstat (limited to 'src/libjin/Time')
-rw-r--r-- | src/libjin/Time/je_timer.cpp | 98 | ||||
-rw-r--r-- | src/libjin/Time/je_timer.h | 88 |
2 files changed, 114 insertions, 72 deletions
diff --git a/src/libjin/Time/je_timer.cpp b/src/libjin/Time/je_timer.cpp index a2f2486..8dc5e86 100644 --- a/src/libjin/Time/je_timer.cpp +++ b/src/libjin/Time/je_timer.cpp @@ -9,52 +9,71 @@ namespace JinEngine { - Timers::Timers() - : timers() + Timer::Timer() + : mHandlers() { } - Timers::~Timers() + Timer::~Timer() { - for (int i = 0; i < timers.size(); ++i) - delete timers[i]; + for (int i = 0; i < mHandlers.size(); ++i) + delete mHandlers[i]; } - void Timers::update(int ms) + void Timer::update(float dt) { - std::vector<Timer*>::iterator it = timers.begin(); - for (; it != timers.end(); ) - { - if (!(*it)->process(ms)) - { - Timer* t = *it; - timers.erase(it); - delete t; - return; - } - ++it; - } + // 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 Timers::every(int ms, timer_callback callback, void* p) + 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) { - Timer* t = new Timer(Timer::EVERY, ms, 0, callback, p); - timers.push_back(t); + Handler* t = new Handler(Handler::EVERY, dt, 0, callback, p, finish); + mHandlers.push_back(t); + return t; } - void Timers::after(int ms, timer_callback callback, void* p) + Timer::Handler* Timer::after(float dt, TimerCallback callback, void* p, FinishCallback finish) { - Timer* t = new Timer(Timer::AFTER, ms, 0, callback, p); - timers.push_back(t); + Handler* t = new Handler(Handler::AFTER, dt, 0, callback, p, finish); + mHandlers.push_back(t); + return t; } - void Timers::repeat(int ms, int count, timer_callback callback, void* p) + Timer::Handler* Timer::repeat(float dt, int count, TimerCallback callback, void* p, FinishCallback finish) { - Timer* t = new Timer(Timer::REPEAT, ms, count, callback, p); - timers.push_back(t); + Handler* t = new Handler(Handler::REPEAT, dt, count, callback, p, finish); + mHandlers.push_back(t); + return t; } - Timers::Timer::Timer(Type t, int d, int c, timer_callback f, void* p) + Timer::Handler::Handler(Type t, float d, int c, TimerCallback f, void* p, FinishCallback finishcallback) : type(t) , duration(d) , count(c) @@ -62,39 +81,42 @@ namespace JinEngine , countdown(c) , callback(f) , paramters(p) + , canceled(false) + , finishCallback(finishcallback) { } - Timers::Timer::~Timer() + Timer::Handler::~Handler() { + if (finishCallback != nullptr) + finishCallback(paramters); } - bool Timers::Timer::process(int ms) + void Timer::Handler::process(float dt) { - tickdown -= ms; + tickdown -= dt; if (tickdown <= 0) { - tickdown = duration; - if (callback != nullptr) + tickdown += duration; + if (!canceled && callback != nullptr) callback(paramters); if (type == EVERY) { } else if (type == AFTER) { - return false; + canceled = true; } else if (type == REPEAT) { --countdown; - if (countdown <= 0) - return false; + if (countdown <= 0) + canceled = true; } } - return true; } } // namespace Time } // namespace JinEngine -#endif // defined(jin_time) +#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 index b6b4b9e..31cd322 100644 --- a/src/libjin/Time/je_timer.h +++ b/src/libjin/Time/je_timer.h @@ -1,9 +1,11 @@ -#ifndef __JE_TIMER_H -#define __JE_TIMER_H +#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 @@ -14,68 +16,86 @@ namespace JinEngine /// /// /// - class Timers + class Timer { public: - typedef void(*timer_callback)(void* prameters); + + typedef std::function<void(void*)> TimerCallback; + + typedef std::function<void(void*)> FinishCallback; /// /// /// - Timers(); + 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; + }; /// /// /// - ~Timers(); + Timer(); /// /// /// - void update(int ms); + ~Timer(); /// /// /// - void every(int ms, timer_callback callback, void* paramters); + void update(float dt); /// /// /// - void after(int ms, timer_callback callback, void* paramters); + Handler* every(float dt, TimerCallback callback, void* paramters, FinishCallback finish); /// /// /// - void repeat(int ms, int count, timer_callback callback, void* paramters); + Handler* after(float dt, TimerCallback callback, void* paramters, FinishCallback finish); - private: + /// + /// + /// + Handler* repeat(float dt, int count, TimerCallback callback, void* paramters, FinishCallback finish); /// /// /// - class Timer - { - public: - enum Type - { - EVERY, - AFTER, - REPEAT, - }; - Timer(Type type, int duration, int count = 0, timer_callback callback = nullptr, void* paramters = nullptr); - virtual ~Timer(); - bool process(int ms); - private: - int duration; - int count; - int tickdown; - int countdown; - Type type; - timer_callback callback; - void* paramters; - }; - std::vector<Timer*> timers; + void cancel(Handler* handler); + + /// + /// + /// + void cancelAll(); + + private: + + std::vector<Handler*> mHandlers; }; @@ -114,4 +134,4 @@ namespace JinEngine #endif // defined(jin_time) -#endif // __JE_TIMER_H
\ No newline at end of file +#endif // __JE_TIMER_H__
\ No newline at end of file |