diff options
Diffstat (limited to 'src/lua/embed')
-rw-r--r-- | src/lua/embed/boot.lua.h | 175 | ||||
-rw-r--r-- | src/lua/embed/embed.h | 46 | ||||
-rw-r--r-- | src/lua/embed/graphics.lua.h | 46 | ||||
-rw-r--r-- | src/lua/embed/keyboard.lua.h | 15 | ||||
-rw-r--r-- | src/lua/embed/mouse.lua.h | 14 | ||||
-rw-r--r-- | src/lua/embed/net.lua.h | 4 | ||||
-rw-r--r-- | src/lua/embed/path.lua.h | 14 |
7 files changed, 314 insertions, 0 deletions
diff --git a/src/lua/embed/boot.lua.h b/src/lua/embed/boot.lua.h new file mode 100644 index 0000000..99e657b --- /dev/null +++ b/src/lua/embed/boot.lua.h @@ -0,0 +1,175 @@ +/* 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) + jin.graphics.reset() + 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 + +-- TODO: Ĭͼbase64 +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) + jin.graphics.reset() + jin.graphics.setClearColor(100, 100, 100, 255) + jin.graphics.clear() + jin.graphics.print("Error:\n" .. msg .. "\n" .. debug.traceback(), 5, 5) + jin.graphics.present() + while jin.core.running() do + for _, e in pairs(jin.event.poll()) do + if e.type == "Quit" then + jin.core.stop() + end + end + jin.time.sleep(0.001) + end + jin.core.quit() +end + +local function boot() + if jin.filesystem.exist("main.lua") then + -- Require main game script + xpcall(function() require"main" end, onError) + xpcall(function() jin.core.run() end, onError) + 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) + +)";
\ No newline at end of file diff --git a/src/lua/embed/embed.h b/src/lua/embed/embed.h new file mode 100644 index 0000000..18373c8 --- /dev/null +++ b/src/lua/embed/embed.h @@ -0,0 +1,46 @@ +#ifndef __JIN_LUA_EMBED_H +#define __JIN_LUA_EMBED_H +#include <cstring> + +namespace JinEngine +{ +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 +} // namespace JinEngine + +#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..5fa5dad --- /dev/null +++ b/src/lua/embed/graphics.lua.h @@ -0,0 +1,46 @@ +/* graphics.lua */ +static const char* graphics_lua = R"( +jin.graphics = jin.graphics or {} + +local default_shader = nil +local default_shader_source = [[ +#VERTEX_SHADER + +Vertex vert(Vertex v) +{ + return v; +} + +#END_VERTEX_SHADER + +#FRAGMENT_SHADER + +Color frag(Color col, Texture tex, Vertex v) +{ + return col * texel(tex, v.uv); +} + +#END_FRAGMENT_SHADER +]] + +local _init = jin.graphics.init + +jin.graphics.init = function(setting) + _init(setting); + default_shader = jin.graphics.newShader(default_shader_source) + jin.graphics.useShader(default_shader) +end + +jin.graphics.unuseShader = function() + jin.graphics.useShader(default_shader) +end + +-- Reset all attributes to default value. +jin.graphics.reset = function() + jin.graphics.setColor(255, 255, 255, 255) + jin.graphics.setClearColor(0, 0, 0, 255) + jin.graphics.clear() + jin.graphics.unsetFont() +end + +)"; diff --git a/src/lua/embed/keyboard.lua.h b/src/lua/embed/keyboard.lua.h new file mode 100644 index 0000000..ee8428f --- /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.isPressed(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 |