jin._argv[2] = jin._argv[2] or '.' jin.filesystem.init() jin.filesystem.mount(jin._argv[2]) local conf = {} if jin.filesystem.exist("config.lua") then conf = require "config" end conf.width = conf.width or 600 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() -- open debug mode, must after jin.graphics.init if jin._argv[3] == '-d' then jin.debug.init() end local function safecall(func, ...) if func then func(...) end end function jin.core.run() safecall(jin.core.onLoad) local previous = jin.time.second() local SEC_PER_UPDATE = 1 / conf.fps local dt = SEC_PER_UPDATE local running = true 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 safecall(jin.core.onEvent, e) running = jin.core.running() if not running then break end end if not running then break end safecall(jin.core.onUpdate, dt) jin.graphics.unbind() jin.graphics.clear() jin.graphics.color() jin.graphics.study() safecall(jin.core.onDraw) if jin.debug.status() then jin.debug.render() 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 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.size() 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 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 -- quit subsystems jin.graphics.destroy() jin.audio.destroy() -- exit whole game jin.core.quit() end boot()