aboutsummaryrefslogtreecommitdiff
path: root/src/lua/embed/boot.lua
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2018-07-31 12:29:28 +0800
committerchai <chaifix@163.com>2018-07-31 12:29:28 +0800
commit4aabba1d3fa07913101d77d5434dbb2c8d573a1a (patch)
tree14d521d0c362c8b13bd17d7990cba379fe6e34d0 /src/lua/embed/boot.lua
parenta5bb008eb554daf26f55b5fe43b0fa12ffb15973 (diff)
*update
Diffstat (limited to 'src/lua/embed/boot.lua')
-rw-r--r--src/lua/embed/boot.lua154
1 files changed, 70 insertions, 84 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()