From 8339939b7fce5236b1a933eef46e1dd4284a24aa Mon Sep 17 00:00:00 2001 From: chai Date: Mon, 10 Sep 2018 07:17:50 +0800 Subject: *update --- src/jinc.cpp | 6 -- src/libjin/Input/Event.h | 16 +++- src/libjin/Input/Input.h | 1 + src/libjin/Input/Joypad.h | 36 +++++++ src/libjin/input/event.h | 16 +++- src/libjin/input/input.h | 1 + src/libjin/input/joypad.h | 36 +++++++ src/lua/common/error.h | 2 +- src/lua/embed/boot.lua.h | 171 ++++++++++++++++++++++++++++++++++ src/lua/embed/embed.h | 46 +++++++++ src/lua/embed/graphics.lua.h | 4 + src/lua/embed/keyboard.lua.h | 15 +++ src/lua/embed/mouse.lua.h | 14 +++ src/lua/embed/net.lua.h | 4 + src/lua/embed/path.lua.h | 14 +++ src/lua/jin.cpp | 109 ++++++++++++++++++++++ src/lua/jin.h | 27 ++++++ src/lua/libraries/luax/luax.h | 1 + src/lua/luax.h | 7 ++ src/lua/main.cpp | 43 +++++++++ src/lua/modules/_embed/boot.lua.h | 171 ---------------------------------- src/lua/modules/_embed/embed.h | 46 --------- src/lua/modules/_embed/graphics.lua.h | 4 - src/lua/modules/_embed/keyboard.lua.h | 15 --- src/lua/modules/_embed/mouse.lua.h | 14 --- src/lua/modules/_embed/net.lua.h | 4 - src/lua/modules/_embed/path.lua.h | 14 --- src/lua/modules/event/event.cpp | 50 +++++++--- src/lua/modules/graphics/graphics.cpp | 1 - src/lua/modules/jin.cpp | 109 ---------------------- src/lua/modules/jin.h | 27 ------ src/lua/modules/joypad/joypad.cpp | 2 +- src/lua/modules/keyboard/keyboard.cpp | 1 - src/lua/modules/luax.h | 2 +- src/lua/modules/thread/Thread.cpp | 2 +- src/luax.h | 7 -- src/main.cpp | 43 --------- 37 files changed, 598 insertions(+), 483 deletions(-) delete mode 100644 src/jinc.cpp create mode 100644 src/lua/embed/boot.lua.h create mode 100644 src/lua/embed/embed.h create mode 100644 src/lua/embed/graphics.lua.h create mode 100644 src/lua/embed/keyboard.lua.h create mode 100644 src/lua/embed/mouse.lua.h create mode 100644 src/lua/embed/net.lua.h create mode 100644 src/lua/embed/path.lua.h create mode 100644 src/lua/jin.cpp create mode 100644 src/lua/jin.h create mode 100644 src/lua/luax.h create mode 100644 src/lua/main.cpp delete mode 100644 src/lua/modules/_embed/boot.lua.h delete mode 100644 src/lua/modules/_embed/embed.h delete mode 100644 src/lua/modules/_embed/graphics.lua.h delete mode 100644 src/lua/modules/_embed/keyboard.lua.h delete mode 100644 src/lua/modules/_embed/mouse.lua.h delete mode 100644 src/lua/modules/_embed/net.lua.h delete mode 100644 src/lua/modules/_embed/path.lua.h delete mode 100644 src/lua/modules/jin.cpp delete mode 100644 src/lua/modules/jin.h delete mode 100644 src/luax.h delete mode 100644 src/main.cpp (limited to 'src') diff --git a/src/jinc.cpp b/src/jinc.cpp deleted file mode 100644 index 53ee178..0000000 --- a/src/jinc.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include - -bool compile(std::string directory) -{ - return 0; -} \ No newline at end of file diff --git a/src/libjin/Input/Event.h b/src/libjin/Input/Event.h index 831c204..cef6b88 100644 --- a/src/libjin/Input/Event.h +++ b/src/libjin/Input/Event.h @@ -16,13 +16,27 @@ namespace input enum EventType { QUIT = SDL_QUIT, + /* keyboard events */ KEY_DOWN = SDL_KEYDOWN, KEY_UP = SDL_KEYUP, + /* mouse events */ MOUSE_MOTION = SDL_MOUSEMOTION, MOUSE_BUTTON_DOWN = SDL_MOUSEBUTTONDOWN, MOUSE_BUTTON_UP = SDL_MOUSEBUTTONUP, MOUSE_WHEEL = SDL_MOUSEWHEEL, - WINDOW_EVENT = SDL_WINDOWEVENT, + /* joypad events */ + JOYBUTTONDOWN = SDL_JOYBUTTONDOWN, + JOYBUTTONUP = SDL_JOYBUTTONUP, + JOYAXISMOTION = SDL_JOYAXISMOTION, + JOYBALLMOTION = SDL_JOYBALLMOTION, + JOYHATMOTION = SDL_JOYHATMOTION, + JOYDEVICEADDED = SDL_JOYDEVICEADDED, + JOYDEVICEREMOVED = SDL_JOYDEVICEREMOVED, + CONTROLLERBUTTONDOWN = SDL_CONTROLLERBUTTONDOWN, + CONTROLLERBUTTONUP = SDL_CONTROLLERBUTTONUP, + CONTROLLERAXISMOTION = SDL_CONTROLLERAXISMOTION, + /* window evnets */ + WINDOW_EVENT = SDL_WINDOWEVENT, }; enum WindowEvent { diff --git a/src/libjin/Input/Input.h b/src/libjin/Input/Input.h index 21c9a9f..a828ac7 100644 --- a/src/libjin/Input/Input.h +++ b/src/libjin/Input/Input.h @@ -4,5 +4,6 @@ #include "event.h" #include "keyboard.h" #include "mouse.h" +#include "joypad.h" #endif \ No newline at end of file diff --git a/src/libjin/Input/Joypad.h b/src/libjin/Input/Joypad.h index 104e52d..b630aa5 100644 --- a/src/libjin/Input/Joypad.h +++ b/src/libjin/Input/Joypad.h @@ -1,12 +1,48 @@ #ifndef __LIBJIN_JOYPAD_H #define __LIBJIN_JOYPAD_H +#include + namespace jin { namespace input { + inline const char* getJoyButtonName(int button) + { + switch (button) + { + case SDL_GameControllerButton::SDL_CONTROLLER_BUTTON_A: return "A"; break; + case SDL_GameControllerButton::SDL_CONTROLLER_BUTTON_B : return "B"; break; + case SDL_GameControllerButton::SDL_CONTROLLER_BUTTON_X : return "X"; break; + case SDL_GameControllerButton::SDL_CONTROLLER_BUTTON_Y: return "Y"; break; + case SDL_GameControllerButton::SDL_CONTROLLER_BUTTON_BACK: return "Back"; break; + case SDL_GameControllerButton::SDL_CONTROLLER_BUTTON_GUIDE: return "Guide"; break; + case SDL_GameControllerButton::SDL_CONTROLLER_BUTTON_START: return "Start"; break; + case SDL_GameControllerButton::SDL_CONTROLLER_BUTTON_LEFTSTICK: return "LeftStick"; break; + case SDL_GameControllerButton::SDL_CONTROLLER_BUTTON_RIGHTSTICK: return "RightStick"; break; + case SDL_GameControllerButton::SDL_CONTROLLER_BUTTON_LEFTSHOULDER: return "LeftShoulder"; break; + case SDL_GameControllerButton::SDL_CONTROLLER_BUTTON_RIGHTSHOULDER: return "RightShoulder"; break; + case SDL_GameControllerButton::SDL_CONTROLLER_BUTTON_DPAD_UP: return "DpadUp"; break; + case SDL_GameControllerButton::SDL_CONTROLLER_BUTTON_DPAD_DOWN: return "DpadDown"; break; + case SDL_GameControllerButton::SDL_CONTROLLER_BUTTON_DPAD_LEFT: return "DpadLeft"; break; + case SDL_GameControllerButton::SDL_CONTROLLER_BUTTON_DPAD_RIGHT: return "DpadRight"; break; + default: return NULL; + } + } + inline const char* getJoyAxisName(int axis) + { + switch (axis) + { + case SDL_GameControllerAxis::SDL_CONTROLLER_AXIS_LEFTX: return "LeftX"; break; + case SDL_GameControllerAxis::SDL_CONTROLLER_AXIS_LEFTY: return "LeftY"; break; + case SDL_GameControllerAxis::SDL_CONTROLLER_AXIS_RIGHTX: return "RightX"; break; + case SDL_GameControllerAxis::SDL_CONTROLLER_AXIS_RIGHTY: return "RightY"; break; + case SDL_GameControllerAxis::SDL_CONTROLLER_AXIS_TRIGGERLEFT: return "TriggerLeft"; break; + case SDL_GameControllerAxis::SDL_CONTROLLER_AXIS_TRIGGERRIGHT: return "TriggerRight"; break; + } + } } // input } // jin diff --git a/src/libjin/input/event.h b/src/libjin/input/event.h index 831c204..cef6b88 100644 --- a/src/libjin/input/event.h +++ b/src/libjin/input/event.h @@ -16,13 +16,27 @@ namespace input enum EventType { QUIT = SDL_QUIT, + /* keyboard events */ KEY_DOWN = SDL_KEYDOWN, KEY_UP = SDL_KEYUP, + /* mouse events */ MOUSE_MOTION = SDL_MOUSEMOTION, MOUSE_BUTTON_DOWN = SDL_MOUSEBUTTONDOWN, MOUSE_BUTTON_UP = SDL_MOUSEBUTTONUP, MOUSE_WHEEL = SDL_MOUSEWHEEL, - WINDOW_EVENT = SDL_WINDOWEVENT, + /* joypad events */ + JOYBUTTONDOWN = SDL_JOYBUTTONDOWN, + JOYBUTTONUP = SDL_JOYBUTTONUP, + JOYAXISMOTION = SDL_JOYAXISMOTION, + JOYBALLMOTION = SDL_JOYBALLMOTION, + JOYHATMOTION = SDL_JOYHATMOTION, + JOYDEVICEADDED = SDL_JOYDEVICEADDED, + JOYDEVICEREMOVED = SDL_JOYDEVICEREMOVED, + CONTROLLERBUTTONDOWN = SDL_CONTROLLERBUTTONDOWN, + CONTROLLERBUTTONUP = SDL_CONTROLLERBUTTONUP, + CONTROLLERAXISMOTION = SDL_CONTROLLERAXISMOTION, + /* window evnets */ + WINDOW_EVENT = SDL_WINDOWEVENT, }; enum WindowEvent { diff --git a/src/libjin/input/input.h b/src/libjin/input/input.h index 21c9a9f..a828ac7 100644 --- a/src/libjin/input/input.h +++ b/src/libjin/input/input.h @@ -4,5 +4,6 @@ #include "event.h" #include "keyboard.h" #include "mouse.h" +#include "joypad.h" #endif \ No newline at end of file diff --git a/src/libjin/input/joypad.h b/src/libjin/input/joypad.h index 104e52d..b630aa5 100644 --- a/src/libjin/input/joypad.h +++ b/src/libjin/input/joypad.h @@ -1,12 +1,48 @@ #ifndef __LIBJIN_JOYPAD_H #define __LIBJIN_JOYPAD_H +#include + namespace jin { namespace input { + inline const char* getJoyButtonName(int button) + { + switch (button) + { + case SDL_GameControllerButton::SDL_CONTROLLER_BUTTON_A: return "A"; break; + case SDL_GameControllerButton::SDL_CONTROLLER_BUTTON_B : return "B"; break; + case SDL_GameControllerButton::SDL_CONTROLLER_BUTTON_X : return "X"; break; + case SDL_GameControllerButton::SDL_CONTROLLER_BUTTON_Y: return "Y"; break; + case SDL_GameControllerButton::SDL_CONTROLLER_BUTTON_BACK: return "Back"; break; + case SDL_GameControllerButton::SDL_CONTROLLER_BUTTON_GUIDE: return "Guide"; break; + case SDL_GameControllerButton::SDL_CONTROLLER_BUTTON_START: return "Start"; break; + case SDL_GameControllerButton::SDL_CONTROLLER_BUTTON_LEFTSTICK: return "LeftStick"; break; + case SDL_GameControllerButton::SDL_CONTROLLER_BUTTON_RIGHTSTICK: return "RightStick"; break; + case SDL_GameControllerButton::SDL_CONTROLLER_BUTTON_LEFTSHOULDER: return "LeftShoulder"; break; + case SDL_GameControllerButton::SDL_CONTROLLER_BUTTON_RIGHTSHOULDER: return "RightShoulder"; break; + case SDL_GameControllerButton::SDL_CONTROLLER_BUTTON_DPAD_UP: return "DpadUp"; break; + case SDL_GameControllerButton::SDL_CONTROLLER_BUTTON_DPAD_DOWN: return "DpadDown"; break; + case SDL_GameControllerButton::SDL_CONTROLLER_BUTTON_DPAD_LEFT: return "DpadLeft"; break; + case SDL_GameControllerButton::SDL_CONTROLLER_BUTTON_DPAD_RIGHT: return "DpadRight"; break; + default: return NULL; + } + } + inline const char* getJoyAxisName(int axis) + { + switch (axis) + { + case SDL_GameControllerAxis::SDL_CONTROLLER_AXIS_LEFTX: return "LeftX"; break; + case SDL_GameControllerAxis::SDL_CONTROLLER_AXIS_LEFTY: return "LeftY"; break; + case SDL_GameControllerAxis::SDL_CONTROLLER_AXIS_RIGHTX: return "RightX"; break; + case SDL_GameControllerAxis::SDL_CONTROLLER_AXIS_RIGHTY: return "RightY"; break; + case SDL_GameControllerAxis::SDL_CONTROLLER_AXIS_TRIGGERLEFT: return "TriggerLeft"; break; + case SDL_GameControllerAxis::SDL_CONTROLLER_AXIS_TRIGGERRIGHT: return "TriggerRight"; break; + } + } } // input } // jin diff --git a/src/lua/common/error.h b/src/lua/common/error.h index 2b2c176..1d10faf 100644 --- a/src/lua/common/error.h +++ b/src/lua/common/error.h @@ -1,7 +1,7 @@ #ifndef __JIN_ERROR_H #define __JIN_ERROR_H #include "../../luax.h" -#include "../modules/jin.h" +#include "../jin.h" #include namespace jin diff --git a/src/lua/embed/boot.lua.h b/src/lua/embed/boot.lua.h new file mode 100644 index 0000000..f7ffc43 --- /dev/null +++ b/src/lua/embed/boot.lua.h @@ -0,0 +1,171 @@ +/* boot.lua */ +static const char* boot_lua = R"( +jin.args[2] = jin.args[2] or '.' +jin.filesystem.init() +jin.filesystem.mount(jin.args[2]) + +------------------------------------------------------------------------- +-- Config game +------------------------------------------------------------------------- + +jin.config = {} +if jin.filesystem.exist("config.lua") then + jin.config = require "config" +end +jin.config.width = jin.config.width or 576 +jin.config.height = jin.config.height or 448 +jin.config.vsync = jin.config.vsync or true +jin.config.title = jin.config.title or ("jin v" .. jin.version) +jin.config.resizable = jin.config.resizable or false +jin.config.fullscreen = jin.config.fullscreen or false +jin.config.fps = jin.config.fps or 60 + +------------------------------------------------------------------------- +-- Initialize sub systems +------------------------------------------------------------------------- + +jin.graphics.init(jin.config) +jin.audio.init() +-- TODO: 禁用系统模块 + +------------------------------------------------------------------------- +-- Default game loop +------------------------------------------------------------------------- + +local function call(func, ...) + if func then + return func(...) + end +end + +function jin.core.run() + call(jin.core.onLoad) + local dt = 0 + local previous = jin.time.second() + local current = previous + while jin.core.running() do + for _, e in pairs(jin.event.poll()) do + if e.type == "keydown" then + jin.keyboard.set(e.key, true) + elseif e.type == "keyup" then + jin.keyboard.set(e.key, false) + end + call(jin.core.onEvent, e) + end + previous = current + current = jin.time.second() + dt = current - previous + call(jin.core.onUpdate, dt) + jin.graphics.clear() + call(jin.core.onDraw) + jin.graphics.present() + -- sleep 1 ms + jin.time.sleep(0.001) + end +end + +------------------------------------------------------------------------- +-- No game handler +------------------------------------------------------------------------- + +jin.core.setHandler = function(handler) + if handler == nil then + return + end + jin.core.onLoad = handler.onLoad + jin.core.onEvent = handler.onEvent + jin.core.onUpdate = handler.onUpdate + jin.core.onDraw = handler.onDraw +end + +jin.nogame = { + cs = 64, + sw = jin.graphics.getWidth(), + sh = jin.graphics.getHeight(), + cw = 0, + ch = 0, + ww = 6, + ww2 = 6*2, + speed = 4, + t = 0, + onLoad = function() + local nogame = jin.nogame + nogame.cw = nogame.sw / nogame.cs + nogame.ch = nogame.sh / nogame.cs + nogame.t = nogame.ww - 1 + end, + onEvent = function(e) + if e.type == 'quit' then + jin.core.stop() + end + end, + onUpdate = function(dt) + print(dt) + local nogame = jin.nogame + nogame.t = nogame.t + dt * nogame.speed + if nogame.t > nogame.ww2 then + nogame.t = nogame.t - nogame.ww2 + end + end, + circle = function(x, y, r) + local nogame = jin.nogame + if r % nogame.ww2 > nogame.ww then + return + end + r = math.sin((r/nogame.ww)*math.pi)*nogame.cs/2 + local fact = (x + y) / nogame.ch * nogame.cw + jin.graphics.setColor( + 155 + 100 * math.sin(fact), + 155 + 100 * math.cos(fact), + 155 + 100 * math.sin(fact * fact), + 255 + ) + jin.graphics.circle("fill", x*nogame.cs + nogame.cs/2, y*nogame.cs + nogame.cs/2, r) + end, + onDraw = function() + local nogame = jin.nogame + for y = 0, nogame.ch - 1 do + for x = 0, nogame.cw - 1 do + nogame.circle(x, y, nogame.t+x+y) + end + end + end +} + +------------------------------------------------------------------------- +-- Boot jin +------------------------------------------------------------------------- + +local function onError(msg) + local tab = ' ' + print("Error:\n" .. msg) + function jin.core.onEvent(e) + if e.type == 'quit' then + jin.core.stop() + end + end + local ww, wh = jin.graphics.getSize() + function jin.core.onDraw() + jin.graphics.write("Error: ", 10, 10, 30, 3, 30) + jin.graphics.write(msg, 10, 50) + end +end + +local function boot() + if jin.filesystem.exist("main.lua") then + -- require main game script + xpcall(function() require"main" end, onError) + jin.core.run() + else + -- no game + jin.core.setHandler(jin.nogame) + jin.core.run() + end + jin.graphics.destroy() + jin.audio.destroy() + jin.core.quit() +end + +xpcall(boot, onError) + +)"; diff --git a/src/lua/embed/embed.h b/src/lua/embed/embed.h new file mode 100644 index 0000000..8d0ba85 --- /dev/null +++ b/src/lua/embed/embed.h @@ -0,0 +1,46 @@ +#ifndef __JIN_LUA_EMBED_H +#define __JIN_LUA_EMBED_H +#include + +namespace jin +{ +namespace embed +{ + +#define embed(L, script, name)\ + if(luax_loadbuffer(L, script, strlen(script), name) == 0)\ + lua_call(L, 0, 0); + + /** + * embed structure. + */ + struct jin_Embed + { + const char* file, *source; + }; + + static void boot(lua_State* L) + { + // embed scripts + #include "graphics.lua.h" + #include "keyboard.lua.h" + #include "mouse.lua.h" + #include "boot.lua.h" + + // in order + const jin_Embed scripts[] = { + { "graphics.lua", graphics_lua }, + { "keyboard.lua", keyboard_lua }, + { "mouse.lua", mouse_lua }, + { "boot.lua", boot_lua }, + { 0, 0 } + }; + + for (int i = 0; scripts[i].file; ++i) + embed(L, scripts[i].source, scripts[i].file); + } + +} // embed +} // jin + +#endif \ No newline at end of file diff --git a/src/lua/embed/graphics.lua.h b/src/lua/embed/graphics.lua.h new file mode 100644 index 0000000..1414efc --- /dev/null +++ b/src/lua/embed/graphics.lua.h @@ -0,0 +1,4 @@ +/* graphics.lua */ +static const char* graphics_lua = R"( +jin.graphics = jin.graphics or {} +)"; diff --git a/src/lua/embed/keyboard.lua.h b/src/lua/embed/keyboard.lua.h new file mode 100644 index 0000000..77bf3a9 --- /dev/null +++ b/src/lua/embed/keyboard.lua.h @@ -0,0 +1,15 @@ + +static const char* keyboard_lua = R"( +jin.keyboard = jin.keyboard or {} + +local keys = {} + +function jin.keyboard.isDown(k) + return keys[k] +end + +function jin.keyboard.set(k, status) + keys[k] = status +end + +)"; diff --git a/src/lua/embed/mouse.lua.h b/src/lua/embed/mouse.lua.h new file mode 100644 index 0000000..3c222f3 --- /dev/null +++ b/src/lua/embed/mouse.lua.h @@ -0,0 +1,14 @@ +static const char* mouse_lua = R"( +jin.mouse = jin.mouse or {} + +local button = {} + +function jin.mouse.isDown(btn) + return button[btn] +end + +function jin.mouse.set(btn, status) + button[btn] = status +end + +)"; \ No newline at end of file diff --git a/src/lua/embed/net.lua.h b/src/lua/embed/net.lua.h new file mode 100644 index 0000000..4d89dc7 --- /dev/null +++ b/src/lua/embed/net.lua.h @@ -0,0 +1,4 @@ +/* net.lua */ +static const char* net_lua = R"( +jin.net = jin.net or {} +)"; \ No newline at end of file diff --git a/src/lua/embed/path.lua.h b/src/lua/embed/path.lua.h new file mode 100644 index 0000000..648adf8 --- /dev/null +++ b/src/lua/embed/path.lua.h @@ -0,0 +1,14 @@ +/* path.lua */ +static const char* path_lua = R"( +jin.path = jin.path or {} + +-- game root directory +jin._root = nil + +-- return full path of a given path +function jin.path.full(path) + local root = jin._dir .. '/' .. jin._argv[2] + return root .. '/' .. path +end + +)"; \ No newline at end of file diff --git a/src/lua/jin.cpp b/src/lua/jin.cpp new file mode 100644 index 0000000..e6d0a2a --- /dev/null +++ b/src/lua/jin.cpp @@ -0,0 +1,109 @@ +#include "jin.h" +#include "lua/modules/luax.h" +#include "embed/embed.h" + +namespace jin +{ +namespace lua +{ + + extern int luaopen_core(lua_State* L); + extern int luaopen_graphics(lua_State* L); + extern int luaopen_audio(lua_State* L); + extern int luaopen_net(lua_State* L); + extern int luaopen_event(lua_State* L); + extern int luaopen_time(lua_State* L); + extern int luaopen_mouse(lua_State* L); + extern int luaopen_keyboard(lua_State* L); + extern int luaopen_filesystem(lua_State* L); + extern int luaopen_joypad(lua_State* L); + extern int luaopen_math(lua_State* L); + extern int luaopen_thread(lua_State* L); + extern int luaopen_bit(lua_State* L); + + static int l_getversion(lua_State* L) + { + luax_pushstring(L, VERSION); + return 1; + } + + static int l_getAuthor(lua_State* L) + { + luax_pushstring(L, AUTHOR); + return 1; + } + + static int l_getOS(lua_State* L) + { + #ifdef _WIN32 + luax_pushstring(L, "windows"); + #elif defined __unix__ + luax_pushstring(L, "unix"); + #elif defined __APPLE__ + luax_pushstring(L, "macos"); + #endif + return 1; + } + + static int l_revision(lua_State* L) + { + luax_pushnumber(L, REVISION); + return 1; + } + + static const luax_Str s[] = { + { "version", VERSION }, + { "author", AUTHOR }, + { "codename", CODE_NAME }, + { 0, 0 } + }; + + static const luax_Num n[] = { + { "revision", REVISION }, + { 0, 0 } + }; + + /* sub modules */ + static const luax_Ref mods[] = { + { "core", luaopen_core }, + { "event", luaopen_event }, + { "graphics", luaopen_graphics }, + { "time", luaopen_time }, + { "mouse", luaopen_mouse }, + { "keyboard", luaopen_keyboard }, + { "filesystem", luaopen_filesystem }, + { "net", luaopen_net }, + { "audio", luaopen_audio }, + { "joypad", luaopen_joypad }, + { "math", luaopen_math }, + { "thread", luaopen_thread }, + { "bit", luaopen_bit }, + { 0, 0 } + }; + + /* register jin module, keep it on the top of stack */ + int luaopen_jin(lua_State* L) + { + luax_globaltable(L, MODULE_NAME); + + /* register values */ + luax_setfieldstrings(L, s); + luax_setfieldnumbers(L, n); + + /* register submodules */ + for (int i = 0; mods[i].name; ++i) + { + mods[i].func(L); + luax_setfield(L, -2, mods[i].name); + } + + return 1; + } + + void boot(lua_State* L) + { + jin::embed::boot(L); + } + +} // lua +} // jin \ No newline at end of file diff --git a/src/lua/jin.h b/src/lua/jin.h new file mode 100644 index 0000000..fe8d6dd --- /dev/null +++ b/src/lua/jin.h @@ -0,0 +1,27 @@ +/** +* Copyright (C) 2016~2018 chai +*/ + +#ifndef __JIN_M_JIN_H +#define __JIN_M_JIN_H +#include "luax.h" + +#define MODULE_NAME "jin" +#define CODE_NAME "Side Part" +#define VERSION "0.1.1" +#define REVISION_S "101" +#define REVISION 101 +#define AUTHOR "chai" + +namespace jin +{ +namespace lua +{ + + int luaopen_jin(lua_State* L); + void boot(lua_State* L); + +} // jin +} // lua + +#endif // __JIN_M_JIN_H \ No newline at end of file diff --git a/src/lua/libraries/luax/luax.h b/src/lua/libraries/luax/luax.h index 1c83912..0b3a713 100644 --- a/src/lua/libraries/luax/luax.h +++ b/src/lua/libraries/luax/luax.h @@ -131,6 +131,7 @@ inline bool luax_checkbool(lua_State *L, int numArg) do { lua_push##T(L, v); lua_setfield(L, -2, k); } while (0) #define luax_setfieldnumber(L, k, v) luax_setfield_(number, L, k, v) +#define luax_setfieldinteger(L, k, v) luax_setfield_(integer, L, k, v) #define luax_setfieldstring(L, k, v) luax_setfield_(string, L, k, v) #define luax_setfieldbool(L, k, v) luax_setfield_(boolean, L, k, v) #define luax_setfieldudata(L, k, v) luax_setfield_(lightuserdata, L, k, v) diff --git a/src/lua/luax.h b/src/lua/luax.h new file mode 100644 index 0000000..89e456e --- /dev/null +++ b/src/lua/luax.h @@ -0,0 +1,7 @@ +#ifndef __JIN_LUA_LUAX_H +#define __JIN_LUA_LUAX_H + +#include "LuaJIT/lua.hpp" +#include "lua/libraries/luax/luax.h" + +#endif \ No newline at end of file diff --git a/src/lua/main.cpp b/src/lua/main.cpp new file mode 100644 index 0000000..f7a5c06 --- /dev/null +++ b/src/lua/main.cpp @@ -0,0 +1,43 @@ +#ifdef _WIN32 +#include +#include +#endif + +#include "luax.h" +#include "jin.h" +#include "libjin/jin.h" +#include + +using namespace jin::lua; +using namespace jin::filesystem; + +int main(int argc, char* argv[]) +{ + lua_State* L = luax_newstate(); + + /* open lua standard module */ + luax_openlibs(L); + /* open jin module */ + luaopen_jin(L); + /* add args to field */ + luax_newtable(L); + for (int i = 0; i < argc; ++i) + luax_setrawstring(L, -2, i + 1, argv[i]); + luax_setfield(L, -2, "args"); + /* push current working directory */ + /* absolute directory */ + Buffer cwd = Buffer(1024); +#ifdef _WIN32 + _getcwd((char*)cwd.data, cwd.size); +#elif defined __unix__ +#elif defined __APPLE__ +#endif + luax_setfieldstring(L, "cwd", (char*)cwd.data); + luax_clear(L); + + /* boot jin and run it */ + boot(L); + + luax_close(L); + return 0; +} \ No newline at end of file diff --git a/src/lua/modules/_embed/boot.lua.h b/src/lua/modules/_embed/boot.lua.h deleted file mode 100644 index f7ffc43..0000000 --- a/src/lua/modules/_embed/boot.lua.h +++ /dev/null @@ -1,171 +0,0 @@ -/* boot.lua */ -static const char* boot_lua = R"( -jin.args[2] = jin.args[2] or '.' -jin.filesystem.init() -jin.filesystem.mount(jin.args[2]) - -------------------------------------------------------------------------- --- Config game -------------------------------------------------------------------------- - -jin.config = {} -if jin.filesystem.exist("config.lua") then - jin.config = require "config" -end -jin.config.width = jin.config.width or 576 -jin.config.height = jin.config.height or 448 -jin.config.vsync = jin.config.vsync or true -jin.config.title = jin.config.title or ("jin v" .. jin.version) -jin.config.resizable = jin.config.resizable or false -jin.config.fullscreen = jin.config.fullscreen or false -jin.config.fps = jin.config.fps or 60 - -------------------------------------------------------------------------- --- Initialize sub systems -------------------------------------------------------------------------- - -jin.graphics.init(jin.config) -jin.audio.init() --- TODO: 禁用系统模块 - -------------------------------------------------------------------------- --- Default game loop -------------------------------------------------------------------------- - -local function call(func, ...) - if func then - return func(...) - end -end - -function jin.core.run() - call(jin.core.onLoad) - local dt = 0 - local previous = jin.time.second() - local current = previous - while jin.core.running() do - for _, e in pairs(jin.event.poll()) do - if e.type == "keydown" then - jin.keyboard.set(e.key, true) - elseif e.type == "keyup" then - jin.keyboard.set(e.key, false) - end - call(jin.core.onEvent, e) - end - previous = current - current = jin.time.second() - dt = current - previous - call(jin.core.onUpdate, dt) - jin.graphics.clear() - call(jin.core.onDraw) - jin.graphics.present() - -- sleep 1 ms - jin.time.sleep(0.001) - end -end - -------------------------------------------------------------------------- --- No game handler -------------------------------------------------------------------------- - -jin.core.setHandler = function(handler) - if handler == nil then - return - end - jin.core.onLoad = handler.onLoad - jin.core.onEvent = handler.onEvent - jin.core.onUpdate = handler.onUpdate - jin.core.onDraw = handler.onDraw -end - -jin.nogame = { - cs = 64, - sw = jin.graphics.getWidth(), - sh = jin.graphics.getHeight(), - cw = 0, - ch = 0, - ww = 6, - ww2 = 6*2, - speed = 4, - t = 0, - onLoad = function() - local nogame = jin.nogame - nogame.cw = nogame.sw / nogame.cs - nogame.ch = nogame.sh / nogame.cs - nogame.t = nogame.ww - 1 - end, - onEvent = function(e) - if e.type == 'quit' then - jin.core.stop() - end - end, - onUpdate = function(dt) - print(dt) - local nogame = jin.nogame - nogame.t = nogame.t + dt * nogame.speed - if nogame.t > nogame.ww2 then - nogame.t = nogame.t - nogame.ww2 - end - end, - circle = function(x, y, r) - local nogame = jin.nogame - if r % nogame.ww2 > nogame.ww then - return - end - r = math.sin((r/nogame.ww)*math.pi)*nogame.cs/2 - local fact = (x + y) / nogame.ch * nogame.cw - jin.graphics.setColor( - 155 + 100 * math.sin(fact), - 155 + 100 * math.cos(fact), - 155 + 100 * math.sin(fact * fact), - 255 - ) - jin.graphics.circle("fill", x*nogame.cs + nogame.cs/2, y*nogame.cs + nogame.cs/2, r) - end, - onDraw = function() - local nogame = jin.nogame - for y = 0, nogame.ch - 1 do - for x = 0, nogame.cw - 1 do - nogame.circle(x, y, nogame.t+x+y) - end - end - end -} - -------------------------------------------------------------------------- --- Boot jin -------------------------------------------------------------------------- - -local function onError(msg) - local tab = ' ' - print("Error:\n" .. msg) - function jin.core.onEvent(e) - if e.type == 'quit' then - jin.core.stop() - end - end - local ww, wh = jin.graphics.getSize() - function jin.core.onDraw() - jin.graphics.write("Error: ", 10, 10, 30, 3, 30) - jin.graphics.write(msg, 10, 50) - end -end - -local function boot() - if jin.filesystem.exist("main.lua") then - -- require main game script - xpcall(function() require"main" end, onError) - jin.core.run() - else - -- no game - jin.core.setHandler(jin.nogame) - jin.core.run() - end - jin.graphics.destroy() - jin.audio.destroy() - jin.core.quit() -end - -xpcall(boot, onError) - -)"; diff --git a/src/lua/modules/_embed/embed.h b/src/lua/modules/_embed/embed.h deleted file mode 100644 index 8d0ba85..0000000 --- a/src/lua/modules/_embed/embed.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef __JIN_LUA_EMBED_H -#define __JIN_LUA_EMBED_H -#include - -namespace jin -{ -namespace embed -{ - -#define embed(L, script, name)\ - if(luax_loadbuffer(L, script, strlen(script), name) == 0)\ - lua_call(L, 0, 0); - - /** - * embed structure. - */ - struct jin_Embed - { - const char* file, *source; - }; - - static void boot(lua_State* L) - { - // embed scripts - #include "graphics.lua.h" - #include "keyboard.lua.h" - #include "mouse.lua.h" - #include "boot.lua.h" - - // in order - const jin_Embed scripts[] = { - { "graphics.lua", graphics_lua }, - { "keyboard.lua", keyboard_lua }, - { "mouse.lua", mouse_lua }, - { "boot.lua", boot_lua }, - { 0, 0 } - }; - - for (int i = 0; scripts[i].file; ++i) - embed(L, scripts[i].source, scripts[i].file); - } - -} // embed -} // jin - -#endif \ No newline at end of file diff --git a/src/lua/modules/_embed/graphics.lua.h b/src/lua/modules/_embed/graphics.lua.h deleted file mode 100644 index 1414efc..0000000 --- a/src/lua/modules/_embed/graphics.lua.h +++ /dev/null @@ -1,4 +0,0 @@ -/* graphics.lua */ -static const char* graphics_lua = R"( -jin.graphics = jin.graphics or {} -)"; diff --git a/src/lua/modules/_embed/keyboard.lua.h b/src/lua/modules/_embed/keyboard.lua.h deleted file mode 100644 index 77bf3a9..0000000 --- a/src/lua/modules/_embed/keyboard.lua.h +++ /dev/null @@ -1,15 +0,0 @@ - -static const char* keyboard_lua = R"( -jin.keyboard = jin.keyboard or {} - -local keys = {} - -function jin.keyboard.isDown(k) - return keys[k] -end - -function jin.keyboard.set(k, status) - keys[k] = status -end - -)"; diff --git a/src/lua/modules/_embed/mouse.lua.h b/src/lua/modules/_embed/mouse.lua.h deleted file mode 100644 index 3c222f3..0000000 --- a/src/lua/modules/_embed/mouse.lua.h +++ /dev/null @@ -1,14 +0,0 @@ -static const char* mouse_lua = R"( -jin.mouse = jin.mouse or {} - -local button = {} - -function jin.mouse.isDown(btn) - return button[btn] -end - -function jin.mouse.set(btn, status) - button[btn] = status -end - -)"; \ No newline at end of file diff --git a/src/lua/modules/_embed/net.lua.h b/src/lua/modules/_embed/net.lua.h deleted file mode 100644 index 4d89dc7..0000000 --- a/src/lua/modules/_embed/net.lua.h +++ /dev/null @@ -1,4 +0,0 @@ -/* net.lua */ -static const char* net_lua = R"( -jin.net = jin.net or {} -)"; \ No newline at end of file diff --git a/src/lua/modules/_embed/path.lua.h b/src/lua/modules/_embed/path.lua.h deleted file mode 100644 index 648adf8..0000000 --- a/src/lua/modules/_embed/path.lua.h +++ /dev/null @@ -1,14 +0,0 @@ -/* path.lua */ -static const char* path_lua = R"( -jin.path = jin.path or {} - --- game root directory -jin._root = nil - --- return full path of a given path -function jin.path.full(path) - local root = jin._dir .. '/' .. jin._argv[2] - return root .. '/' .. path -end - -)"; \ No newline at end of file diff --git a/src/lua/modules/event/event.cpp b/src/lua/modules/event/event.cpp index 0fb438f..be54cf4 100644 --- a/src/lua/modules/event/event.cpp +++ b/src/lua/modules/event/event.cpp @@ -16,7 +16,7 @@ namespace lua */ static int l_event_poll(lua_State *L) { - // table to store events + /* table to store events */ luax_newtable(L); static Event e; int i = 1; @@ -35,14 +35,10 @@ namespace lua break; case EventType::KEY_DOWN: - luax_setfieldstring(L, "type", "KeyDown"); - luax_setfieldstring(L, "key", getKeyName(e.key.keysym.sym)); - break; - case EventType::KEY_UP: - luax_setfieldstring(L, "type", "KeyUp"); + luax_setfieldstring(L, "type", EventType::KEY_DOWN ? "KeyDown" : "KeyUp"); luax_setfieldstring(L, "key", getKeyName(e.key.keysym.sym)); - break; + break; case EventType::MOUSE_MOTION: luax_setfieldstring(L, "type", "MouseMotion"); @@ -51,18 +47,12 @@ namespace lua break; case EventType::MOUSE_BUTTON_DOWN: - luax_setfieldstring(L, "type", "MouseButtonDown"); - luax_setfieldstring(L, "button", getButtonName(e.button.button)); - luax_setfieldnumber(L, "x", e.button.x); - luax_setfieldnumber(L, "y", e.button.y); - break; - case EventType::MOUSE_BUTTON_UP: - luax_setfieldstring(L, "type", "MouseButtonUp"); + luax_setfieldstring(L, "type", e.type == EventType::MOUSE_BUTTON_DOWN ? "MouseButtonDown" : "MouseButtonUp"); luax_setfieldstring(L, "button", getButtonName(e.button.button)); luax_setfieldnumber(L, "x", e.button.x); luax_setfieldnumber(L, "y", e.button.y); - break; + break; case EventType::MOUSE_WHEEL: luax_setfieldstring(L, "type", "Wheel"); @@ -80,6 +70,36 @@ namespace lua luax_setfieldstring(L, "y", "None"); break; + case EventType::JOYBUTTONDOWN: + case EventType::JOYBUTTONUP: + luax_setfieldstring(L, "type", e.type == EventType::JOYBUTTONDOWN ? "JoyButtonDown" : "JoyButtonUp"); + luax_setfieldinteger(L, "which", e.jbutton.which); + luax_setfieldstring(L, "button", input::getJoyButtonName(e.jbutton.button)); + break; + + case EventType::JOYAXISMOTION: + luax_setfieldstring(L, "type", "JoyAxisMotion"); + luax_setfieldinteger(L, "which", e.jaxis.which); + luax_setfieldfstring(L, "axis", input::getJoyAxisName(e.jaxis.axis)); + break; + + case EventType::JOYBALLMOTION: + case EventType::JOYHATMOTION: + + case EventType::JOYDEVICEADDED: + case EventType::JOYDEVICEREMOVED: + luax_setfieldfstring(L, "type", e.type == EventType::JOYDEVICEADDED ? "JoyDeviceAdded" : "JoyDeviceRemoved"); + luax_setfieldinteger(L, "which", e.jdevice.which); + break; + + //https://stackoverflow.com/questions/50022316/what-is-sdl-joystick-and-what-is-sdl-gamecontroller-what-are-the-relationships + case EventType::CONTROLLERBUTTONDOWN: + case EventType::CONTROLLERBUTTONUP: + + + case EventType::CONTROLLERAXISMOTION: + + default: /* ignore other events */ luax_pop(L, 1); // pop table out diff --git a/src/lua/modules/graphics/graphics.cpp b/src/lua/modules/graphics/graphics.cpp index 92bc7d5..d374f51 100644 --- a/src/lua/modules/graphics/graphics.cpp +++ b/src/lua/modules/graphics/graphics.cpp @@ -2,7 +2,6 @@ #include "lua/modules/types.h" #include "libjin/jin.h" #include "lua/common/common.h" -#include "lua/modules/_embed/graphics.lua.h" namespace jin { diff --git a/src/lua/modules/jin.cpp b/src/lua/modules/jin.cpp deleted file mode 100644 index 5e92ce1..0000000 --- a/src/lua/modules/jin.cpp +++ /dev/null @@ -1,109 +0,0 @@ -#include "jin.h" -#include "lua/modules/luax.h" -#include "_embed/embed.h" - -namespace jin -{ -namespace lua -{ - - extern int luaopen_core(lua_State* L); - extern int luaopen_graphics(lua_State* L); - extern int luaopen_audio(lua_State* L); - extern int luaopen_net(lua_State* L); - extern int luaopen_event(lua_State* L); - extern int luaopen_time(lua_State* L); - extern int luaopen_mouse(lua_State* L); - extern int luaopen_keyboard(lua_State* L); - extern int luaopen_filesystem(lua_State* L); - extern int luaopen_joypad(lua_State* L); - extern int luaopen_math(lua_State* L); - extern int luaopen_thread(lua_State* L); - extern int luaopen_bit(lua_State* L); - - static int l_getversion(lua_State* L) - { - luax_pushstring(L, VERSION); - return 1; - } - - static int l_getAuthor(lua_State* L) - { - luax_pushstring(L, AUTHOR); - return 1; - } - - static int l_getOS(lua_State* L) - { - #ifdef _WIN32 - luax_pushstring(L, "windows"); - #elif defined __unix__ - luax_pushstring(L, "unix"); - #elif defined __APPLE__ - luax_pushstring(L, "macos"); - #endif - return 1; - } - - static int l_revision(lua_State* L) - { - luax_pushnumber(L, REVISION); - return 1; - } - - static const luax_Str s[] = { - { "version", VERSION }, - { "author", AUTHOR }, - { "codename", CODE_NAME }, - { 0, 0 } - }; - - static const luax_Num n[] = { - { "revision", REVISION }, - { 0, 0 } - }; - - /* sub modules */ - static const luax_Ref mods[] = { - { "core", luaopen_core }, - { "event", luaopen_event }, - { "graphics", luaopen_graphics }, - { "time", luaopen_time }, - { "mouse", luaopen_mouse }, - { "keyboard", luaopen_keyboard }, - { "filesystem", luaopen_filesystem }, - { "net", luaopen_net }, - { "audio", luaopen_audio }, - { "joypad", luaopen_joypad }, - { "math", luaopen_math }, - { "thread", luaopen_thread }, - { "bit", luaopen_bit }, - { 0, 0 } - }; - - /* register jin module, keep it on the top of stack */ - int luaopen_jin(lua_State* L) - { - luax_globaltable(L, MODULE_NAME); - - /* register values */ - luax_setfieldstrings(L, s); - luax_setfieldnumbers(L, n); - - /* register submodules */ - for (int i = 0; mods[i].name; ++i) - { - mods[i].func(L); - luax_setfield(L, -2, mods[i].name); - } - - return 1; - } - - void boot(lua_State* L) - { - jin::embed::boot(L); - } - -} // lua -} // jin \ No newline at end of file diff --git a/src/lua/modules/jin.h b/src/lua/modules/jin.h deleted file mode 100644 index fe8d6dd..0000000 --- a/src/lua/modules/jin.h +++ /dev/null @@ -1,27 +0,0 @@ -/** -* Copyright (C) 2016~2018 chai -*/ - -#ifndef __JIN_M_JIN_H -#define __JIN_M_JIN_H -#include "luax.h" - -#define MODULE_NAME "jin" -#define CODE_NAME "Side Part" -#define VERSION "0.1.1" -#define REVISION_S "101" -#define REVISION 101 -#define AUTHOR "chai" - -namespace jin -{ -namespace lua -{ - - int luaopen_jin(lua_State* L); - void boot(lua_State* L); - -} // jin -} // lua - -#endif // __JIN_M_JIN_H \ No newline at end of file diff --git a/src/lua/modules/joypad/joypad.cpp b/src/lua/modules/joypad/joypad.cpp index e951702..0f0f350 100644 --- a/src/lua/modules/joypad/joypad.cpp +++ b/src/lua/modules/joypad/joypad.cpp @@ -16,6 +16,6 @@ namespace lua return 1; } - + /*SDL_JoystickGetButton*/ } // lua } // jin \ No newline at end of file diff --git a/src/lua/modules/keyboard/keyboard.cpp b/src/lua/modules/keyboard/keyboard.cpp index ffbc6b9..e384671 100644 --- a/src/lua/modules/keyboard/keyboard.cpp +++ b/src/lua/modules/keyboard/keyboard.cpp @@ -1,5 +1,4 @@ #include "lua/modules/luax.h" -#include "lua/modules/_embed/keyboard.lua.h" namespace jin { diff --git a/src/lua/modules/luax.h b/src/lua/modules/luax.h index 24d74e4..f45af39 100644 --- a/src/lua/modules/luax.h +++ b/src/lua/modules/luax.h @@ -1,6 +1,6 @@ #ifndef __JIN_MODULES_LUAX_H #define __JIN_MODULES_LUAX_H -#include "../../luax.h" +#include "../luax.h" #endif \ No newline at end of file diff --git a/src/lua/modules/thread/Thread.cpp b/src/lua/modules/thread/Thread.cpp index 5f458ab..43c5903 100644 --- a/src/lua/modules/thread/Thread.cpp +++ b/src/lua/modules/thread/Thread.cpp @@ -1,7 +1,7 @@ #include "lua/modules/luax.h" #include "lua/modules/types.h" #include "libjin/jin.h" -#include "lua/modules/jin.h" +#include "lua/jin.h" #include "lua/common/common.h" #include "thread.h" diff --git a/src/luax.h b/src/luax.h deleted file mode 100644 index 89e456e..0000000 --- a/src/luax.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef __JIN_LUA_LUAX_H -#define __JIN_LUA_LUAX_H - -#include "LuaJIT/lua.hpp" -#include "lua/libraries/luax/luax.h" - -#endif \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp deleted file mode 100644 index 18d873d..0000000 --- a/src/main.cpp +++ /dev/null @@ -1,43 +0,0 @@ -#ifdef _WIN32 -#include -#include -#endif - -#include "luax.h" -#include "lua/modules/jin.h" -#include "libjin/jin.h" -#include - -using namespace jin::lua; -using namespace jin::filesystem; - -int main(int argc, char* argv[]) -{ - lua_State* L = luax_newstate(); - - /* open lua standard module */ - luax_openlibs(L); - /* open jin module */ - luaopen_jin(L); - /* add args to field */ - luax_newtable(L); - for (int i = 0; i < argc; ++i) - luax_setrawstring(L, -2, i + 1, argv[i]); - luax_setfield(L, -2, "args"); - /* push current working directory */ - /* absolute directory */ - Buffer cwd = Buffer(1024); -#ifdef _WIN32 - _getcwd((char*)cwd.data, cwd.size); -#elif defined __unix__ -#elif defined __APPLE__ -#endif - luax_setfieldstring(L, "cwd", (char*)cwd.data); - luax_clear(L); - - /* boot jin and run it */ - boot(L); - - luax_close(L); - return 0; -} \ No newline at end of file -- cgit v1.1-26-g67d0