Games are primarily interactive games. What is the difference between games without interaction and movies...
So we have to deal with many related events, press or open the keyboard, move the mouse, and click ....
Events are used to drive the game. SDL provides convenient functions to process events in the program. Events are defined as the combined sdl_event for multiple events, the following function retrieves the first event in the event queue:
Int sdl_pollevent (sdl_event * event );
This function obviously gives him the address of the sdl_event variable, which will return the event to the corresponding structure. This function will not wait for the event to arrive, or will not block, whether there is any event, return directly. The following function will wait for the event to arrive.
Int sdl_waitevent (sdl_event * event );
Both functions extract events from the queue, and
Int sdl_peepevent (sdl_event * event );
Just peek at the content of the first event...
It is enough to have these three functions to obtain the event. The following describes how to handle the event.
We can easily determine the Event Type
Sdl_event event;
Determine the event. the value of type is used to differentiate the event type, and then the corresponding type. The event is a different struct. Corresponding Members can determine what event occurred and where it has changed. For example: which button is pressed?
Of course, sometimes it is annoying to judge one by one. We can use the following functions to get the status of events we care about:
Uint8 * sdl_getkeystate (int * numkeys );
Uint8 sdl_getmousestate (int * X, int * y );
There are also some similar functions that return an array to save the status of some events. By accessing the array, you can know the status of the corresponding events.
Finally, based on what we learned, write a simple program that obtains keyboard and mouse events and outputs events in Chinese.
# Include <SDL/SDL. h> # include <SDL/sdl_image.h> # include <SDL/sdl_ttf.h> # include <stdio. h> # define wm_width 860 # define wm_height 460 # define wm_bits 32 # define wm_flags sdl_swsurfaceconst char * fontname = "jdfyuanyi. TTF "; const char * backname =" back.bmp "; sdl_surface * screen = NULL; sdl_surface * Background = NULL; ttf_font * font = NULL; void Init (void ); void clean (void); void event_handle (void); sdl_surface * load_image (const char * INAME); void draw_surface (int x, int y, const char * MSG ); void error_quit () {printf ("some errors: % s \ n", sdl_geterror (); exit (exit_failure);} int main (INT argc, char ** argv) {Init (); atexit (clean); draw_surface (screen-> clip_rect.w-12)/2, (screen-> clip_rect.h-16)/2, "Welcome to SDL "); event_handle (); exit (exit_success);} void Init (void) {If (sdl_init (handle) =-1) error_quit (); screen = sdl_setvideomode (wm_width, wm_height, wm_bits, wm_flags); If (screen = NULL) error_quit (); sdl_wm_setcaption ("SDL events", null); If (ttf_init () =-1) error_quit (); font = ttf_openfont (fontname, 16); If (font = NULL) error_quit (); background = load_image (backname); If (font = NULL) error_quit ();} void clean (void) {sdl_freesurface (background); ttf_closefont (font); ttf_quit (); sdl_quit ();} void event_handle (void) {int gameover = 0; while (gameover = 0) {sdl_event gevent; If (sdl_waitevent (& gevent) {Switch (gevent. type) {Case sdl_quit: gameover = 1; break; Case sdl_keydown: draw_surface (screen-> clip_rect.w-12)/2, (screen-> clip_rect.h-16)/2, "press the button"); break; Case sdl_keyup: draw_surface (screen-> clip_rect.w-12)/2, (screen-> clip_rect.h-16)/2, "button released "); break; Case sdl_mousemotion: draw_surface (screen-> clip_rect.w-12)/2, (screen-> clip_rect.h-16)/2, "move the mouse"); break; Case sdl_mousebuttonup: draw_surface (screen-> clip_rect.w-12)/2, (screen-> clip_rect.h-16)/2, "Mouse removed"); break; Case sdl_mousebuttondown: draw_surface (screen-> clip_rect.w-12) /2, (screen-> clip_rect.h-16)/2, "Mouse pressed"); break; default: draw_surface (screen-> clip_rect.w-12)/2, (screen-> clip_rect.h-16) /2, "Unrecognized events"); break ;}}} void draw_surface (int x, int y, const char * MSG) {sdl_surface * message = NULL; sdl_color wordcolor = {255,255, 0}; message = ttf_renderutf8_solid (font, MSG, wordcolor); If (Message = NULL) error_quit (); If (sdl_blitsurface (background, null, screen, null) =-1) error_quit (); sdl_rect offset; offset. X = x; offset. y = y; If (sdl_blitsurface (message, null, screen, & offset) =-1) error_quit (); sdl_freesurface (Message); If (sdl_flip (screen) =-1) error_quit ();} sdl_surface * load_image (const char * INAME) {sdl_surface * image = NULL; sdl_surface * format = NULL; image = img_load (INAME ); if (image = NULL) error_quit (); format = sdl_displayformat (image); sdl_freesurface (image); If (format = NULL) error_quit (); Return format ;}