-
Notifications
You must be signed in to change notification settings - Fork 24
/
Copy pathex104_timers.nim
139 lines (108 loc) · 3.11 KB
/
ex104_timers.nim
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
133
134
135
136
137
138
# ex103_events.nim
# ================
# BASICS / Using timers
# ---------------------
import sdl2_nim/sdl
const
Title = "SDL2 App"
ScreenW = 640 # Window width
ScreenH = 480 # Window height
WindowFlags = 0
RendererFlags = sdl.RendererAccelerated or sdl.RendererPresentVsync
type
App = ref AppObj
AppObj = object
window*: sdl.Window # Window pointer
renderer*: sdl.Renderer # Rendering state pointer
# Initialization sequence
proc init(app: App): bool =
# Init SDL
if sdl.init(sdl.InitVideo or sdl.InitTimer) != 0:
sdl.logCritical(sdl.LogCategoryError,
"Can't initialize SDL: %s",
sdl.getError())
return false
# Create window
app.window = sdl.createWindow(
Title,
sdl.WindowPosUndefined,
sdl.WindowPosUndefined,
ScreenW,
ScreenH,
WindowFlags)
if app.window == nil:
sdl.logCritical(sdl.LogCategoryError,
"Can't create window: %s",
sdl.getError())
return false
# Create renderer
app.renderer = sdl.createRenderer(app.window, -1, RendererFlags)
if app.renderer == nil:
sdl.logCritical(sdl.LogCategoryError,
"Can't create renderer: %s",
sdl.getError())
return false
# Set draw color
if app.renderer.setRenderDrawColor(0xFF, 0xFF, 0xFF, 0xFF) != 0:
sdl.logWarn(sdl.LogCategoryVideo,
"Can't set draw color: %s",
sdl.getError())
return false
sdl.logInfo(sdl.LogCategoryApplication, "SDL initialized successfully")
return true
# Shutdown sequence
proc exit(app: App) =
app.renderer.destroyRenderer()
app.window.destroyWindow()
sdl.logInfo(sdl.LogCategoryApplication, "SDL shutdown completed")
sdl.quit()
# Event handling
# Return true on app shutdown request, otherwise return false
proc events(): bool =
result = false
var e: sdl.Event
while sdl.pollEvent(addr(e)) != 0:
# Quit requested
if e.kind == sdl.Quit:
return true
# Key pressed
elif e.kind == sdl.KeyDown:
# Exit on Escape key press
if e.key.keysym.sym == sdl.K_Escape:
return true
# Custom timer callback
proc customTimer(interval: uint32, param: pointer): uint32 {.cdecl.} =
var tick {.global.} = true
if tick:
sdl.logInfo(sdl.LogCategoryApplication, "Tick")
else:
sdl.logInfo(sdl.LogCategoryApplication, "Tock")
tick = not tick
# If 0 is returned, timer will be stopped
return interval
########
# MAIN #
########
var
app = App(window: nil, renderer: nil)
done = false # Main loop exit condition
if init(app):
# Starting timer
var timer = sdl.addTimer(1000, customTimer, nil)
# Main loop
while not done:
# Clear screen with draw color
if app.renderer.renderClear() != 0:
sdl.logWarn(sdl.LogCategoryVideo,
"Can't clear screen: %s",
sdl.getError())
# Update renderer
app.renderer.renderPresent()
# Event handling
done = events()
if not sdl.removeTimer(timer):
sdl.logWarn(sdl.LogCategorySystem,
"Can't remove timer: %s",
sdl.getError())
# Shutdown
exit(app)