<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Writing a game loop</title>
		<link>http://www.allegro.cc/forums/view/607799</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Fri, 08 Jul 2011 06:33:08 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m writing a skeleton for use in SpeedHack and I&#39;m wondering if what I have so far is a good way of doing it as it is really the first time I&#39;m using events instead of states. Basically the main loop looks like this right now:</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span>init<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  2</span>
<span class="number">  3</span><span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span>game_over<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  4</span>    timer_count <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_timer_count"><span class="a">al_get_timer_count</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  5</span>    <span class="k1">while</span> <span class="k2">(</span>timer_count <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  6</span>        mode_count<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number">  7</span>    <span class="c">// Cheap FPS calculator</span>
<span class="number">  8</span>        <span class="k1">if</span> <span class="k2">(</span>mode_count % <span class="n">30</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  9</span>            fps <span class="k3">=</span> frame_count <span class="k3">-</span> pframe_count<span class="k2">;</span>
<span class="number"> 10</span>            pframe_count <span class="k3">=</span> frame_count<span class="k2">;</span>
<span class="number"> 11</span>        <span class="k2">}</span>
<span class="number"> 12</span>    <span class="c">// Logic goes here</span>
<span class="number"> 13</span>        <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_is_event_queue_empty"><span class="a">al_is_event_queue_empty</span></a><span class="k2">(</span>key_events<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 14</span>            <a href="http://www.allegro.cc/manual/al_get_next_event"><span class="a">al_get_next_event</span></a><span class="k2">(</span>key_events, <span class="k3">&amp;</span>event<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span>            <span class="k1">if</span> <span class="k2">(</span>event.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_KEY_UP <span class="k3">&amp;</span><span class="k3">&amp;</span> event.keyboard.keycode <span class="k3">=</span><span class="k3">=</span> ALLEGRO_KEY_ESCAPE<span class="k2">)</span>
<span class="number"> 16</span>                game_over <span class="k3">=</span> TRUE<span class="k2">;</span>
<span class="number"> 17</span>            <span class="k1">if</span> <span class="k2">(</span>event.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_KEY_UP <span class="k3">&amp;</span><span class="k3">&amp;</span> event.keyboard.keycode <span class="k3">=</span><span class="k3">=</span> ALLEGRO_KEY_SPACE<span class="k2">)</span>
<span class="number"> 18</span>                <a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="n">2</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span>        <span class="k2">}</span>
<span class="number"> 20</span>        timer_count--<span class="k2">;</span>
<span class="number"> 21</span>        <a href="http://www.allegro.cc/manual/al_add_timer_count"><span class="a">al_add_timer_count</span></a><span class="k2">(</span>timer, <span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 22</span>    <span class="k2">}</span>
<span class="number"> 23</span><span class="c">// Drawing goes here</span>
<span class="number"> 24</span>    <a href="http://www.allegro.cc/manual/al_clear_to_color"><span class="a">al_clear_to_color</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">128</span>, <span class="n">128</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 25</span>    <a href="http://www.allegro.cc/manual/al_draw_textf"><span class="a">al_draw_textf</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a>, <a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">255</span>, <span class="n">255</span>, <span class="n">255</span><span class="k2">)</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="s">"%d total frames (%d FPS)"</span>, frame_count, fps<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 26</span>    <a href="http://www.allegro.cc/manual/al_flip_display"><span class="a">al_flip_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 27</span><span class="c">// If the timer event queue is empty, take a rest</span>
<span class="number"> 28</span>    <a href="http://www.allegro.cc/manual/al_wait_for_event"><span class="a">al_wait_for_event</span></a><span class="k2">(</span>timer_events, NULL<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 29</span>    <a href="http://www.allegro.cc/manual/al_flush_event_queue"><span class="a">al_flush_event_queue</span></a><span class="k2">(</span>timer_events<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 30</span>    
<span class="number"> 31</span>    frame_count<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 32</span><span class="k2">}</span>
</div></div><p>

The <span class="source-code">init<span class="k2">(</span><span class="k2">)</span></span> function does basic initialization tasks. It also sets a timer and creates two event queues, one for the keyboard and one for the timer. The thing is that I&#39;m using the timer event queue only to check when I can let the application take a rest and that might be consider as a waste but I couldn&#39;t figure a better solution.</p><p>So, does this look as a good game loop?. I&#39;m attaching the full code and all necessary files so that you can try it if you want. As you can see, in the logic part I added some simple checks; <i>Escape</i> quits the program and I added <i>Space</i> to simulate a logic step taking a long time to see how it works.<br />If you try it, let me know if the fps was steady and the CPU usage on your machine. Oh, and it should run at 30 fps as the value is hardcoded right now.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kenmasters1976)</author>
		<pubDate>Fri, 08 Jul 2011 05:23:55 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Except you shouldn&#39;t draw when the timer counter is 0 because you are just redrawing a world that hasn&#39;t changed.</p><p>ok sorry, i guess the wait for event thing takes care of that.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kazzmir)</author>
		<pubDate>Fri, 08 Jul 2011 05:36:19 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="source-code snippet"><div class="inner"><pre><a href="http://www.allegro.cc/manual/al_wait_for_event"><span class="a">al_wait_for_event</span></a><span class="k2">(</span>timer_events, NULL<span class="k2">)</span><span class="k2">;</span>
<a href="http://www.allegro.cc/manual/al_flush_event_queue"><span class="a">al_flush_event_queue</span></a><span class="k2">(</span>timer_events<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>Wait what? So first you wait for an event, then you ignore it? Is that <i>really</i> what you want to do?</p><p>The following from the <a href="http://wiki.allegro.cc/index.php?title=Allegro_5_Tutorial/Bitmaps#Basic_Example">wiki tutorial</a> might make more sense: (note that a timer is setup to send an event 60 times a second)
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span>   <span class="k1">while</span><span class="k2">(</span><span class="n">1</span><span class="k2">)</span>
<span class="number">  2</span>   <span class="k2">{</span>
<span class="number">  3</span>      <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> ev<span class="k2">;</span>
<span class="number">  4</span>      <a href="http://www.allegro.cc/manual/al_wait_for_event"><span class="a">al_wait_for_event</span></a><span class="k2">(</span>event_queue, <span class="k3">&amp;</span>ev<span class="k2">)</span><span class="k2">;</span>
<span class="number">  5</span> 
<span class="number">  6</span>      <span class="k1">if</span><span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ...<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  7</span>         ...
<span class="number">  8</span>      <span class="k2">}</span>
<span class="number">  9</span>      <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_DISPLAY_CLOSE<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 10</span>         <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 11</span>      <span class="k2">}</span>
<span class="number"> 12</span> 
<span class="number"> 13</span>      <span class="k1">if</span><span class="k2">(</span>redraw <span class="k3">&amp;</span><span class="k3">&amp;</span> <a href="http://www.allegro.cc/manual/al_is_event_queue_empty"><span class="a">al_is_event_queue_empty</span></a><span class="k2">(</span>event_queue<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 14</span>         redraw <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 15</span> 
<span class="number"> 16</span>         <a href="http://www.allegro.cc/manual/al_clear_to_color"><span class="a">al_clear_to_color</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">0</span>,<span class="n">0</span>,<span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 17</span> 
<span class="number"> 18</span>         <a href="http://www.allegro.cc/manual/al_draw_bitmap"><span class="a">al_draw_bitmap</span></a><span class="k2">(</span>bouncer, bouncer_x, bouncer_y, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span> 
<span class="number"> 20</span>         <a href="http://www.allegro.cc/manual/al_flip_display"><span class="a">al_flip_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 21</span>      <span class="k2">}</span>
<span class="number"> 22</span>   <span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Fri, 08 Jul 2011 05:52:01 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/607799/924033#target">Thomas Fjellstrom</a> said:</div><div class="quote"><p> Wait what? So first you wait for an event, then you ignore it? Is that really what you want to do?
</p></div></div><p>That part was exactly what I found to be a bit odd in my code. I wanted the loop to don&#39;t waste CPU unnecessarily. And since it is the first time I&#39;m actually using events I was lost.<br />Thanks for pointing out the wiki tutorial. I guess I should have looked there in the first place. I&#39;m going to check it and adapt the changes to my code.</p><p>Thanks again.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kenmasters1976)</author>
		<pubDate>Fri, 08 Jul 2011 06:33:08 +0000</pubDate>
	</item>
</rss>
