diff options
author | chai <chaifix@163.com> | 2019-01-14 16:40:14 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2019-01-14 16:40:14 +0800 |
commit | 98c9825c49a1674f59eafb3253829ca7d5cac3c1 (patch) | |
tree | bdd2a6da72fc998ff884b011a2260dc72537c25f /src/libjin-lua/modules/time/l_timer.cpp | |
parent | 8b00d67febf133e89f6a0bfabc41feed555dc4a9 (diff) |
*rename source file
Diffstat (limited to 'src/libjin-lua/modules/time/l_timer.cpp')
-rw-r--r-- | src/libjin-lua/modules/time/l_timer.cpp | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/src/libjin-lua/modules/time/l_timer.cpp b/src/libjin-lua/modules/time/l_timer.cpp new file mode 100644 index 0000000..8886913 --- /dev/null +++ b/src/libjin-lua/modules/time/l_timer.cpp @@ -0,0 +1,132 @@ +#include "common/l_callback.h" +#include "common/l_common.h" +#include "l_timer.h" + +using namespace JinEngine::Time; + +namespace JinEngine +{ + namespace Lua + { + + const char* Jin_Lua_Timer = "Timer"; + + const char* Jin_Lua_Handler = "Handler"; + + static Timer::TimerCallback timerCallback = [](void* data)->void + { + LuaCallback* func = static_cast<LuaCallback*>(data); + func->call(); + }; + + static Timer::FinishCallback finishCallback = [](void* data)->void + { + LuaCallback* func = static_cast<LuaCallback*>(data); + delete func; + }; + + LUA_IMPLEMENT inline Timer* checkTimer(lua_State* L) + { + LuaObject* luaObj = (LuaObject*)luax_checktype(L, 1, Jin_Lua_Timer); + return luaObj->getObject<Timer>(); + } + + // timer:every(time, callback, parameter) + LUA_IMPLEMENT int l_every(lua_State* L) + { + int n = luax_gettop(L); + Timer* shared = checkTimer(L); + float s = luax_checknumber(L, 2); + LuaCallback* func = new LuaCallback(L); + func->setFunc(3); + for(int i = 4; i <= n; ++i) + func->pushParam(i); + Timer::Handler* handler = shared->every(s, timerCallback, func, finishCallback); + Shared* shrHandler = new Shared(handler); + LuaObject* luaObj = luax_newinstance(L, Jin_Lua_Handler, shrHandler); + return 1; + } + + // timer:after(time, callback, parameter) + LUA_IMPLEMENT int l_after(lua_State* L) + { + int n = luax_gettop(L); + Timer* shared = checkTimer(L); + float s = luax_checknumber(L, 2); + LuaCallback* func = new LuaCallback(L); + func->setFunc(3); + for (int i = 4; i <= n; ++i) + func->pushParam(i); + Timer::Handler* handler = shared->after(s, timerCallback, func, finishCallback); + Shared* shrHandler = new Shared(handler); + LuaObject* luaObj = luax_newinstance(L, Jin_Lua_Handler, shrHandler); + return 1; + } + + // timer:repeat(time, callback, parameter) + LUA_IMPLEMENT int l_repeat(lua_State* L) + { + int n = luax_gettop(L); + Timer* shared = checkTimer(L); + float s = luax_checknumber(L, 2); + int count = luax_checkinteger(L, 3); + LuaCallback* func = new LuaCallback(L); + func->setFunc(4); + for (int i = 5; i <= n; ++i) + func->pushParam(i); + Timer::Handler* handler = shared->repeat(s, count, timerCallback, func, finishCallback); + Shared* shrHandler = new Shared(handler); + LuaObject* luaObj = luax_newinstance(L, Jin_Lua_Handler, shrHandler); + return 1; + } + + LUA_IMPLEMENT int l_update(lua_State* L) + { + Timer* shared = checkTimer(L); + float s = luax_checknumber(L, 2); + shared->update(s); + return 0; + } + + LUA_IMPLEMENT int l_cancel(lua_State* L) + { + LuaObject* p = (LuaObject*)luax_checktype(L, 1, Jin_Lua_Timer); + Timer* timer = p->getObject<Timer>(); + LuaObject* ph = (LuaObject*)luax_checktype(L, 2, Jin_Lua_Handler); + Timer::Handler* handler = ph->getObject<Timer::Handler>(); + timer->cancel(handler); + return 0; + } + + LUA_IMPLEMENT int l_cancelAll(lua_State* L) + { + LuaObject* p = (LuaObject*)luax_checktype(L, 1, Jin_Lua_Timer); + Timer* timer = p->getObject<Timer>(); + timer->cancelAll(); + return 0; + } + + LUA_IMPLEMENT int l_gc(lua_State* L) + { + LuaObject* p = (LuaObject*)luax_checktype(L, 1, Jin_Lua_Timer); + p->release(); + return 0; + } + + LUA_EXPORT void luaopen_Timer(lua_State* L) + { + luaL_Reg methods[] = { + { "__gc", l_gc }, + { "every", l_every }, + { "after", l_after }, + { "duplicate", l_repeat }, + { "update", l_update }, + { "cancel", l_cancel }, + { "cancelAll", l_cancelAll }, + { 0, 0 } + }; + luax_newtype(L, Jin_Lua_Timer, methods); + } + + } +}
\ No newline at end of file |