diff options
Diffstat (limited to 'src/lua/modules/time')
-rw-r--r-- | src/lua/modules/time/je_lua_time.cpp | 71 | ||||
-rw-r--r-- | src/lua/modules/time/je_lua_time.h | 0 | ||||
-rw-r--r-- | src/lua/modules/time/je_lua_timer.cpp | 146 | ||||
-rw-r--r-- | src/lua/modules/time/je_lua_timer.h | 20 | ||||
-rw-r--r-- | src/lua/modules/time/time.cpp | 38 |
5 files changed, 237 insertions, 38 deletions
diff --git a/src/lua/modules/time/je_lua_time.cpp b/src/lua/modules/time/je_lua_time.cpp new file mode 100644 index 0000000..39ec899 --- /dev/null +++ b/src/lua/modules/time/je_lua_time.cpp @@ -0,0 +1,71 @@ +#include "SDL2/SDL.h" +#include "lua/common/je_lua_common.h" +#include "lua/modules/luax.h" +#include "libjin/jin.h" + + +#include "je_lua_timer.h" + +using namespace JinEngine::Time; + +namespace JinEngine +{ + namespace Lua + { + + static struct + { + float previous; + float current; + } context; + + LUA_IMPLEMENT int l_sec(lua_State* L) + { + luax_pushnumber(L, getSecond()); + return 1; + } + + LUA_IMPLEMENT int l_sleep(lua_State* L) + { + double sec = luax_checknumber(L, 1); + sleep(sec * 1000.0f); + return 0; + } + + LUA_IMPLEMENT int l_newTimer(lua_State* L) + { + Proxy* proxy = luax_newinstance(L, Jin_Lua_Timer); + proxy->bind(new Shared<Timer>(new Timer(), Jin_Lua_Timer)); + return 1; + } + + LUA_IMPLEMENT int l_getDelta(lua_State* L) + { + luax_pushnumber(L, context.current - context.previous); + return 1; + } + + LUA_IMPLEMENT int l_step(lua_State* L) + { + context.previous = context.current; + context.current = getSecond(); + return 0; + } + + LUA_EXPORT int luaopen_time(lua_State* L) + { + luaopen_Timer(L); + luaL_Reg f[] = { + { "second", l_sec }, + { "sleep", l_sleep }, + { "newTimer", l_newTimer }, + { "step", l_step }, + { "getDelta", l_getDelta }, + { 0, 0 }, + }; + luax_newlib(L, f); + return 1; + } + + } // namespace Lua +} // namespace JinEngine
\ No newline at end of file diff --git a/src/lua/modules/time/je_lua_time.h b/src/lua/modules/time/je_lua_time.h new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/lua/modules/time/je_lua_time.h diff --git a/src/lua/modules/time/je_lua_timer.cpp b/src/lua/modules/time/je_lua_timer.cpp new file mode 100644 index 0000000..540f205 --- /dev/null +++ b/src/lua/modules/time/je_lua_timer.cpp @@ -0,0 +1,146 @@ + +#include "lua/common/je_lua_callback.h" +#include "lua/common/je_lua_common.h" +#include "je_lua_timer.h" + +using namespace JinEngine::Time; + +namespace JinEngine +{ + namespace Lua + { + + const char* Jin_Lua_Timer = "Timer"; + + const char* Jin_Lua_Handler = "Handler"; + + typedef Shared<Timer>& SharedTimer; + + 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 SharedTimer checkTimer(lua_State* L) + { + Proxy* proxy = (Proxy*)luax_checktype(L, 1, Jin_Lua_Timer); + return proxy->getShared<Timer>(); + } + + // timer:every(time, callback, parameter) + LUA_IMPLEMENT int l_every(lua_State* L) + { + int n = luax_gettop(L); + SharedTimer shared = checkTimer(L); + Timer* timer = shared.getObject(); + 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 = timer->every(s, timerCallback, func, finishCallback); + Proxy* proxy = luax_newinstance(L, Jin_Lua_Handler); + Shared<Timer::Handler>* shrHandler = new Shared<Timer::Handler>(handler, Jin_Lua_Handler); + shrHandler->retain(); + proxy->bind(shrHandler); + return 1; + } + + // timer:after(time, callback, parameter) + LUA_IMPLEMENT int l_after(lua_State* L) + { + int n = luax_gettop(L); + SharedTimer shared = checkTimer(L); + Timer* timer = shared.getObject(); + 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 = timer->after(s, timerCallback, func, finishCallback); + Proxy* proxy = luax_newinstance(L, Jin_Lua_Handler); + Shared<Timer::Handler>* shrHandler = new Shared<Timer::Handler>(handler, Jin_Lua_Handler); + shrHandler->retain(); + proxy->bind(shrHandler); + return 1; + } + + // timer:repeat(time, callback, parameter) + LUA_IMPLEMENT int l_repeat(lua_State* L) + { + int n = luax_gettop(L); + SharedTimer shared = checkTimer(L); + Timer* timer = shared.getObject(); + 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 = timer->repeat(s, count, timerCallback, func, finishCallback); + Proxy* proxy = luax_newinstance(L, Jin_Lua_Handler); + Shared<Timer::Handler>* shrHandler = new Shared<Timer::Handler>(handler, Jin_Lua_Handler); + shrHandler->retain(); + proxy->bind(shrHandler); + return 1; + } + + LUA_IMPLEMENT int l_update(lua_State* L) + { + SharedTimer shared = checkTimer(L); + Timer* timer = shared.getObject(); + float s = luax_checknumber(L, 2); + timer->update(s); + return 0; + } + + LUA_IMPLEMENT int l_cancel(lua_State* L) + { + Proxy* p = (Proxy*)luax_checktype(L, 1, Jin_Lua_Timer); + Timer* timer = p->getObject<Timer>(); + Proxy* ph = (Proxy*)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) + { + Proxy* p = (Proxy*)luax_checktype(L, 1, Jin_Lua_Timer); + Timer* timer = p->getObject<Timer>(); + timer->cancelAll(); + return 0; + } + + LUA_IMPLEMENT int l_gc(lua_State* L) + { + Proxy* p = (Proxy*)luax_checktype(L, 1, Jin_Lua_Timer); + p->release(); + return 0; + } + + LUA_EXPORT void luaopen_Timer(lua_State* L) + { + luaL_Reg f[] = { + { "__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, f); + } + + } +}
\ No newline at end of file diff --git a/src/lua/modules/time/je_lua_timer.h b/src/lua/modules/time/je_lua_timer.h new file mode 100644 index 0000000..35ec15d --- /dev/null +++ b/src/lua/modules/time/je_lua_timer.h @@ -0,0 +1,20 @@ +#ifndef __JE_LUA_TIMER_H__ +#define __JE_LUA_TIMER_H__ + +#include "libjin/jin.h" + +namespace JinEngine +{ + namespace Lua + { + + extern const char* Jin_Lua_Timer; + + extern const char* Jin_Lua_Handler; + + void luaopen_Timer(lua_State* L); + + } +} + +#endif
\ No newline at end of file diff --git a/src/lua/modules/time/time.cpp b/src/lua/modules/time/time.cpp deleted file mode 100644 index f6e6f26..0000000 --- a/src/lua/modules/time/time.cpp +++ /dev/null @@ -1,38 +0,0 @@ -#include "lua/modules/luax.h" -#include <SDL2/SDL.h> -#include "libjin/jin.h" - -namespace JinEngine -{ - namespace Lua - { - - using namespace JinEngine::Time; - - static int l_sec(lua_State* L) - { - luax_pushnumber(L, getSecond()); - return 1; - } - - static int l_sleep(lua_State* L) - { - double sec = luax_checknumber(L, 1); - sleep(sec * 1000.0f); - return 0; - } - - static const luaL_Reg f[] = { - { "second", l_sec }, - { "sleep", l_sleep }, - { 0, 0 }, - }; - - int luaopen_time(lua_State* L) - { - luax_newlib(L, f); - return 1; - } - - } // namespace Lua -} // namespace JinEngine
\ No newline at end of file |