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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
--[[
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
conf.height = conf.height or 500
conf.fps = conf.fps or 60
conf.title = conf.title or ("jin v" .. jin.version())
-- init video subsystem
jin.graphics.init(conf.width,conf.height,conf.title)
-- 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()
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
-- handle events
for _, e in pairs(jin.event.poll()) do
if _onEvent then
_onEvent(e)
end
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()
jin.graphics.clear()
jin.graphics.color()
jin.graphics.study()
-- custom drawing
if jin.core.onDraw then
jin.core.onDraw()
end
-- render debug window
if jin.debug.status() then
jin.debug.render()
end
-- swap window buffer
jin.graphics.present()
end
end
local function onError(msg)
local tab = ' '
print("Error:\n" .. msg)
function jin.core.onEvent(e)
if e.type == 'quit' then
jin.core.quit()
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
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()
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
|