diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lua/embed/boot.lua | 154 | ||||
-rw-r--r-- | src/lua/embed/boot.lua.h | 10 |
2 files changed, 76 insertions, 88 deletions
diff --git a/src/lua/embed/boot.lua b/src/lua/embed/boot.lua index 2f6fa93..6869ac8 100644 --- a/src/lua/embed/boot.lua +++ b/src/lua/embed/boot.lua @@ -1,98 +1,75 @@ ---[[ - program entry -]] -local function _onEvent(e) - -- update keyboard status - if e.type == "keydown" then - jin.keyboard.set(e.key, true) - elseif e.type == "keyup" then - jin.keyboard.set(e.key, false) - end - - -- call user onEvent function - if jin.core.onEvent then - jin.core.onEvent(e) - end -end - -------------------------------------------------- --- init file system -------------------------------------------------- jin._argv[2] = jin._argv[2] or '.' jin.filesystem.init() jin.filesystem.mount(jin._argv[2]) --- config local conf = {} if jin.filesystem.exist("config.lua") then conf = require "config" -end -conf.width = conf.width or 600 +end +conf.width = conf.width or 600 conf.height = conf.height or 500 -conf.fps = conf.fps or 60 -conf.title = conf.title or ("jin v" .. jin.version()) +conf.fps = conf.fps or 60 +conf.vsync = conf.vsync or false +conf.title = conf.title or ("jin v" .. jin.version()) +conf.resizable = conf.resizable or false +conf.fullscreen = conf.fullscreen or false --- init video subsystem -jin.graphics.init(conf.width,conf.height,conf.title) +-- initialize subsystems +jin.graphics.init(conf) +jin.audio.init() -- open debug mode, must after jin.graphics.init if jin._argv[3] == '-d' then jin.debug.init() end -function jin.core.run() - local now = jin.time.second() - local last = now - local fsec = 1/conf.fps - -- for loading resources - if jin.core.load then - jin.core.load() +local function safecall(func, ...) + if func then + func(...) end - local dt = 0 - while(jin.core.running()) do - -- frame controle - last = now - now = jin.time.second() - if (now - last) < fsec then - jin.time.sleep(fsec - now + last) - end +end - -- handle events +function jin.core.run() + safecall(jin.core.load) + local previous = jin.time.second() + local SEC_PER_UPDATE = 1 / conf.fps + local dt = SEC_PER_UPDATE + while(jin.core.running()) do for _, e in pairs(jin.event.poll()) do - if _onEvent then - _onEvent(e) + if e.type == "keydown" then + jin.keyboard.set(e.key, true) + elseif e.type == "keyup" then + jin.keyboard.set(e.key, false) end + safecall(jin.core.onEvent, e) end + if not jin.core.running() then + break + end - -- update - dt = now - last - if dt < fsec then - dt = fsec - end - if jin.core.onUpdate then - jin.core.onUpdate(dt) - end - - -- bind to default render buffer - jin.graphics.bind() + safecall(jin.core.onUpdate, dt) + + jin.graphics.unbind() jin.graphics.clear() jin.graphics.color() jin.graphics.study() - - -- custom drawing - if jin.core.onDraw then - jin.core.onDraw() - end - - -- render debug window + safecall(jin.core.onDraw) if jin.debug.status() then jin.debug.render() - end - - -- swap window buffer + end jin.graphics.present() + local current = jin.time.second() + dt = current - previous + local wait = SEC_PER_UPDATE - dt + previous = previous + SEC_PER_UPDATE + if wait > 0 then + dt = SEC_PER_UPDATE + jin.time.sleep(wait) + else + previous = current + end end end @@ -101,7 +78,7 @@ local function onError(msg) print("Error:\n" .. msg) function jin.core.onEvent(e) if e.type == 'quit' then - jin.core.quit() + jin.core.stop() end end local ww, wh = jin.graphics.size() @@ -111,22 +88,31 @@ local function onError(msg) end end -if jin.filesystem.exist("main.lua") then - -- require main game script - xpcall(function() require"main" end, onError) - jin.core.run() -else - -- no game - function jin.core.onEvent(e) - if e.type == 'quit' then - jin.core.quit() +local function main() + if jin.filesystem.exist("main.lua") then + -- require main game script + xpcall(function() require"main" end, onError) + jin.core.run() + else + -- no game + function jin.core.onEvent(e) + if e.type == 'quit' then + jin.core.stop() + end end + function jin.core.onDraw() + jin.graphics.clear(111, 134, 125, 255) + local ww, wh = jin.graphics.size() + local fw, fh = jin.graphics.box("no game", 20, 1, 20) + jin.graphics.write("no game", ww /2 - fw / 2, wh * 2/3, 16, 1, 18) + end + jin.core.run() end - function jin.core.onDraw() - jin.graphics.clear(111, 134, 125, 255) - local ww, wh = jin.graphics.size() - local fw, fh = jin.graphics.box("no game", 20, 1, 20) - jin.graphics.write("no game", ww /2 - fw / 2, wh * 2/3, 16, 1, 18) - end - jin.core.run() -end + -- quit subsystems + jin.graphics.destroy() + jin.audio.destroy() + -- exit whole game + jin.core.quit() +end + +main() diff --git a/src/lua/embed/boot.lua.h b/src/lua/embed/boot.lua.h index c73e9f9..2067953 100644 --- a/src/lua/embed/boot.lua.h +++ b/src/lua/embed/boot.lua.h @@ -14,10 +14,12 @@ conf.height = conf.height or 500 conf.fps = conf.fps or 60 conf.vsync = conf.vsync or false conf.title = conf.title or ("jin v" .. jin.version()) +conf.resizable = conf.resizable or false +conf.fullscreen = conf.fullscreen or false -- initialize subsystems jin.graphics.init(conf) -jin.audio.init(conf) +jin.audio.init() -- open debug mode, must after jin.graphics.init if jin._argv[3] == '-d' then @@ -65,8 +67,8 @@ function jin.core.run() local wait = SEC_PER_UPDATE - dt previous = previous + SEC_PER_UPDATE if wait > 0 then - jin.time.sleep(wait) dt = SEC_PER_UPDATE + jin.time.sleep(wait) else previous = current end @@ -88,7 +90,7 @@ local function onError(msg) end end -local function main() +local function boot() if jin.filesystem.exist("main.lua") then -- require main game script xpcall(function() require"main" end, onError) @@ -115,6 +117,6 @@ local function main() jin.core.quit() end -main() +boot() )"; |