aboutsummaryrefslogtreecommitdiff
path: root/src/libjin/Time/je_timer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libjin/Time/je_timer.cpp')
-rw-r--r--src/libjin/Time/je_timer.cpp98
1 files changed, 60 insertions, 38 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