1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
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()
|