Mercurial > molko
annotate doc/docs/dev/api/core/game.md @ 312:4ea0f035f712
doc: update according to new game API
author | David Demelier <markand@malikania.fr> |
---|---|
date | Thu, 09 Sep 2021 15:30:07 +0200 |
parents | 196264679079 |
children |
rev | line source |
---|---|
253 | 1 # Module: game |
2 | |
3 Synopsis | |
4 | |
5 ```c | |
6 #include <core/game.h> | |
7 ``` | |
8 | |
9 Main game loop and states. | |
10 | |
11 This module offers a global game structure that contain a [state](state.md). It | |
12 is designed to help switching game states and inhibit some of the functions when | |
13 necessary. | |
14 | |
312
4ea0f035f712
doc: update according to new game API
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
15 States are pushed and removed from the stack as a LIFO queue, the last pushed |
4ea0f035f712
doc: update according to new game API
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
16 state will be the first state to be removed. |
253 | 17 |
18 The main loop use a constant frame rate mechanism based on the screen refresh | |
19 rate if supported, otherwise it use a default frame rate of 60hz. In any case, | |
20 the frame rate is capped in the main loop and the elapsed time is measured | |
21 accordingly to update the game at constant speed no matter the refresh rate is | |
22 present. | |
23 | |
24 Since only one game must be present at a time, a global `game` variable is | |
25 available for convenience to not carrying it everywhere. | |
26 | |
27 ## Globals | |
28 | |
29 | Variable | Type | | |
30 |----------|---------------| | |
31 | `game` | `struct game` | | |
32 | |
33 ## Structs | |
34 | |
35 ### game | |
36 | |
37 Game structure. | |
38 | |
39 | Field | Access | Type | | |
40 |---------------------------|--------|------------------| | |
41 | [inhibit](#inhibit) | (+) | `enum inhibit` | | |
42 | |
43 #### inhibit | |
44 | |
45 Current inhibit flags set, see [inhibit](inhibit.md) for more information. | |
46 | |
47 ## Functions | |
48 | |
312
4ea0f035f712
doc: update according to new game API
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
49 ### game\_init |
253 | 50 |
312
4ea0f035f712
doc: update according to new game API
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
51 Initialize the game. This isn't required unless [game_quit](#game_quit) was |
4ea0f035f712
doc: update according to new game API
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
52 called. |
253 | 53 |
54 ```c | |
55 void | |
312
4ea0f035f712
doc: update according to new game API
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
56 game_init(void) |
253 | 57 ``` |
58 | |
312
4ea0f035f712
doc: update according to new game API
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
59 ### game\_push |
4ea0f035f712
doc: update according to new game API
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
60 |
4ea0f035f712
doc: update according to new game API
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
61 Push `state` into the stack. If there is a current running state, it is |
4ea0f035f712
doc: update according to new game API
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
62 suspended through the defined callback. |
4ea0f035f712
doc: update according to new game API
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
63 |
4ea0f035f712
doc: update according to new game API
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
64 The argument `state` must remain valid until the lifetime of the game. |
4ea0f035f712
doc: update according to new game API
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
65 |
4ea0f035f712
doc: update according to new game API
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
66 ```c |
4ea0f035f712
doc: update according to new game API
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
67 void |
4ea0f035f712
doc: update according to new game API
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
68 game_push(struct state *state) |
4ea0f035f712
doc: update according to new game API
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
69 ``` |
4ea0f035f712
doc: update according to new game API
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
70 |
4ea0f035f712
doc: update according to new game API
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
71 ### game\_pop |
4ea0f035f712
doc: update according to new game API
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
72 |
4ea0f035f712
doc: update according to new game API
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
73 Remove the last state and invoke finalizer callbacks (end, finish). If there is |
4ea0f035f712
doc: update according to new game API
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
74 a previous state into the stack, it is resumed through the defined callback. |
4ea0f035f712
doc: update according to new game API
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
75 |
4ea0f035f712
doc: update according to new game API
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
76 ```c |
4ea0f035f712
doc: update according to new game API
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
77 void |
4ea0f035f712
doc: update according to new game API
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
78 game_pop(void) |
4ea0f035f712
doc: update according to new game API
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
79 ``` |
4ea0f035f712
doc: update according to new game API
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
80 |
4ea0f035f712
doc: update according to new game API
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
81 ### game\_handle |
253 | 82 |
83 Handle the event `ev` into the current state. | |
84 | |
85 ```c | |
86 void | |
87 game_handle(const union event *ev) | |
88 ``` | |
89 | |
312
4ea0f035f712
doc: update according to new game API
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
90 ### game\_update |
253 | 91 |
312
4ea0f035f712
doc: update according to new game API
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
92 Update the current state with `ticks` (in milliseconds) since last frame. |
253 | 93 |
94 ```c | |
95 void | |
96 game_update(unsigned int ticks) | |
97 ``` | |
98 | |
312
4ea0f035f712
doc: update according to new game API
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
99 ### game\_draw |
253 | 100 |
101 Draw the current state. | |
102 | |
103 ```c | |
104 void | |
105 game_draw(void) | |
106 ``` | |
107 | |
312
4ea0f035f712
doc: update according to new game API
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
108 ### game\_loop |
253 | 109 |
110 Start a blocking loop that call in order [game_handle](#game_handle), | |
111 [game_update](#game_update) and [game_draw](#game_draw) while keeping a constant | |
112 framerate. | |
113 | |
114 ```c | |
115 void | |
116 game_loop(void) | |
117 ``` | |
118 | |
312
4ea0f035f712
doc: update according to new game API
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
119 ### game\_quit |
253 | 120 |
312
4ea0f035f712
doc: update according to new game API
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
121 Destroy all states. |
253 | 122 |
123 Even if you don't use [game_loop](#game_loop) you should call this function | |
124 because it will close state resources. | |
125 | |
126 !!! caution | |
127 If you call this function from a state itself, you must return immediately | |
128 because the state will be finalized immediately. | |
129 | |
130 ```c | |
131 void | |
132 game_quit(void) | |
133 ``` |