Section 16 | Home page | Section 18 |
As a more complex example of a complete GEM program, my Sokoban implementation may be worth a look. The source code is at https://github.com/petercrlane/sokoban The program illustrates use of a menu, multiple windows, file selector and multiple event types.
If you review that source code, you will find many things similar to the code in this document, however, some things are different. This document was written, in part, to simplify and unify the code I have for GEM handling in my programs, and I haven’t put all the simplifications back. Also, in a larger application, there are simply more things to handle, which add a layer of complexity.
In particular, note how I manage different window types: there is one
window showing a list of levels, and other windows showing the levels
in the game, and a third window type is used to show statistics. I
have a slot in win_data
called window_type
, and this is set to
LEVELS
, POSITION
or STATISTICS
when the window is created. Within
draw_interior
I now switch to the appropriate calling code, depending
on the window type.
Additionally, in some situations, such as when a move is made, not all
of the window needs to be redrawn. I have used a flag for the type of
update: when a move is made, this flag is MOVE
. The drawing code for
the position will then only update the parts of the window related to that
last move. Such refinements are necessary to prevent your application
flickering too much, due to constant updates.
Sokoban also provides an example of evnt_multi
, as the program responds
to window events, as above, but also mouse and keyboard events. Double
click mouse events are monitored and, when they occur on the table of levels,
their position is compared with a list of positions of the level names, so
the program can open the correct level as selected in the table.