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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
|
* Things To Do
** DONE Game loop
Provide a game loop structure that responds to input events,
updates the game state, renders the scene. Use a fixed update
timestep and cap the maximum FPS.
** DONE Input
Provide hooks to respond to keyboard, mouse, and joystick events.
Wrap SDL keycode, mouse button, etc. constants in our own
enumeration.
- [X] Keyboard
- [X] Mouse
- [X] Window (active, resize, quit)
- [X] Joystick
** DONE Sprites
Encapsulates an image and all of its transformations: position,
rotation, scale, color, etc.
- [X] Use FreeImage
- [X] Add support for texture regions
- [X] Add support for animations
- [X] Use a sprite batch when drawing if one is currently bound
** TODO Sprite batches
Efficiently render a large number of sprites. Only change OpenGL
context when necessary. For example, don't change texture when
rendering several sprites in a row that use the same one.
** DONE Tilesets
Break an image up into many small pieces. Useful for creating maps.
- [X] Algorithm to split texture into tiles
- [X] <tileset> type
** DONE Animations
Create a data type to represent an animated sequence of textures
and/or texture regions.
** TODO Tile maps
- [ ] Create a generic tilemap module
- [ ] Create a loader for Tiled .tmx map files.
** DONE Scene graph
A tree structure that is traversed when rendering a game scene.
The graph is composed of groups and nodes. Transformations are
accumulated as the tree is walked.
** DONE Scripting
Provide a way for users to easily script 2D games using coroutines
and a scheduler.
- [X] Coroutines
- [X] Agenda
** DONE Vectors and matrices
Vectors and matrices are needed constantly for games. Provide an
easy-to-use module that provides procedures for common
vector/matrix math operations
- [X] Vectors
- [X] Matrices
** DONE Fonts
- [X] Write wrappers for needed FTGL functions
- [X] Write font rendering procedures
** DONE Sound
Provide helpful wrappers around SDL sound procedures?
** TODO A* pathfinding
A* is a commonly used pathfinding algorithm for games. Pathfinding
is such a common task that it would be nice to provide users with
a generic implementation.
** TODO Bounding box collision detection
Most games need simple bounding box collision detection. Provide an
efficient implementation that uses quad trees.
- [X] Rect module
- [ ] Quadtree module (needs more thought, a purely functional data
structure would be preferable)
** TODO Particle systems
Provide a highly configurible particle simulation system.
- [ ] Investigate ways to make it fast. Use guile-compost for
performance reasons.
** TODO Asset Management
Provide a generic system for loading assets (images, sounds, fonts,
etc.) and storing them in a cache. Explore using weak keys so that
assets are removed from the cache when they are no longer
referenced.
- [ ] Create asset cache
- [X] Live asset reloading
** TODO Keymaps
Provide an Emacs-like way of defining key combinations so that
multi-button input is easy for users.
- [ ] Abstract away input methods
Controls can be bound to keys, mouse, whatever
- [ ] Basic sequences
Press A then B
- [ ] Simultaneous key presses
Press A and B at the same time
- [ ] Composing sequences
Press A then B + C
- [ ] Timeouts
Press A then B then C within 15 frames time
- [ ] Sequences with actions along the way
Press A to kick, then forward + B to uppercut, within 30 frames
time.
** TODO GUI widgets
Provide a set of common graphical widgets such as buttons, scroll
bars, and sliders.
** DONE REPL
Provide a REPL that plays nice with the game loop. Easier said than
done.
- [X] Modify Guile's REPL to work with the game loop
- Short-term solution that *mostly* works
- [X] Write a new REPL that runs in the current thread
- Use coroutines
- Read user input from a separate thread so as to not block the
main thread
- Will be available in Guile 2.0.10!
** TODO Shaders
- [ ] Scheme -> GLSL compiler
Port http://wiki.call-cc.org/eggref/4/glls to guile?
** TODO Upgrade to SDL2
Write necessary bindings and release [[https://git.dthompson.us/guile-sdl2.git][guile-sdl2]].
** TODO "Nine patches"
Images that have a resizable central area but fixed width/height
edges. See [[https://developer.android.com/guide/topics/graphics/2d-graphics.html#nine-patch][this Android document]] for details.
** TODO Job control for agenda
Allow for pausing and cancelling jobs.
** TODO Async/threaded signals?
Not sure how to do this as some things, such as SDL and OpenGL
calls, *must* be done in the main thread. Maybe signals should
just stay synchronous.
** TODO Smooth animation helper
Remove the temporal aliasing in animation by interpolating between
current and previous state of animated objects.
** TODO Bitmap font rendering from tileset
Some fonts aren't available in TTF format, only as a tileset image.
It would very useful for 2D games to be able to render these. Even
better if the font rendering procedures are made polymorphic to
handle this new type of font.
** TODO Geometry combinators
A functional interface for composing complex geometry from the
simple building block of triangles. A square is 2 triangles, a
cube is 6 squares, etc. A triangle has 3 vertices with a
particular winding.
** DONE 0.1 Release
A 0.1 release was made under the project's old name, guile-2d. Now
that things have changed so drastically and the name has been
changed, a new 0.1 release will be made.
- [X] New REPL server
Use the (system repl coop-server) module in Guile 2.0.11.
- [ ] Screencast
- [-] Relatively complete documentation (it's a start)
- [X] Clean up font module
- [X] Add GLSL shaders
- [X] Finish FRP module
- [X] Make basic webpage with HTML docs
- [X] Basic rendering (must support sprites and text)
|