Getting a handle on things

The event handler is a way for us to interface with the program, it will monitor for events, store them in a queue and let us iterate through them and have actions taken based on the input. This will let us use the x to close the window and end the program, among other things.

Conceptually, we can think of the the event queue as a line up of actions, we check to can see if anything is in the line up and, if so, take the oldest one from the line and do something based on the kind of action that it was. For example, if the windows was closed, we can exit the program.

 

We’ll be moving our rendering logic into a while loop that will run constantly until we tell it we want to exit by way of the event handler. SDL_PollEvent will return a 1 if there are events in the queue to be handled, so this makes checking for and processing events fairly straightforward, before we render each frame, we will check for and handle, any events that may have occurred.

First, we need to setup an SDL_event object that will store the event found when we poll the queue, we can do that by instantiating one with: SDL_Event event;

Now when we run SDL_PollEvent(&event) it will take the oldest event off the queue and put it into event so we can process it.

A simple loop would look like this:

[pastacode lang=”cpp” manual=”bool%20quit%20%3D%20false%3B%0A%0Awhile(!quit)%0A%7B%0A%0A%20%20%20%20while(SDL_PollEvent(%26event))%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20switch(event.type)%0A%20%20%20%20%20%20%20%20%7B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20case%20SDL_QUIT%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20quit%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20case%20SDL_KEYDOWN%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20quit%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%2F%2FDo%20rendering%20stuff%20and%20game%20logic%20here%0A%0A%7D” message=”” highlight=”” provider=”manual”/]

This is a simplified example as it only checks if the window has been closed or any key has been pressed and then exits the program, but this the essence of what is required to handle any event and be able to exit out of an otherwise infinite game loop.

To make this a bit more selective, we could modify the code to read  like this:

[pastacode lang=”cpp” manual=”while(SDL_PollEvent(%26event))%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20switch(event.type)%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%20SDL_QUIT%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20quit%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%20SDL_KEYDOWN%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20switch%20(event.key.keysym.sym)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%20SDLK_q%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20quit%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%20SDLK_x%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20quit%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%7D%0A%7D” message=”” highlight=”” provider=”manual”/]

This code section has a switch that looks for an SDL_QUIT event or an SDL_KEYDOWN event, if it finds an SDL_KEYDOWN event it goes into another switch that checks to see if either SDLK_q (the SDL key code for ‘q’) or SDLK_x (the SDL key code for ‘x’) have been pressed and then exits the program, otherwise it ignores it. I’m sure you can see how this could be used to control any number of functions in a program or game.


Finally getting things moving!

Now with what we have learned here we can finally get something moving on the screen! With a simple modification to the code we’ve been building here thus far, we can make the foreground image that we rendered in the center of the screen now get rendered wherever the mouse pointer is in the window and have the application exit if we close the window or press ‘q’ or ‘x’ on the keyboard:

[pastacode lang=”cpp” manual=”%3CSDL%20and%20module%20init%20stuff%3E%0A%0A%20%20%20%20bool%20quit%20%3D%20false%3B%0A%0A%20%20%20%20%2F%2Fload%20textures%0A%0A%20%20%20%20SDL_Texture%20*background%20%3D%20loadTexture(%22Images%2Fbackground.png%22%2C%20renderer)%3B%0A%20%20%20%20%20%20%20%20SDL_Texture%20*image%20%3D%20loadTexture(%22Images%2Fimage.png%22%2Crenderer)%3B%0A%20%20%20%20%20%20%20%20if(background%20%3D%3D%20nullptr%20%7C%7C%20image%20%3D%3D%20nullptr)%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20logSDLError(std%3A%3Acout%2C%20%22loadTexture%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20SDL_DestroyTexture(background)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20SDL_DestroyTexture(image)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20SDL_DestroyRenderer(renderer)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20SDL_DestroyWindow(window)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20SDL_Quit()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%201%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%2F%2FVariables%20to%20store%20mouse%20x%20and%20y%0A%20%20%20%20%20%20%20%20int%20mouseX%20%3D%20SCREEN_WIDTH%20%2F%202%3B%0A%20%20%20%20%20%20%20%20int%20mouseY%20%3D%20SCREEN_HEIGHT%20%2F%202%3B%0A%0A%20%20%20%20%20%20%20%20int%20iW%2C%20iH%3B%0A%20%20%20%20%20%20%20%20SDL_QueryTexture(image%2C%20NULL%2C%20NULL%2C%20%26iW%2C%20%26iH)%3B%0A%20%20%20%20%20%20%20%20SDL_SetRenderDrawColor(renderer%2C%20255%2C255%2C255%2C255)%3B%20%20%2F%2FSet%20the%20clear%20colour%20to%20white.%0A%0A%20%20%20%20while(!quit)%0A%20%20%20%20%7B%0A%0A%20%20%20%20%20%20%20%20while(SDL_PollEvent(%26event))%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20switch(event.type)%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%20SDL_QUIT%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20quit%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%20SDL_KEYDOWN%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20switch%20(event.key.keysym.sym)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%20SDLK_q%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20quit%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%20SDLK_x%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20quit%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%20SDL_MOUSEMOTION%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mouseX%20%3D%20event.motion.x%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mouseY%20%3D%20event.motion.y%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20SDL_RenderClear(renderer)%3B%0A%20%20%20%20%20%20%20%20renderTexture(image%2C%20renderer%2C%20mouseX%20-%20iW%2F2%2C%20mouseY%20-%20iH%2F2)%3B%0A%0A%20%20%20%20%20%20%20%20SDL_RenderPresent(renderer)%3B%0A%0A%20%20%20%20%7D%0A%0A%3CSDL%20destroy%20and%20quit%20functions%3E” message=”” highlight=”” provider=”manual”/]

Next up we’ll make use of the vector class created ealier to implement a basic physics system and get an object bouncing around the screen!

Leave a Reply

Your email address will not be published.