<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SDLTutorials.com &#187; sdl tutorial</title>
	<atom:link href="http://www.sdltutorials.com/tag/sdl-tutorial/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.sdltutorials.com</link>
	<description>SDL Tutorials - Game Tutorials - Programming Tutorials</description>
	<lastBuildDate>Tue, 20 Jul 2010 19:56:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>SDL Tutorial &#8211; Tic Tac Toe</title>
		<link>http://www.sdltutorials.com/sdl-tutorial-tic-tac-toe/</link>
		<comments>http://www.sdltutorials.com/sdl-tutorial-tic-tac-toe/#comments</comments>
		<pubDate>Sat, 03 Nov 2007 14:31:44 +0000</pubDate>
		<dc:creator>Tim Jones</dc:creator>
				<category><![CDATA[SDL Tutorials]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[sdl tutorial]]></category>

		<guid isPermaLink="false">http://devhub.lostfish.org/sdl-tutorial-4/</guid>
		<description><![CDATA[Up to this point we have been laying the foundation for developing a game. So far we&#8217;ve setup a basic structure to handle common routines, we&#8217;ve setup a special class to handle events, and we&#8217;ve also setup a class to handle a few surface functions. In this tutorial we&#8217;ll take all those things, combine them, [...]]]></description>
			<content:encoded><![CDATA[<p>Up to this point we have been laying the foundation for <b>developing a game</b>. So far we&#8217;ve setup a basic structure to handle common routines, we&#8217;ve setup a special class to handle events, and we&#8217;ve also setup a class to handle a few surface functions. In this tutorial we&#8217;ll take all those things, combine them, and create a tic-tac-toe game. Don&#8217;t worry, things should be pretty simple. Use the last tutorial to build off of.</p>
<p>The first thing we are going to need to do is plan our game. From experience, we know that tic-tac-toe has a 3&#215;3 grid, where you place X&#8217;s and O&#8217;s. So, we know that we will need 3 graphics, one for the grid, one for the X, and one for the O. We don&#8217;t need multiples of the X or O, because we can draw them in the program as many times as we like. Lets eliminate this first step. Our grid is going to be 600&#215;600, and our X&#8217;s and O&#8217;s will be 200&#215;200 (1/3 of the area).</p>
<p><span id="more-16"></span></p>
<p><img src="../tutorials/grid.png" alt="Grid" /><img src="../tutorials/o.png" alt="O" /><img src="../tutorials/x.png" alt="X" /></p>
<p>Now that we have our images, we are going to need a way to load them into our program. Open up CApp.h and make some modifications. Remove the Test Surface, and add three new surfaces.</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="co2">#ifndef _CAPP_H_</span><br />
&nbsp; &nbsp; <span class="co2">#define _CAPP_H_</span></p>
<p><span class="co2">#include &lt;SDL.h&gt;</span></p>
<p><span class="co2">#include &quot;CEvent.h&quot;</span><br />
<span class="co2">#include &quot;CSurface.h&quot;</span></p>
<p><span class="kw2">class</span> CApp : <span class="kw2">public</span> CEvent <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">private</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">bool</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Running;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; SDL_Surface* &nbsp; &nbsp;Surf_Display;</p>
<p>&nbsp; &nbsp; <span class="kw2">private</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; SDL_Surface* &nbsp; &nbsp;Surf_Grid;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; SDL_Surface*&nbsp; &nbsp; Surf_X;<br />
&nbsp; &nbsp; &nbsp; &nbsp; SDL_Surface*&nbsp; &nbsp; Surf_O;</p>
<p>&nbsp; &nbsp; <span class="kw2">public</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; CApp<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> OnExecute<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; <span class="kw2">public</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">bool</span> OnInit<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> OnEvent<span class="br0">&#40;</span>SDL_Event* Event<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> OnExit<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> OnLoop<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> OnRender<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> OnCleanup<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span>;</p>
<p><span class="co2">#endif</span></div>
<p>Also, open up CApp.cpp and make some modifications. Remove the Test Surface again, and add the three new ones again.</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="co2">#include &quot;CApp.h&quot;</span></p>
<p>CApp::<span class="me2">CApp</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; Surf_Grid = <span class="kw2">NULL</span>;<br />
&nbsp; &nbsp; Surf_X = <span class="kw2">NULL</span>;<br />
&nbsp; &nbsp; Surf_O = <span class="kw2">NULL</span>;</p>
<p>&nbsp; &nbsp; Surf_Display = <span class="kw2">NULL</span>;</p>
<p>&nbsp; &nbsp; Running = <span class="kw2">true</span>;<br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">int</span> CApp::<span class="me2">OnExecute</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>OnInit<span class="br0">&#40;</span><span class="br0">&#41;</span> == <span class="kw2">false</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">-1</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; SDL_Event Event;</p>
<p>&nbsp; &nbsp; <span class="kw1">while</span><span class="br0">&#40;</span>Running<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span><span class="br0">&#40;</span>SDL_PollEvent<span class="br0">&#40;</span>&amp;Event<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OnEvent<span class="br0">&#40;</span>&amp;Event<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; OnLoop<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; OnRender<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; OnCleanup<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span>;<br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="kw4">int</span> argc, <span class="kw4">char</span>* argv<span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; CApp theApp;</p>
<p>&nbsp; &nbsp; <span class="kw1">return</span> theApp.<span class="me1">OnExecute</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></div>
<p>And, you guessed it, open up CApp_OnCleanup.cpp to make some modifications there too. Just like before, get rid of the Test Surface and add the three new ones.</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="co2">#include &quot;CApp.h&quot;</span></p>
<p><span class="kw4">void</span> CApp::<span class="me2">OnCleanup</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; SDL_FreeSurface<span class="br0">&#40;</span>Surf_Grid<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; SDL_FreeSurface<span class="br0">&#40;</span>Surf_X<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; SDL_FreeSurface<span class="br0">&#40;</span>Surf_O<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; SDL_FreeSurface<span class="br0">&#40;</span>Surf_Display<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; SDL_Quit<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></div>
<p>Now that we have the surfaces setup, lets load them into memory. Open up CApp_OnInit.cpp, and make some changes. Get rid of the test surface (again), and load the three new ones. Be sure to put the correct filenames. Also, change the dimensions of the window to 600&#215;600, the size of the grid. This make sure we don&#8217;t have any blank space around the window we aren&#8217;t using.</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="co2">#include &quot;CApp.h&quot;</span></p>
<p><span class="kw4">bool</span> CApp::<span class="me2">OnInit</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>SDL_Init<span class="br0">&#40;</span>SDL_INIT_EVERYTHING<span class="br0">&#41;</span> &lt; <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="br0">&#40;</span>Surf_Display = SDL_SetVideoMode<span class="br0">&#40;</span><span class="nu0">600</span>, <span class="nu0">600</span>, <span class="nu0">32</span>, SDL_HWSURFACE | SDL_DOUBLEBUF<span class="br0">&#41;</span><span class="br0">&#41;</span> == <span class="kw2">NULL</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="br0">&#40;</span>Surf_Grid = CSurface::<span class="me2">OnLoad</span><span class="br0">&#40;</span><span class="st0">&quot;./gfx/grid.bmp&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> == <span class="kw2">NULL</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="br0">&#40;</span>Surf_X = CSurface::<span class="me2">OnLoad</span><span class="br0">&#40;</span><span class="st0">&quot;./gfx/x.bmp&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> == <span class="kw2">NULL</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="br0">&#40;</span>Surf_O = CSurface::<span class="me2">OnLoad</span><span class="br0">&#40;</span><span class="st0">&quot;./gfx/o.bmp&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> == <span class="kw2">NULL</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">true</span>;<br />
<span class="br0">&#125;</span></div>
<p>You may have noticed a change I made in the filenames. I added ./gfx/ before the filename to specify which folder the graphics are in. As games begin to grow it&#8217;s very practical to have all the files in one folder. Because of such, from hereon, all images will be put in the gfx folder.</p>
<p>Now, let&#8217;s get the grid showing up on the screen. Open up CApp_OnRender.cpp and change the test surface rendering to make the grid render.</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="co2">#include &quot;CApp.h&quot;</span></p>
<p><span class="kw4">void</span> CApp::<span class="me2">OnRender</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; CSurface::<span class="me2">OnDraw</span><span class="br0">&#40;</span>Surf_Display, Surf_Grid, <span class="nu0">0</span>, <span class="nu0">0</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; SDL_Flip<span class="br0">&#40;</span>Surf_Display<span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></div>
<p>Try compiling your program, and if successful, you should see the grid show up. Remember, there are basically 5 steps to using a surface: declare it, set it to NULL, load it, draw it, and then free it. It&#8217;s good practice to learn all these 5 steps now, because later on if you neglect one of these steps if can cause problems. For example, neglecting to set a surface to NULL can cause undefined behavior, or neglecting to free a surface can cause a memory leak.</p>
<p>You may have noticed something odd about the graphics we are using, the X and O contain a pink background. There is a reason for it, we are going to implement transparency onto these surfaces. Basically, wherever there is pink, it will show through; we will make the pink color transparent. SDL offers a simple function to do this, SDL_SetColorKey. To implement this, open up CSurface.h so we can add a new function.</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="co2">#ifndef _CSURFACE_H_</span><br />
&nbsp; &nbsp; <span class="co2">#define _CSURFACE_H_</span></p>
<p><span class="co2">#include &lt;SDL.h&gt;</span></p>
<p><span class="kw2">class</span> CSurface <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">public</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; CSurface<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; <span class="kw2">public</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">static</span> SDL_Surface* OnLoad<span class="br0">&#40;</span><span class="kw4">char</span>* <span class="kw4">File</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">static</span> <span class="kw4">bool</span> OnDraw<span class="br0">&#40;</span>SDL_Surface* Surf_Dest, SDL_Surface* Surf_Src, <span class="kw4">int</span> X, <span class="kw4">int</span> Y<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">static</span> <span class="kw4">bool</span> OnDraw<span class="br0">&#40;</span>SDL_Surface* Surf_Dest, SDL_Surface* Surf_Src, <span class="kw4">int</span> X, <span class="kw4">int</span> Y, <span class="kw4">int</span> X2, <span class="kw4">int</span> Y2, <span class="kw4">int</span> W, <span class="kw4">int</span> H<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">static</span> <span class="kw4">bool</span> Transparent<span class="br0">&#40;</span>SDL_Surface* Surf_Dest, <span class="kw4">int</span> R, <span class="kw4">int</span> G, <span class="kw4">int</span> B<span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span>;</p>
<p><span class="co2">#endif</span></div>
<p>Now, to implement this function, open up CSurface.cpp and add the function:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw4">bool</span> CSurface::<span class="me2">Transparent</span><span class="br0">&#40;</span>SDL_Surface* Surf_Dest, <span class="kw4">int</span> R, <span class="kw4">int</span> G, <span class="kw4">int</span> B<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>Surf_Dest == <span class="kw2">NULL</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; SDL_SetColorKey<span class="br0">&#40;</span>Surf_Dest, SDL_SRCCOLORKEY | SDL_RLEACCEL, SDL_MapRGB<span class="br0">&#40;</span>Surf_Dest-&gt;format, R, G, B<span class="br0">&#41;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">true</span>;<br />
<span class="br0">&#125;</span></div>
<p>Notice 3 extra arguments being passed besides the surface. These are the 3 color values that we want to make transparent, it doesn&#8217;t have to be just pink. For instance, it we wanted red to be transparent it would be 255, 0, 0.</p>
<p>This function first checks to see if we have a valid surface. If so, we set a color key (transparency) for a color. The first argument is the surface to apply the color key to, the second is some flags telling SDL how to perform the operation, and the third is the color to make transparent. The flags being applied are basic, the first tells SDL to apply the color key to the source (the surface being passed) and the second tells SDL to try to use RLE acceleration (basically, try to make drawing later on faster). The third argument is a little bit more complex; we are using SDL_MapRGB in order to create a color. SDL_MapRGB takes a surface, and your requested color (R, G, B), and tries to match it as close as it can to that surface. You might be thinking why this is useful. Not all surfaces have the same color palette. Remember the old NES days where there was only a few colors that could be used? Same idea here, <b>SDL_MapRGB</b> takes a color and matches it with the closest color on that surface palette.</p>
<p>Lets apply this new function to our surfaces now, open up CApp_OnInit.cpp and make the following changes:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="co2">#include &quot;CApp.h&quot;</span></p>
<p><span class="kw4">bool</span> CApp::<span class="me2">OnInit</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>SDL_Init<span class="br0">&#40;</span>SDL_INIT_EVERYTHING<span class="br0">&#41;</span> &lt; <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="br0">&#40;</span>Surf_Display = SDL_SetVideoMode<span class="br0">&#40;</span><span class="nu0">600</span>, <span class="nu0">600</span>, <span class="nu0">32</span>, SDL_HWSURFACE | SDL_DOUBLEBUF<span class="br0">&#41;</span><span class="br0">&#41;</span> == <span class="kw2">NULL</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="br0">&#40;</span>Surf_Grid = CSurface::<span class="me2">OnLoad</span><span class="br0">&#40;</span><span class="st0">&quot;./gfx/grid.bmp&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> == <span class="kw2">NULL</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="br0">&#40;</span>Surf_X = CSurface::<span class="me2">OnLoad</span><span class="br0">&#40;</span><span class="st0">&quot;./gfx/x.bmp&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> == <span class="kw2">NULL</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="br0">&#40;</span>Surf_O = CSurface::<span class="me2">OnLoad</span><span class="br0">&#40;</span><span class="st0">&quot;./gfx/o.bmp&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> == <span class="kw2">NULL</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; CSurface::<span class="me2">Transparent</span><span class="br0">&#40;</span>Surf_X, <span class="nu0">255</span>, <span class="nu0">0</span>, <span class="nu0">255</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; CSurface::<span class="me2">Transparent</span><span class="br0">&#40;</span>Surf_O, <span class="nu0">255</span>, <span class="nu0">0</span>, <span class="nu0">255</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">true</span>;<br />
<span class="br0">&#125;</span></div>
<p>Everything for the surfaces should be set. The next thing we have to do is figure out a way to draw these X&#8217;s and O&#8217;s. We can&#8217;t just draw them everywhere on the grid because they won&#8217;t always be in the same spots. What we are going to have to do is make an array of 9 containers, the values in this array will tell us the values for each cell on the grid. So, spot 0 would be the top left, 1 would be the top middle, 2 the top right, 3 the middle left, and so on. Create this array by adding it to CApp.h:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="co2">#ifndef _CAPP_H_</span><br />
&nbsp; &nbsp; <span class="co2">#define _CAPP_H_</span></p>
<p><span class="co2">#include &lt;SDL.h&gt;</span></p>
<p><span class="co2">#include &quot;CEvent.h&quot;</span><br />
<span class="co2">#include &quot;CSurface.h&quot;</span></p>
<p><span class="kw2">class</span> CApp : <span class="kw2">public</span> CEvent <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">private</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">bool</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Running;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; SDL_Surface* &nbsp; &nbsp;Surf_Display;</p>
<p>&nbsp; &nbsp; <span class="kw2">private</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; SDL_Surface* &nbsp; &nbsp;Surf_Grid;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; SDL_Surface*&nbsp; &nbsp; Surf_X;<br />
&nbsp; &nbsp; &nbsp; &nbsp; SDL_Surface*&nbsp; &nbsp; Surf_O;</p>
<p>&nbsp; &nbsp; <span class="kw2">private</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span>&nbsp;&nbsp; &nbsp; Grid<span class="br0">&#91;</span><span class="nu0">9</span><span class="br0">&#93;</span>;</p>
<p>&nbsp; &nbsp; <span class="kw2">public</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; CApp<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> OnExecute<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; <span class="kw2">public</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">bool</span> OnInit<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> OnEvent<span class="br0">&#40;</span>SDL_Event* Event<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> OnExit<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> OnLoop<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> OnRender<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> OnCleanup<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span>;</p>
<p><span class="co2">#endif</span></div>
<p>We know that each cell can have three possible values: Empty, X, and O. These tell us what is currently in that cell. To make things a little neater than having 0, 1, 2 as values, we&#8217;ll use an enum instead. If you are umfamiliar with how an enum works, try finding a quick tutorial on them. Just know that GRID_TYPE_NONE = 0, GRID_TYPE_X = 1, and GRID_TYPE_O = 2. Go back to CApp.h and add the following underneath the Grid array:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw2">enum</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; GRID_TYPE_NONE = <span class="nu0">0</span>,<br />
&nbsp; &nbsp; GRID_TYPE_X,<br />
&nbsp; &nbsp; GRID_TYPE_O<br />
<span class="br0">&#125;</span>;</div>
<p>Note, up to this point I have been displaying practically all the code when I am referring to different files. From hereon, I expect you to know where code goes. Most of the time I will tell you where to place it by, and sometimes I might display all the code.</p>
<p>Now that we have a way to know what a cell is, we&#8217;re going to need a way to reset the board. Let&#8217;s create a new function at the bottom inside of CApp.h called Reset.</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw2">public</span>:<br />
&nbsp; &nbsp; <span class="kw4">void</span> Reset<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
<p>Open up CApp.cpp and add the following function just before int main:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw4">void</span> CApp::<span class="me2">Reset</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span><span class="kw4">int</span> i = <span class="nu0">0</span>;i &lt; <span class="nu0">9</span>;i++<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; Grid<span class="br0">&#91;</span>i<span class="br0">&#93;</span> = GRID_TYPE_NONE;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
<p>This loop will set every cell in the grid to GRID_TYPE_NONE, meaning that all the cells are empty. We&#8217;re going to have to do this at the very beginning when our program is loaded, so make a call to this function within the CApp_OnInit.cpp file:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="co1">//&#8230;</span></p>
<p>CSurface::<span class="me2">Transparent</span><span class="br0">&#40;</span>Surf_X, <span class="nu0">255</span>, <span class="nu0">0</span>, <span class="nu0">255</span><span class="br0">&#41;</span>;<br />
CSurface::<span class="me2">Transparent</span><span class="br0">&#40;</span>Surf_O, <span class="nu0">255</span>, <span class="nu0">0</span>, <span class="nu0">255</span><span class="br0">&#41;</span>;</p>
<p>Reset<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
<p>So far so good. The next thing we are going to have to do is make the ability to place X&#8217;s and O&#8217;s on the screen. Lets create a new function that will handle this. Open up CApp.h again and add the function just below Reset.</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw4">void</span> SetCell<span class="br0">&#40;</span><span class="kw4">int</span> ID, <span class="kw4">int</span> Type<span class="br0">&#41;</span>;</div>
<p>Now, open back up CApp.cpp and add the function:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw4">void</span> CApp::<span class="me2">SetCell</span><span class="br0">&#40;</span><span class="kw4">int</span> ID, <span class="kw4">int</span> Type<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>ID &lt; <span class="nu0">0</span> || ID &gt;= <span class="nu0">9</span><span class="br0">&#41;</span> <span class="kw1">return</span>;<br />
&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>Type &lt; <span class="nu0">0</span> || Type &gt; GRID_TYPE_O<span class="br0">&#41;</span> <span class="kw1">return</span>;</p>
<p>&nbsp; &nbsp; Grid<span class="br0">&#91;</span>ID<span class="br0">&#93;</span> = Type;<br />
<span class="br0">&#125;</span></div>
<p>This function takes two arguments, the first is the cell ID to change, and the second is the type to change it to. We have to conditions here, the first is to make sure we don&#8217;t go outside the bounds of the array (if we did it would likely crash our program), and the second is to make sure we passed an appropriate type. Simple enough.</p>
<p>Now, let&#8217;s implement a way to draw the X&#8217;s and O&#8217;. Open up CApp_OnRender and add the following code just after the grid:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw1">for</span><span class="br0">&#40;</span><span class="kw4">int</span> i = <span class="nu0">0</span>;i &lt; <span class="nu0">9</span>;i++<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw4">int</span> X = <span class="br0">&#40;</span>i % <span class="nu0">3</span><span class="br0">&#41;</span> * <span class="nu0">200</span>;<br />
&nbsp; &nbsp; <span class="kw4">int</span> Y = <span class="br0">&#40;</span>i / <span class="nu0">3</span><span class="br0">&#41;</span> * <span class="nu0">200</span>;</p>
<p>&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>Grid<span class="br0">&#91;</span>i<span class="br0">&#93;</span> == GRID_TYPE_X<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; CSurface::<span class="me2">OnDraw</span><span class="br0">&#40;</span>Surf_Display, Surf_X, X, Y<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><span class="kw1">else</span><br />
&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>Grid<span class="br0">&#91;</span>i<span class="br0">&#93;</span> == GRID_TYPE_O<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; CSurface::<span class="me2">OnDraw</span><span class="br0">&#40;</span>Surf_Display, Surf_O, X, Y<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
<p>This is a little bit more complex than we have been used to so far. Firstly, we are looping through each cell in the grid. Next, we are translating that grid ID over to X and Y coordinates. We do this in two different ways. To find X, we take the remainder of i to 3. This will give us 0 when i is 0, 1 when i is 1, 2 when i is 2, 0 when i is 3, and so on. We multiply it by 200 because each cell is 200&#215;200 pixels. To find Y, we divide by 3, this causes Y to be 0 when i is 0, 1, 2, Y to be 1 when i is 3, 4, 5, and so on. We then multiply that by 200 as well. I encourage you to really try to understand what is going on here because this sort of method is used for tile based games.</p>
<p>Next, all we have to do is check the cell type, and then draw the correct surface at that cell.</p>
<p>Now that we have our surfaces drawing, we&#8217;ll need a way to communicate from the user to the computer. We&#8217;ll use mouse events for this. When the users clicks a cell it will set the cell appropriately. We are going to need to overload one of the CEvent functions for this. Open up CApp.h and add the following function just below OnEvent and next to OnExit.</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw4">void</span> OnLButtonDown<span class="br0">&#40;</span><span class="kw4">int</span> mX, <span class="kw4">int</span> mY<span class="br0">&#41;</span>;</div>
<p>Now, open up CApp_OnEvent.cpp and add the function:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw4">void</span> CApp::<span class="me2">OnLButtonDown</span><span class="br0">&#40;</span><span class="kw4">int</span> mX, <span class="kw4">int</span> mY<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw4">int</span> ID&nbsp; = mX / <span class="nu0">200</span>;<br />
&nbsp; &nbsp; ID = ID + <span class="br0">&#40;</span><span class="br0">&#40;</span>mY / <span class="nu0">200</span><span class="br0">&#41;</span> * <span class="nu0">3</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>Grid<span class="br0">&#91;</span>ID<span class="br0">&#93;</span> != GRID_TYPE_NONE<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>CurrentPlayer == <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; SetCell<span class="br0">&#40;</span>ID, GRID_TYPE_X<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; CurrentPlayer = <span class="nu0">1</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><span class="kw1">else</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; SetCell<span class="br0">&#40;</span>ID, GRID_TYPE_O<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; CurrentPlayer = <span class="nu0">0</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
<p>First, we are doing the reverse of what we did with translating to X and Y from an ID, this time we are translating to an ID. We then make sure that that cell hasn&#8217;t already been taken, if it has, we return out of the function. Next, we are checking which players turn it is, set the cell appropriately, and then switch turns. CurrentPlayer is a new variable to specify whose turn it is, so we&#8217;ll need to add this. Open up CApp.h and add the variable below the grid array:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw4">int</span> CurrentPlayer;</div>
<p>Also, set the default value for this variable in CApp.cpp:</p>
<div class="dean_ch" style="white-space: wrap;">
CApp::<span class="me2">CApp</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; CurrentPlayer = <span class="nu0">0</span>;</p>
<p>&nbsp; &nbsp; Surf_Grid = <span class="kw2">NULL</span>;<br />
&nbsp; &nbsp; Surf_X = <span class="kw2">NULL</span>;<br />
&nbsp; &nbsp; Surf_O = <span class="kw2">NULL</span>;</p>
<p>&nbsp; &nbsp; Surf_Display = <span class="kw2">NULL</span>;</p>
<p>&nbsp; &nbsp; Running = <span class="kw2">true</span>;<br />
<span class="br0">&#125;</span></div>
<p>Try compiling the program and you should have a mostly working version of tic-tac-toe. Congratulations!</p>
<p>This is where you take the rest of it yourself. We have a solid foundation for our game, and most the work done. I encourage you to take this a step further. Try adding a &#8220;X Won&#8221;, &#8220;O Won&#8221;, and &#8220;Draw&#8221; at the end of each game (extra images here). Think, how are you going to check who won (a function for this purpose would fit well)? Try adding a way to reset the game after it&#8217;s done. If you are brave, try to add some generic AI that will play against the user. And if you are even braver, try adding the ability to play player vs. player, or player vs. computer.</p>
<p>When you are ready, and have a firm grasp of this tutorial, move on to the next lesson to look at frame animation.</p>
<p><b>SDL Tutorial &#8211; Tic Tac Toe &#8211; Tutorial Files:</b><br />
<b>Win32:</b> <a href="../tutorials/sdl-tutorial-tic-tac-toe.zip">Zip</a>, <a href="../tutorials/sdl-tutorial-tic-tac-toe.rar">Rar</a><br />
<b>Linux:</b> <a href="../tutorials/sdl-tutorial-tic-tac-toe.tar.gz">Tar</a> (Thanks Gaten)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sdltutorials.com/sdl-tutorial-tic-tac-toe/feed/</wfw:commentRss>
		<slash:comments>85</slash:comments>
		</item>
		<item>
		<title>SDL Events</title>
		<link>http://www.sdltutorials.com/sdl-events/</link>
		<comments>http://www.sdltutorials.com/sdl-events/#comments</comments>
		<pubDate>Thu, 25 Oct 2007 21:25:46 +0000</pubDate>
		<dc:creator>Tim Jones</dc:creator>
				<category><![CDATA[SDL Tutorials]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[sdl tutorial]]></category>

		<guid isPermaLink="false">http://devhub.lostfish.org/sdl-tutorial-3/</guid>
		<description><![CDATA[Alongside the basics of game development is something called Events. All videogames, from basic free poker applications to the highly complex PC games and console titles, use events to interact with the player. These events can come from keyboards, mice, joysticks, gamepads, and so on, or events from our operating system. It&#8217;s important to understand [...]]]></description>
			<content:encoded><![CDATA[<p>Alongside the basics of <a href="http://www.sdltutorials.com/sdl-coordinates-and-blitting/">game development</a> is something called Events. All videogames, from basic <a href="http://www.pokerstars.es/">free poker</a> applications to the highly complex PC games and console titles, use events to interact with the player. These events can come from keyboards, mice, joysticks, gamepads, and so on, or events from our operating system. It&#8217;s important to understand how events work if we are to appropriately interact a user with a game. We&#8217;ve already been using events, but only for closing our window, now we&#8217;ll look at how to receive events from the user.<span id="more-14"></span></p>
<p>If you haven&#8217;t caught on, each tutorial builds off the previous, so we&#8217;ll be using the code from the previous lesson. In order to track all these events and throw them into nice functions, lets create a new class. Create two files called CEvent.h and CEvent.cpp. These two files will handle our events, and call the appropriate function. CApp will inherit this class, so when we need to catch an event we simply override a function.</p>
<p>Open up CEvent.h and add the following code:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="co2">#ifndef _CEVENT_H_</span><br />
&nbsp; &nbsp; <span class="co2">#define _CEVENT_H_</span></p>
<p><span class="co2">#include &lt;SDL.h&gt;</span></p>
<p><span class="kw2">class</span> CEvent <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">public</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; CEvent<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">virtual</span> ~CEvent<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">virtual</span> <span class="kw4">void</span> OnEvent<span class="br0">&#40;</span>SDL_Event* Event<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">virtual</span> <span class="kw4">void</span> OnInputFocus<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">virtual</span> <span class="kw4">void</span> OnInputBlur<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">virtual</span> <span class="kw4">void</span> OnKeyDown<span class="br0">&#40;</span>SDLKey sym, SDLMod mod, Uint16 unicode<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">virtual</span> <span class="kw4">void</span> OnKeyUp<span class="br0">&#40;</span>SDLKey sym, SDLMod mod, Uint16 unicode<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">virtual</span> <span class="kw4">void</span> OnMouseFocus<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">virtual</span> <span class="kw4">void</span> OnMouseBlur<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">virtual</span> <span class="kw4">void</span> OnMouseMove<span class="br0">&#40;</span><span class="kw4">int</span> mX, <span class="kw4">int</span> mY, <span class="kw4">int</span> relX, <span class="kw4">int</span> relY, <span class="kw4">bool</span> Left,<span class="kw4">bool</span> Right,<span class="kw4">bool</span> Middle<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">virtual</span> <span class="kw4">void</span> OnMouseWheel<span class="br0">&#40;</span><span class="kw4">bool</span> Up, <span class="kw4">bool</span> Down<span class="br0">&#41;</span>;&nbsp; <span class="co1">//Not implemented</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">virtual</span> <span class="kw4">void</span> OnLButtonDown<span class="br0">&#40;</span><span class="kw4">int</span> mX, <span class="kw4">int</span> mY<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">virtual</span> <span class="kw4">void</span> OnLButtonUp<span class="br0">&#40;</span><span class="kw4">int</span> mX, <span class="kw4">int</span> mY<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">virtual</span> <span class="kw4">void</span> OnRButtonDown<span class="br0">&#40;</span><span class="kw4">int</span> mX, <span class="kw4">int</span> mY<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">virtual</span> <span class="kw4">void</span> OnRButtonUp<span class="br0">&#40;</span><span class="kw4">int</span> mX, <span class="kw4">int</span> mY<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">virtual</span> <span class="kw4">void</span> OnMButtonDown<span class="br0">&#40;</span><span class="kw4">int</span> mX, <span class="kw4">int</span> mY<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">virtual</span> <span class="kw4">void</span> OnMButtonUp<span class="br0">&#40;</span><span class="kw4">int</span> mX, <span class="kw4">int</span> mY<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">virtual</span> <span class="kw4">void</span> OnJoyAxis<span class="br0">&#40;</span>Uint8 which, Uint8 axis, Sint16 value<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">virtual</span> <span class="kw4">void</span> OnJoyButtonDown<span class="br0">&#40;</span>Uint8 which, Uint8 button<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">virtual</span> <span class="kw4">void</span> OnJoyButtonUp<span class="br0">&#40;</span>Uint8 which, Uint8 button<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">virtual</span> <span class="kw4">void</span> OnJoyHat<span class="br0">&#40;</span>Uint8 which, Uint8 hat, Uint8 value<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">virtual</span> <span class="kw4">void</span> OnJoyBall<span class="br0">&#40;</span>Uint8 which, Uint8 ball, Sint16 xrel, Sint16 yrel<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">virtual</span> <span class="kw4">void</span> OnMinimize<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">virtual</span> <span class="kw4">void</span> OnRestore<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">virtual</span> <span class="kw4">void</span> OnResize<span class="br0">&#40;</span><span class="kw4">int</span> w,<span class="kw4">int</span> h<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">virtual</span> <span class="kw4">void</span> OnExpose<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">virtual</span> <span class="kw4">void</span> OnExit<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">virtual</span> <span class="kw4">void</span> OnUser<span class="br0">&#40;</span>Uint8 type, <span class="kw4">int</span> code, <span class="kw4">void</span>* data1, <span class="kw4">void</span>* data2<span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span>;</p>
<p><span class="co2">#endif</span></div>
<p>Pretty hefty class right? Alright, open up CEvent.cpp, and add the following code:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="co2">#include &quot;CEvent.h&quot;</span></p>
<p>CEvent::<span class="me2">CEvent</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="br0">&#125;</span></p>
<p>CEvent::~CEvent<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">//Do nothing</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">void</span> CEvent::<span class="me2">OnEvent</span><span class="br0">&#40;</span>SDL_Event* Event<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">switch</span><span class="br0">&#40;</span>Event-&gt;type<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> SDL_ACTIVEEVENT: <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">switch</span><span class="br0">&#40;</span>Event-&gt;active.<span class="me1">state</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> SDL_APPMOUSEFOCUS: <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> Event-&gt;active.<span class="me1">gain</span> <span class="br0">&#41;</span>&nbsp; &nbsp;OnMouseFocus<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OnMouseBlur<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> SDL_APPINPUTFOCUS: <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> Event-&gt;active.<span class="me1">gain</span> <span class="br0">&#41;</span>&nbsp; &nbsp;OnInputFocus<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OnInputBlur<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> SDL_APPACTIVE:&nbsp;<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> Event-&gt;active.<span class="me1">gain</span> <span class="br0">&#41;</span>&nbsp; &nbsp;OnRestore<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OnMinimize<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> SDL_KEYDOWN: <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OnKeyDown<span class="br0">&#40;</span>Event-&gt;key.<span class="me1">keysym</span>.<span class="me1">sym</span>,Event-&gt;key.<span class="me1">keysym</span>.<span class="me1">mod</span>,Event-&gt;key.<span class="me1">keysym</span>.<span class="me1">unicode</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> SDL_KEYUP: <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OnKeyUp<span class="br0">&#40;</span>Event-&gt;key.<span class="me1">keysym</span>.<span class="me1">sym</span>,Event-&gt;key.<span class="me1">keysym</span>.<span class="me1">mod</span>,Event-&gt;key.<span class="me1">keysym</span>.<span class="me1">unicode</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> SDL_MOUSEMOTION: <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OnMouseMove<span class="br0">&#40;</span>Event-&gt;motion.<span class="me1">x</span>,Event-&gt;motion.<span class="me1">y</span>,Event-&gt;motion.<span class="me1">xrel</span>,Event-&gt;motion.<span class="me1">yrel</span>,<span class="br0">&#40;</span>Event-&gt;motion.<span class="me1">state</span>&amp;SDL_BUTTON<span class="br0">&#40;</span>SDL_BUTTON_LEFT<span class="br0">&#41;</span><span class="br0">&#41;</span>!=<span class="nu0">0</span>,<span class="br0">&#40;</span>Event-&gt;motion.<span class="me1">state</span>&amp;SDL_BUTTON<span class="br0">&#40;</span>SDL_BUTTON_RIGHT<span class="br0">&#41;</span><span class="br0">&#41;</span>!=<span class="nu0">0</span>,<span class="br0">&#40;</span>Event-&gt;motion.<span class="me1">state</span>&amp;SDL_BUTTON<span class="br0">&#40;</span>SDL_BUTTON_MIDDLE<span class="br0">&#41;</span><span class="br0">&#41;</span>!=<span class="nu0">0</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> SDL_MOUSEBUTTONDOWN: <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">switch</span><span class="br0">&#40;</span>Event-&gt;button.<span class="me1">button</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> SDL_BUTTON_LEFT: <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OnLButtonDown<span class="br0">&#40;</span>Event-&gt;button.<span class="me1">x</span>,Event-&gt;button.<span class="me1">y</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> SDL_BUTTON_RIGHT: <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OnRButtonDown<span class="br0">&#40;</span>Event-&gt;button.<span class="me1">x</span>,Event-&gt;button.<span class="me1">y</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> SDL_BUTTON_MIDDLE: <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OnMButtonDown<span class="br0">&#40;</span>Event-&gt;button.<span class="me1">x</span>,Event-&gt;button.<span class="me1">y</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> SDL_MOUSEBUTTONUP:&nbsp;<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">switch</span><span class="br0">&#40;</span>Event-&gt;button.<span class="me1">button</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> SDL_BUTTON_LEFT: <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OnLButtonUp<span class="br0">&#40;</span>Event-&gt;button.<span class="me1">x</span>,Event-&gt;button.<span class="me1">y</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> SDL_BUTTON_RIGHT: <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OnRButtonUp<span class="br0">&#40;</span>Event-&gt;button.<span class="me1">x</span>,Event-&gt;button.<span class="me1">y</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> SDL_BUTTON_MIDDLE: <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OnMButtonUp<span class="br0">&#40;</span>Event-&gt;button.<span class="me1">x</span>,Event-&gt;button.<span class="me1">y</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> SDL_JOYAXISMOTION: <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OnJoyAxis<span class="br0">&#40;</span>Event-&gt;jaxis.<span class="me1">which</span>,Event-&gt;jaxis.<span class="me1">axis</span>,Event-&gt;jaxis.<span class="me1">value</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> SDL_JOYBALLMOTION: <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OnJoyBall<span class="br0">&#40;</span>Event-&gt;jball.<span class="me1">which</span>,Event-&gt;jball.<span class="me1">ball</span>,Event-&gt;jball.<span class="me1">xrel</span>,Event-&gt;jball.<span class="me1">yrel</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> SDL_JOYHATMOTION: <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OnJoyHat<span class="br0">&#40;</span>Event-&gt;jhat.<span class="me1">which</span>,Event-&gt;jhat.<span class="me1">hat</span>,Event-&gt;jhat.<span class="me1">value</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> SDL_JOYBUTTONDOWN: <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OnJoyButtonDown<span class="br0">&#40;</span>Event-&gt;jbutton.<span class="me1">which</span>,Event-&gt;jbutton.<span class="me1">button</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> SDL_JOYBUTTONUP: <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OnJoyButtonUp<span class="br0">&#40;</span>Event-&gt;jbutton.<span class="me1">which</span>,Event-&gt;jbutton.<span class="me1">button</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> SDL_QUIT: <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OnExit<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> SDL_SYSWMEVENT: <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//Ignore</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> SDL_VIDEORESIZE: <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OnResize<span class="br0">&#40;</span>Event-&gt;resize.<span class="me1">w</span>,Event-&gt;resize.<span class="me1">h</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> SDL_VIDEOEXPOSE: <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OnExpose<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">default</span>: <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OnUser<span class="br0">&#40;</span>Event-&gt;user.<span class="me1">type</span>,Event-&gt;user.<span class="me1">code</span>,Event-&gt;user.<span class="me1">data1</span>,Event-&gt;user.<span class="me1">data2</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">void</span> CEvent::<span class="me2">OnInputFocus</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">//Pure virtual, do nothing</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">void</span> CEvent::<span class="me2">OnInputBlur</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">//Pure virtual, do nothing</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">void</span> CEvent::<span class="me2">OnKeyDown</span><span class="br0">&#40;</span>SDLKey sym, SDLMod mod, Uint16 unicode<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">//Pure virtual, do nothing</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">void</span> CEvent::<span class="me2">OnKeyUp</span><span class="br0">&#40;</span>SDLKey sym, SDLMod mod, Uint16 unicode<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">//Pure virtual, do nothing</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">void</span> CEvent::<span class="me2">OnMouseFocus</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">//Pure virtual, do nothing</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">void</span> CEvent::<span class="me2">OnMouseBlur</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">//Pure virtual, do nothing</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">void</span> CEvent::<span class="me2">OnMouseMove</span><span class="br0">&#40;</span><span class="kw4">int</span> mX, <span class="kw4">int</span> mY, <span class="kw4">int</span> relX, <span class="kw4">int</span> relY, <span class="kw4">bool</span> Left,<span class="kw4">bool</span> Right,<span class="kw4">bool</span> Middle<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">//Pure virtual, do nothing</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">void</span> CEvent::<span class="me2">OnMouseWheel</span><span class="br0">&#40;</span><span class="kw4">bool</span> Up, <span class="kw4">bool</span> Down<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">//Pure virtual, do nothing</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">void</span> CEvent::<span class="me2">OnLButtonDown</span><span class="br0">&#40;</span><span class="kw4">int</span> mX, <span class="kw4">int</span> mY<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">//Pure virtual, do nothing</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">void</span> CEvent::<span class="me2">OnLButtonUp</span><span class="br0">&#40;</span><span class="kw4">int</span> mX, <span class="kw4">int</span> mY<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">//Pure virtual, do nothing</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">void</span> CEvent::<span class="me2">OnRButtonDown</span><span class="br0">&#40;</span><span class="kw4">int</span> mX, <span class="kw4">int</span> mY<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">//Pure virtual, do nothing</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">void</span> CEvent::<span class="me2">OnRButtonUp</span><span class="br0">&#40;</span><span class="kw4">int</span> mX, <span class="kw4">int</span> mY<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">//Pure virtual, do nothing</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">void</span> CEvent::<span class="me2">OnMButtonDown</span><span class="br0">&#40;</span><span class="kw4">int</span> mX, <span class="kw4">int</span> mY<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">//Pure virtual, do nothing</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">void</span> CEvent::<span class="me2">OnMButtonUp</span><span class="br0">&#40;</span><span class="kw4">int</span> mX, <span class="kw4">int</span> mY<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">//Pure virtual, do nothing</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">void</span> CEvent::<span class="me2">OnJoyAxis</span><span class="br0">&#40;</span>Uint8 which,Uint8 axis,Sint16 value<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">//Pure virtual, do nothing</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">void</span> CEvent::<span class="me2">OnJoyButtonDown</span><span class="br0">&#40;</span>Uint8 which,Uint8 button<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">//Pure virtual, do nothing</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">void</span> CEvent::<span class="me2">OnJoyButtonUp</span><span class="br0">&#40;</span>Uint8 which,Uint8 button<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">//Pure virtual, do nothing</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">void</span> CEvent::<span class="me2">OnJoyHat</span><span class="br0">&#40;</span>Uint8 which,Uint8 hat,Uint8 value<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">//Pure virtual, do nothing</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">void</span> CEvent::<span class="me2">OnJoyBall</span><span class="br0">&#40;</span>Uint8 which,Uint8 ball,Sint16 xrel,Sint16 yrel<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">//Pure virtual, do nothing</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">void</span> CEvent::<span class="me2">OnMinimize</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">//Pure virtual, do nothing</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">void</span> CEvent::<span class="me2">OnRestore</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">//Pure virtual, do nothing</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">void</span> CEvent::<span class="me2">OnResize</span><span class="br0">&#40;</span><span class="kw4">int</span> w,<span class="kw4">int</span> h<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">//Pure virtual, do nothing</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">void</span> CEvent::<span class="me2">OnExpose</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">//Pure virtual, do nothing</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">void</span> CEvent::<span class="me2">OnExit</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">//Pure virtual, do nothing</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">void</span> CEvent::<span class="me2">OnUser</span><span class="br0">&#40;</span>Uint8 type, <span class="kw4">int</span> code, <span class="kw4">void</span>* data1, <span class="kw4">void</span>* data2<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">//Pure virtual, do nothing</span><br />
<span class="br0">&#125;</span><br />
&nbsp;</div>
<p>Lots of code, but all the <b>SDL events</b> should be covered. What we basically are doing is taking an <b>SDL_Event</b> pointer, and switching through the types, and then calling the appropriate function. It just looks like a lot since they are quite a bit of events.</p>
<p>Now that this has been all setup, let&#8217;s jump over to CApp.h and link the two together:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="co2">#ifndef _CAPP_H_</span><br />
&nbsp; &nbsp; <span class="co2">#define _CAPP_H_</span></p>
<p><span class="co2">#include &lt;SDL.h&gt;</span></p>
<p><span class="co2">#include &quot;CEvent.h&quot;</span><br />
<span class="co2">#include &quot;CSurface.h&quot;</span></p>
<p><span class="kw2">class</span> CApp : <span class="kw2">public</span> CEvent <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">private</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">bool</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Running;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; SDL_Surface* &nbsp; &nbsp;Surf_Display;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; SDL_Surface* &nbsp; &nbsp;Surf_Test;</p>
<p>&nbsp; &nbsp; <span class="kw2">public</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; CApp<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> OnExecute<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; <span class="kw2">public</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">bool</span> OnInit<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> OnEvent<span class="br0">&#40;</span>SDL_Event* Event<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> OnLoop<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> OnRender<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> OnCleanup<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span>;</p>
<p><span class="co2">#endif</span><br />
&nbsp;</div>
<p>Everything should compile just fine. We have the event class setup, now lets actually link events to our new class structure. Open up CApp_OnEvent.cpp and edit the following function:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="co2">#include &quot;CApp.h&quot;</span></p>
<p><span class="kw4">void</span> CApp::<span class="me2">OnEvent</span><span class="br0">&#40;</span>SDL_Event* Event<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; CEvent::<span class="me2">OnEvent</span><span class="br0">&#40;</span>Event<span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span><br />
&nbsp;</div>
<p>We&#8217;re passing the Event structure to our class now, it will take care of the correct function calls. Now when we want to check for an event, we override the function. Since we got rid of checking for the <b>SDL_QUIT</b> event, lets use the function instead. Open up CApp.h again, and add the following function:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="co2">#ifndef _CAPP_H_</span><br />
&nbsp; &nbsp; <span class="co2">#define _CAPP_H_</span></p>
<p><span class="co2">#include &lt;SDL.h&gt;</span></p>
<p><span class="co2">#include &quot;CEvent.h&quot;</span><br />
<span class="co2">#include &quot;CSurface.h&quot;</span></p>
<p><span class="kw2">class</span> CApp : <span class="kw2">public</span> CEvent <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">private</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">bool</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Running;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; SDL_Surface* &nbsp; &nbsp;Surf_Display;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; SDL_Surface* &nbsp; &nbsp;Surf_Test;</p>
<p>&nbsp; &nbsp; <span class="kw2">public</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; CApp<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> OnExecute<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; <span class="kw2">public</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">bool</span> OnInit<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> OnEvent<span class="br0">&#40;</span>SDL_Event* Event<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> OnExit<span class="br0">&#40;</span><span class="br0">&#41;</span>; </p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> OnLoop<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> OnRender<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> OnCleanup<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span>;</p>
<p><span class="co2">#endif</span><br />
&nbsp;</div>
<p>The OnExit function handles the <b>SDL_QUIT</b> events. Now that we have the prototype, lets define what it does. Open up CApp_OnEvent.cpp, and add the following:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="co2">#include &quot;CApp.h&quot;</span></p>
<p><span class="kw4">void</span> CApp::<span class="me2">OnEvent</span><span class="br0">&#40;</span>SDL_Event* Event<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; CEvent::<span class="me2">OnEvent</span><span class="br0">&#40;</span>Event<span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">void</span> CApp::<span class="me2">OnExit</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; Running = <span class="kw2">false</span>;<br />
<span class="br0">&#125;</span><br />
&nbsp;</div>
<p>Recompile, and try it out. You should be able to close the application just like before.</p>
<p>I encourage you to look through some of the various events that we can check. Later on we&#8217;ll use some of these events in our games, but for now try to familiarize yourself with them.</p>
<p>Jump on over to the next tutorial to take a look at creating our first game, Tic-Tac-Toe.</p>
<p><b>SDL Events &#8211; Tutorial Files:</b><br />
<b>Win32:</b> <a href="../tutorials/sdl-events.zip">Zip</a>, <a href="../tutorials/sdl-events.rar">Rar</a><br />
<b>Linux:</b> <a href="../tutorials/sdl-events.tar.gz">Tar</a> (Thanks Gaten)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sdltutorials.com/sdl-events/feed/</wfw:commentRss>
		<slash:comments>48</slash:comments>
		</item>
		<item>
		<title>SDL Tutorial Basics</title>
		<link>http://www.sdltutorials.com/sdl-tutorial-basics/</link>
		<comments>http://www.sdltutorials.com/sdl-tutorial-basics/#comments</comments>
		<pubDate>Wed, 17 Oct 2007 15:27:47 +0000</pubDate>
		<dc:creator>Tim Jones</dc:creator>
				<category><![CDATA[SDL Tutorials]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[sdl tutorial]]></category>

		<guid isPermaLink="false">http://devhub.lostfish.org/3/</guid>
		<description><![CDATA[These tutorials are meant to teach someone with some experience using C++, or perhaps another programming language. If you have a hard time following certain ideas related to the code itself and not conceptual ideas (those relating to games), then I urge you to first read our tutorials that explain the C++ programming language. It&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>These tutorials are meant to teach someone with some experience using C++, or perhaps another programming language. If you have a hard time following certain ideas related to the code itself and not conceptual ideas (those relating to games), then I urge you to first read our tutorials that explain the <a href="http://www.sdltutorials.com/sdl-tutorial-basics/">C++ programming language</a>. It&#8217;s not vital to understand everything about C++, but every little bit will help later on.</p>
<p>In these tutorials we will be referncing to CodeBlocks as our IDE of choice, with gcc and mingw for compilation. If you wish to use another IDE and compiler that is up to you, but it may be harder to follow along if you have limited experience with linking libraries. If you wish to download CodeBlocks, you can do so for free at http://www.codeblocks.org (download the one including the mingw package). We recommend you use the stable version, unless you want to spend the extra time and use the nightly builds.</p>
<p><span id="more-3"></span>These tutorials will be heavily centered around <a href="http://www.sdltutorials.com/sdl-tutorial-basics/">SDL </a>(<a href="http://www.sdltutorials.com/sdl-tutorial-basics/">Simple DirectMedia Layer</a>), a 2D cross-platform graphics library. This library is going to allow us to draw fancy graphics to the screen, and do all sorts of fun stuff that allows us to make a game. You&#8217;re going to need to download this library at http://www.libsdl.org; be sure to download the Mingw32 tar file under &#8220;Development Libraries&#8221; and &#8220;Win32&#8243; and the zip file under &#8220;Runtime Libraries&#8221; and &#8220;Win32.&#8221; If you are using Visual Studio download the appropriate version instead of the Mingw32 file. Once downloaded, we recommend you put the .dll found in the zip in your system32 folder. This way whenever we open an <strong>SDL </strong>application it can find the dll file it needs.</p>
<p>Open the tar file now (the one that was listed under &#8220;Development Libraries&#8221;) and decompress the contents to a folder (such as C:\SDL). Now, open up CodeBlocks so we can change some settings. Click &#8220;Settings&#8221; on the menu bar, and then click &#8220;Search Directories&#8221; tab. You&#8217;ll need to add C:\SDL\include to the &#8220;Compiler&#8221; tab, and C:\SDL\lib to the &#8220;Linker&#8221; tab (change C:\SDL to wherever you decompressed the files to). Once done, click Okay.</p>
<p>Start a new &#8220;blank&#8221; project, calling it whatever you want. Save it some place. Click on &#8220;Project&#8221; on the menu bar, and then click on &#8220;Properties.&#8221; A dialog will open; click on the &#8220;Project&#8217;s build options&#8230;&#8221; button on the bottom right. Click on the &#8220;Linker Settings&#8221; tab and add the following to the list under &#8220;Link libraries&#8221;:</p>
<p><strong>mingw32<br />
SDLmain<br />
SDL</strong></p>
<p>The order is important, so use the arrows to rearrange the list until it matches what is shown above. If you are having a little trouble figuring out what we are doing, we&#8217;re simply &#8220;linking&#8221; code together, or, in other words, we&#8217;re taking the <a href="http://www.sdltutorials.com/sdl-tutorial-basics/"><strong>SDL</strong> </a>code and combining it with our own. We do this by using the include files to compile, and the lib files to link. And once done, our code is put together to make one application.</p>
<p>Click Ok twice, and you should be all set to go!</p>
<p>Let&#8217;s create two new files called CApp.h, and CApp.cpp; these will serve as the core for our program. First, open CApp.h and add the following code, in here is where our tutorial will really begin:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="co2">#ifndef _CAPP_H_</span><br />
&nbsp; &nbsp; <span class="co2">#define _CAPP_H_</span></p>
<p><span class="co2">#include &lt;SDL.h&gt;</span></p>
<p><span class="kw2">class</span> CApp <span class="br0">&#123;</span></p>
<p>&nbsp; &nbsp; <span class="kw2">public</span>:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; CApp<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> OnExecute<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p><span class="br0">&#125;</span>;</p>
<p><span class="co2">#endif</span></div>
<p>Now, open up CApp.cpp and add the following code:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="co2">#include &quot;CApp.h&quot;</span></p>
<p>CApp::<span class="me2">CApp</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">int</span> CApp::<span class="me2">OnExecute</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span>;<br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="kw4">int</span> argc, <span class="kw4">char</span>* argv<span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; CApp theApp;</p>
<p>&nbsp; &nbsp; <span class="kw1">return</span> theApp.<span class="me1">OnExecute</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></div>
<p>The CApp class is setting the stage for our entire program. Let me step aside to take special note of how games are typically setup. Most games consist of 5 functions that handle how the game processes. These processes are typically:</p>
<p>Initialize<br />
This function handles all the loading of data, whether it be textures, maps, NPCs, or whatever.</p>
<p>Event<br />
This function handles all input events from the mouse, keyboard, joysticks, or other devices.</p>
<p>Loop<br />
This function handles all the data updates, such as a NPCs moving across the screen, decreasing your health bar, or whatever</p>
<p>Render<br />
This function handles all the rendering of anything that shows up on the screen. It does NOT handle data manipulation, as this is what the Loop function is supposed to handle.</p>
<p>Cleanup<br />
This function simply cleans up any resources loaded, and insures a peaceful quitting of the game.</p>
<p>It&#8217;s important to understand that games are one gigantic loop. Within this loop we find events, update data, and render pictures. Thus, the basic structure could be thought of as:</p>
<div class="dean_ch" style="white-space: wrap;">
Initialize<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p><span class="kw1">while</span><span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; Events<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; Loop<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; Render<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></p>
<p>Cleanup<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
<p>Each iteration of the loop we do something with data, and render accordingly. Events are extra, as a means for the user to manipulate data as well. In that sense, Events aren&#8217;t required to make a game, but are needed when you want the user to be able to manipulate data (such as move a NPC to the left).</p>
<p>Let&#8217;s clarify this idea with an example. Say we have our Knight, the hero of the game. All we want to do is simply have him move around. If I press left, he goes left. We need to figure out how to do this within a loop. Firstly, we know we want to check for events (keyboard events). Since Events are a means to manipulate data, we also know we&#8217;ll need some sort of variables to modify. Then we can use these variables to render our Knight appropriatly on the screen. We could have:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw1">if</span><span class="br0">&#40;</span>Key == LEFT<span class="br0">&#41;</span> X&#8211;;<br />
<span class="kw1">if</span><span class="br0">&#40;</span>Key == RIGHT<span class="br0">&#41;</span> X++;<br />
<span class="kw1">if</span><span class="br0">&#40;</span>Key == UP<span class="br0">&#41;</span> Y&#8211;;<br />
<span class="kw1">if</span><span class="br0">&#40;</span>Key == DOWN<span class="br0">&#41;</span> Y++;<span class="co1">//&#8230; somewhere else in our code &#8230;</span></p>
<p>RenderImage<span class="br0">&#40;</span>KnightImage, X, Y<span class="br0">&#41;</span>;</div>
<p>This works because each loop it checks if the key is LEFT, RIGHT, etc., and if so, we decrease or increase a variable. So, if our game is running at 30 frames per second and we press LEFT, then our guy would move to the left 30 pixels per second. If you don&#8217;t understand the game loop, you soon will. Games need them to function correctly.</p>
<p>Going back to our conceptual code (the 5 functions), we can add these additional pages to our project:</p>
<p>CApp_OnInit.cpp<br />
CApp_OnEvent.cpp<br />
CApp_OnLoop.cpp<br />
CApp_OnRender.cpp<br />
CApp_OnCleanup.cpp</p>
<p>Go back to CApp.h, and add the following functions and variables:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="co2">#ifndef _CAPP_H_</span><br />
&nbsp; &nbsp; <span class="co2">#define _CAPP_H_</span></p>
<p><span class="co2">#include &lt;SDL.h&gt;</span></p>
<p><span class="kw2">class</span> CApp <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">private</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">bool</span> &nbsp; &nbsp;Running;</p>
<p>&nbsp; &nbsp; <span class="kw2">public</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; CApp<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> OnExecute<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; <span class="kw2">public</span>:</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">bool</span> OnInit<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> OnEvent<span class="br0">&#40;</span>SDL_Event* Event<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> OnLoop<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> OnRender<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> OnCleanup<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span>;</p>
<p><span class="co2">#endif</span></div>
<p>Go through each of the 5 files we just created and create the function themselves:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="co2">#include &quot;CApp.h&quot;</span></p>
<p><span class="kw4">bool</span> CApp::<span class="me2">OnInit</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">true</span>;<br />
<span class="br0">&#125;</span></div>
<div class="dean_ch" style="white-space: wrap;">
<span class="co2">#include &quot;CApp.h&quot;</span></p>
<p><span class="kw4">void</span> CApp::<span class="me2">OnEvent</span><span class="br0">&#40;</span>SDL_Event* Event<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="br0">&#125;</span></div>
<div class="dean_ch" style="white-space: wrap;">
<span class="co2">#include &quot;CApp.h&quot;</span></p>
<p><span class="kw4">void</span> CApp::<span class="me2">OnLoop</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="br0">&#125;</span></div>
<div class="dean_ch" style="white-space: wrap;">
<span class="co2">#include &quot;CApp.h&quot;</span></p>
<p><span class="kw4">void</span> CApp::<span class="me2">OnRender</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="br0">&#125;</span></div>
<div class="dean_ch" style="white-space: wrap;">
<span class="co2">#include &quot;CApp.h&quot;</span></p>
<p><span class="kw4">void</span> CApp::<span class="me2">OnCleanup</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="br0">&#125;</span></div>
<p>Now lets go back to our CApp.cpp code to link all of these functions together:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="co2">#include &quot;CApp.h&quot;</span></p>
<p>CApp::<span class="me2">CApp</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; Running = <span class="kw2">true</span>;<br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">int</span> CApp::<span class="me2">OnExecute</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>OnInit<span class="br0">&#40;</span><span class="br0">&#41;</span> == <span class="kw2">false</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">-1</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; SDL_Event Event;</p>
<p>&nbsp; &nbsp; <span class="kw1">while</span><span class="br0">&#40;</span>Running<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span><span class="br0">&#40;</span>SDL_PollEvent<span class="br0">&#40;</span>&amp;Event<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OnEvent<span class="br0">&#40;</span>&amp;Event<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; OnLoop<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; OnRender<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; OnCleanup<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span>;<br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="kw4">int</span> argc, <span class="kw4">char</span>* argv<span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; CApp theApp;</p>
<p>&nbsp; &nbsp; <span class="kw1">return</span> theApp.<span class="me1">OnExecute</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></div>
<p>You&#8217;ll notice some new variables, but let&#8217;s look at what is happening first. First, we try to Initialize our game, if it fails we return -1 (an <a href="http://www.filamentgrp.com">error code</a>), thus closing our program. If everything is good, we continue on to the game loop. Within the game loop we use <strong>SDL_PollEvent</strong> to check for events, and pass them one at a time to OnEvent. Once done with Events, we go to OnLoop for move data around and what not, and then render our game. We repeat this indefinitly. If the user exits the game, we proceed to OnCleanup cleaning up any resources. Simple enough.</p>
<p>Now, lets look at <strong>SDL_Event </strong>and <strong>SDL_PollEvent</strong>. The first is a structure that holds information about events. The second is a function that will grab any events waiting in the queue. This queue can have any number of events, which is the reason why we have to loop through them. So, for example, lets say the user presses A and moves the mouse during the OnRender() function. <strong>SDL </strong>will detect this and put two events in the queue, one for a key press and one for a mouse move. We can grab this event from the queue by using the <strong>SDL_PollEvent</strong>, and then passing it to OnEvent to handle it accordingly. Once there are no more events in the queue, <strong>SDL_PollEvent</strong> will return false, thus exiting out of the Event queue loop.</p>
<p>The other variable added, Running, is our own. This is our exit out of the game loop. When this is set to false, it will end the program, and in turn exit the program. So, for example, if the user presses the Escape key we can set this variable to false, quitting the game.</p>
<p>You should be able to compile everything so far just fine, but you may notice you can&#8217;t exit out. You&#8217;ll probably have to use the task manager to end the program.</p>
<p>Now that everything is setup, let&#8217;s start by creating the window our game will be drawn in. Jump over to CApp.h and add a <strong>SDL </strong>surface variable to the code:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="co2">#ifndef _CAPP_H_</span><br />
&nbsp; &nbsp; <span class="co2">#define _CAPP_H_</span></p>
<p><span class="co2">#include &lt;SDL.h&gt;</span></p>
<p><span class="kw2">class</span> CApp <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">private</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">bool</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Running;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; SDL_Surface* &nbsp; &nbsp;Surf_Display;</p>
<p>&nbsp; &nbsp; <span class="kw2">public</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; CApp<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> OnExecute<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; <span class="kw2">public</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">bool</span> OnInit<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> OnEvent<span class="br0">&#40;</span>SDL_Event* Event<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> OnLoop<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> OnRender<span class="br0">&#40;</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">void</span> OnCleanup<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span>;</p>
<p><span class="co2">#endif</span></div>
<p>I suppose now would be a good time to explain exactly what a <strong>SDL </strong>Surface is. An <strong>SDL </strong>Surface is anything that can be drawn, or drawn to. Say we have a blank piece of paper, a pencil, and some stickers; this paper could be called our display &#8220;surface.&#8221; We can draw to it, put stickers on it, or whatever. The stickers we have are also surfaces; we can draw on them and put other stickers on them as well. So, Surf_Display is simply our &#8220;piece of blank paper&#8221; that we will draw all our stuff on.</p>
<p>Now, lets jump on over to CApp_OnInit to actually create this surface:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="co2">#include &quot;CApp.h&quot;</span></p>
<p><span class="kw4">bool</span> CApp::<span class="me2">OnInit</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>SDL_Init<span class="br0">&#40;</span>SDL_INIT_EVERYTHING<span class="br0">&#41;</span> &lt; <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="br0">&#40;</span>Surf_Display = SDL_SetVideoMode<span class="br0">&#40;</span><span class="nu0">640</span>, <span class="nu0">480</span>, <span class="nu0">32</span>, SDL_HWSURFACE | SDL_DOUBLEBUF<span class="br0">&#41;</span><span class="br0">&#41;</span> == <span class="kw2">NULL</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">true</span>;<br />
<span class="br0">&#125;</span></div>
<p>The first thing we need to do is start up SDL itself, so we can access its functions. We are telling <strong>SDL </strong>to Initialize everything it has; there are other parameters you can pass, but understanding them at this point is not important. The next function we use is <strong>SDL_SetVideoMode</strong>. This bad boy is what creates our window, and our surface. It takes 4 parameters: The width of the window, the height of the window, the bit resolution of the window (recommended to be 16 or 32), and then display flags. There are quite a few display flags, but the ones shown above are fine for now. The first flag tells <strong>SDL </strong>to use hardware memory for storing our images and such, and the second flag tells <strong>SDL </strong>to use double buffering (which is important if you don&#8217;t want flickering on your screen). Another flag that may interest you now is <strong>SDL_FULLSCREEN</strong>, which makes the window go fullscreen.</p>
<p>Now that our display is setup, lets cleanup a little bit to make sure everything works smoothly. Open up CApp_OnCleanup.cpp and add the following:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="co2">#include &quot;CApp.h&quot;</span></p>
<p><span class="kw4">void</span> CApp::<span class="me2">OnCleanup</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; SDL_FreeSurface<span class="br0">&#40;</span>Surf_Display<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; SDL_Quit<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></div>
<p>The first thing we do is free the display surface, basically freeing any memory. Once that is done, we quit out of <strong><a href="http://www.sdltutorials.com/sdl-tutorial-basics/">SDL</a></strong>. You should take note that in this function is where you would free other surfaces as well (probably before the Surf_Display). This keeps all your code centralized to the function its performing.</p>
<p>To keep things tidy, lets also set the Surf_Display pointer to NULL on the class constructor. Open up CApp.cpp and add the following:</p>
<div class="dean_ch" style="white-space: wrap;">
CApp::<span class="me2">CApp</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; Surf_Display = <span class="kw2">NULL</span>;</p>
<p>&nbsp; &nbsp; Running = <span class="kw2">true</span>;<br />
<span class="br0">&#125;</span></div>
<p>Try compiling your code, and watching it work. You should have a nice blank window popup. You&#8217;ll notice you can&#8217;t close it though, so you&#8217;ll need to use the task manager to do so.</p>
<p>Now that we have a window all setup, we&#8217;re going to need a way to close it. Open up the CApp_OnEvent.cpp file, add the following:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="co2">#include &quot;CApp.h&quot;</span></p>
<p><span class="kw4">void</span> CApp::<span class="me2">OnEvent</span><span class="br0">&#40;</span>SDL_Event* Event<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>Event-&gt;type == SDL_QUIT<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; Running = <span class="kw2">false</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
<p>The SDL event structure is broken down into types. These types can range from keypresses, to mouse movements; what we simply are doing here is checking the event type. The type above we are looking for is the request to close the window (i.e., when the user clicks the X button). If that event happens to take place, we set Running to false, thus ending our program. Simple enough. We&#8217;ll look more into events in a later lesson.</p>
<p>Now, you should everything setup, and a good structure to work with later. It may be a good idea to take this project and turn it into an &#8220;SDL template&#8221; within CodeBlocks. I won&#8217;t go over how to do that, but feel free to Google it.</p>
<p>Once you have a good idea what&#8217;s going on with the code we covered in this lesson, jump over to the next <a href="http://www.sdltutorials.com/sdl-coordinates-and-blitting/">game tutorial</a> lesson to learn more about <strong>SDL </strong>surfaces.</p>
<p><b>SDL Tutorial Basics &#8211; Tutorial Files:</b><br />
<b>Win32:</b> <a href="../tutorials/sdl-tutorial-basics.zip">Zip</a>, <a href="../tutorials/sdl-tutorial-basics.rar">Rar</a><br />
<b>Linux:</b> <a href="../tutorials/sdl-tutorial-basics.tar.gz">Tar</a> (Thanks Gaten)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sdltutorials.com/sdl-tutorial-basics/feed/</wfw:commentRss>
		<slash:comments>127</slash:comments>
		</item>
	</channel>
</rss>
