<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Implementing game loop</title>
		<link>http://www.allegro.cc/forums/view/607072</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Thu, 21 Apr 2011 16:45:12 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ve been reading <a href="http://www.koonsolo.com/news/dewitters-gameloop/">this</a>. It explains couple of game loop types. I&#39;m mostly interested in implementing the last one: &quot;Constant Game Speed independent of Variable FPS&quot;<br />I&#39;m having hard time to understand it. AFAIU it basically updates the game logic 25 times per second but it there is no limit on rendering. But it also implements an interpolation value for in-between times.</p><p>While implementing it I wanted to use allegro 5&#39;s timer functions so I came up with this:</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="c">//Start timer</span>
<span class="number">  2</span><span class="p">#include &lt;stdio.h&gt;</span>
<span class="number">  3</span><span class="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number">  4</span>
<span class="number">  5</span><span class="p">#define WIDTH 960</span>
<span class="number">  6</span><span class="p">#define HEIGHT 640</span>
<span class="number">  7</span><span class="p">#define LOGIC_FPS 5</span>
<span class="number">  8</span>
<span class="number">  9</span><span class="k1">int</span> main<span class="k2">(</span><span class="k1">int</span> argc, <span class="k1">char</span> <span class="k3">*</span><span class="k3">*</span>argv<span class="k2">)</span>
<span class="number"> 10</span><span class="k2">{</span>
<span class="number"> 11</span>    <a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a> <span class="k3">*</span>display<span class="k2">;</span>
<span class="number"> 12</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_QUEUE"><span class="a">ALLEGRO_EVENT_QUEUE</span></a> <span class="k3">*</span>eventQueue<span class="k2">;</span>
<span class="number"> 13</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_TIMER"><span class="a">ALLEGRO_TIMER</span></a> <span class="k3">*</span>timer<span class="k2">;</span>
<span class="number"> 14</span>  
<span class="number"> 15</span>  <span class="k1">bool</span> isGameRunning <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 16</span>  <span class="k1">bool</span> updateGameLogic <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 17</span>
<span class="number"> 18</span>  <span class="c">//Various inits</span>
<span class="number"> 19</span>    <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_init"><span class="a">al_init</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 20</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to initialize allegro\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 21</span>        <span class="k1">return</span> EXIT_FAILURE<span class="k2">;</span>
<span class="number"> 22</span>    <span class="k2">}</span>
<span class="number"> 23</span>
<span class="number"> 24</span>  timer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_timer"><span class="a">al_create_timer</span></a><span class="k2">(</span><span class="n">1</span>.<span class="n">0</span> <span class="k3">/</span> LOGIC_FPS<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 25</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>timer<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 26</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to create timer!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 27</span>    <span class="k1">return</span> EXIT_FAILURE<span class="k2">;</span>
<span class="number"> 28</span>  <span class="k2">}</span>
<span class="number"> 29</span>
<span class="number"> 30</span>    display <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_display"><span class="a">al_create_display</span></a><span class="k2">(</span>WIDTH, HEIGHT<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 31</span>    <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>display<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 32</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to create display!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 33</span>    <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 34</span>        <span class="k1">return</span> EXIT_FAILURE<span class="k2">;</span>
<span class="number"> 35</span>    <span class="k2">}</span>
<span class="number"> 36</span>
<span class="number"> 37</span>  eventQueue <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_event_queue"><span class="a">al_create_event_queue</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 38</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>eventQueue<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 39</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to create eventQueue!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 40</span>    <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 41</span>    <a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 42</span>    <span class="k1">return</span> EXIT_FAILURE<span class="k2">;</span>
<span class="number"> 43</span>  <span class="k2">}</span>
<span class="number"> 44</span>
<span class="number"> 45</span>  <span class="c">//Tie events to queue</span>
<span class="number"> 46</span>  <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>eventQueue, <a href="http://www.allegro.cc/manual/al_get_display_event_source"><span class="a">al_get_display_event_source</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 47</span>  <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>eventQueue, <a href="http://www.allegro.cc/manual/al_get_timer_event_source"><span class="a">al_get_timer_event_source</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 48</span>
<span class="number"> 49</span>  <span class="c">//Start timer</span>
<span class="number"> 50</span>  <a href="http://www.allegro.cc/manual/al_start_timer"><span class="a">al_start_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 51</span>
<span class="number"> 52</span>  <span class="c">//Main loop</span>
<span class="number"> 53</span>  <span class="k1">while</span><span class="k2">(</span>isGameRunning<span class="k2">)</span>
<span class="number"> 54</span>  <span class="k2">{</span>
<span class="number"> 55</span>    <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> e<span class="k2">;</span>
<span class="number"> 56</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>eventQueue, <span class="k3">&amp;</span>e<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 57</span>
<span class="number"> 58</span>    <span class="c">//Input</span>
<span class="number"> 59</span>    <span class="k1">if</span><span class="k2">(</span>e.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_TIMER<span class="k2">)</span>
<span class="number"> 60</span>      updateGameLogic <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 61</span>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>e.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_DISPLAY_CLOSE<span class="k2">)</span>
<span class="number"> 62</span>      isGameRunning <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 63</span>    
<span class="number"> 64</span>    <span class="c">//Update game logic</span>
<span class="number"> 65</span>    <span class="k1">if</span><span class="k2">(</span>updateGameLogic <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>eventQueue<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 66</span>      updateGameLogic <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 67</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stdout, <span class="s">"Logic updated\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 68</span>    <span class="k2">}</span>
<span class="number"> 69</span>
<span class="number"> 70</span>    <span class="c">//Update display</span>
<span class="number"> 71</span>    <span class="c">//Calculate interpolation here</span>
<span class="number"> 72</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">50</span>,<span class="n">123</span>,<span class="n">1</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 73</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"> 74</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stdout, <span class="s">"Display updated\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 75</span>  <span class="k2">}</span>
<span class="number"> 76</span>
<span class="number"> 77</span>  <span class="c">//Cleaning</span>
<span class="number"> 78</span>  <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 79</span>    <a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 80</span>  <a href="http://www.allegro.cc/manual/al_destroy_event_queue"><span class="a">al_destroy_event_queue</span></a><span class="k2">(</span>eventQueue<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 81</span>
<span class="number"> 82</span>    <span class="k1">return</span> EXIT_SUCCESS<span class="k2">;</span>
<span class="number"> 83</span><span class="k2">}</span>
</div></div><p>

But it doesn&#39;t seem to work. For some reason logic update and display update happens at the same time with a rate of 5 times per second (LOGIC_FPS).</p><p>I need advice. </p><p>Thanks in advance.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (almbfsek)</author>
		<pubDate>Wed, 20 Apr 2011 20:24:58 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;d suggest using al_wait_for_event_until.</p><p>This is how I would do it.
</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>    <a href="http://www.allegro.cc/manual/ALLEGRO_TIMEOUT"><span class="a">ALLEGRO_TIMEOUT</span></a> timeout<span class="k2">;</span>
<span class="number">  2</span>    <a href="http://www.allegro.cc/manual/al_init_timeout"><span class="a">al_init_timeout</span></a><span class="k2">(</span> <span class="k3">&amp;</span>timeout, <span class="n">0</span>.<span class="n">6</span> <span class="k2">)</span><span class="k2">;</span>
<span class="number">  3</span>
<span class="number">  4</span>    <a href="http://www.allegro.cc/manual/al_wait_for_event_until"><span class="a">al_wait_for_event_until</span></a><span class="k2">(</span> this-&gt;queue, <span class="k3">&amp;</span>this-&gt;event, <span class="k3">&amp;</span>timeout <span class="k2">)</span><span class="k2">;</span>
<span class="number">  5</span>
<span class="number">  6</span>    <span class="k1">switch</span> <span class="k2">(</span> this-&gt;event.type <span class="k2">)</span>
<span class="number">  7</span>    <span class="k2">{</span>
<span class="number">  8</span>        <span class="k1">case</span> ALLEGRO_EVENT_TIMER:
<span class="number">  9</span>        <span class="k2">{</span>
<span class="number"> 10</span>            this-&gt;ticked <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 11</span>        <span class="k2">}</span>
<span class="number"> 12</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 13</span>    <span class="k2">}</span>
</div></div><p>

That&#39;s taken strait from my code so don&#39;t just copy and paste. It&#39;s only an example so will not work without the rest of my class.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Desmond Taylor)</author>
		<pubDate>Wed, 20 Apr 2011 21:49:14 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Here is what I use to separate the logic from the drawing... Obviously isn&#39;t complete, I haven&#39;t started any project which needs to separate the logic from the drawing.. If you&#39;re creating a simple game probably you don&#39;t need it, but it&#39;s good to understand and work this way from the beginning.</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="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number">  2</span><span class="p">#include &lt;allegro5/allegro_native_dialog.h&gt;</span>
<span class="number">  3</span>
<span class="number">  4</span><span class="k1">int</span> main<span class="k2">(</span><span class="k1">int</span> argc, <span class="k1">char</span> <span class="k3">*</span><span class="k3">*</span>argv<span class="k2">)</span>
<span class="number">  5</span><span class="k2">{</span>
<span class="number">  6</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a> <span class="k3">*</span>display <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  7</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_QUEUE"><span class="a">ALLEGRO_EVENT_QUEUE</span></a> <span class="k3">*</span>event_queue <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  8</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">  9</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_TIMER"><span class="a">ALLEGRO_TIMER</span></a> <span class="k3">*</span>FPS <span class="k3">=</span> NULL<span class="k2">;</span> <span class="c">//Frames</span>
<span class="number"> 10</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_TIMER"><span class="a">ALLEGRO_TIMER</span></a> <span class="k3">*</span>LPS <span class="k3">=</span> NULL<span class="k2">;</span> <span class="c">//Logic</span>
<span class="number"> 11</span>   <span class="k1">bool</span> redraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 12</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_init"><span class="a">al_init</span></a><span class="k2">(</span><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_show_native_message_box"><span class="a">al_show_native_message_box</span></a><span class="k2">(</span>display, <span class="s">"Error"</span>, <span class="s">"Error"</span>, <span class="s">"Failed to initialize allegro!"</span>, NULL, ALLEGRO_MESSAGEBOX_ERROR<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number"> 16</span>   <span class="k2">}</span>
<span class="number"> 17</span>
<span class="number"> 18</span>   FPS <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_timer"><span class="a">al_create_timer</span></a><span class="k2">(</span><span class="n">1</span>.<span class="n">0</span> <span class="k3">/</span> <span class="n">5</span><span class="k2">)</span><span class="k2">;</span> <span class="c">//Frames</span>
<span class="number"> 19</span>   LPS <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_timer"><span class="a">al_create_timer</span></a><span class="k2">(</span><span class="n">1</span>.<span class="n">0</span> <span class="k3">/</span> <span class="n">10</span><span class="k2">)</span><span class="k2">;</span> <span class="c">//Logic</span>
<span class="number"> 20</span>
<span class="number"> 21</span>   display <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_display"><span class="a">al_create_display</span></a><span class="k2">(</span><span class="n">640</span>, <span class="n">480</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 22</span>
<span class="number"> 23</span>   event_queue <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_event_queue"><span class="a">al_create_event_queue</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 24</span>
<span class="number"> 25</span>   <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>event_queue, <a href="http://www.allegro.cc/manual/al_get_display_event_source"><span class="a">al_get_display_event_source</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 26</span>
<span class="number"> 27</span>   <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>event_queue, <a href="http://www.allegro.cc/manual/al_get_timer_event_source"><span class="a">al_get_timer_event_source</span></a><span class="k2">(</span>FPS<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 28</span>
<span class="number"> 29</span>   <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>event_queue, <a href="http://www.allegro.cc/manual/al_get_timer_event_source"><span class="a">al_get_timer_event_source</span></a><span class="k2">(</span>LPS<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 30</span>
<span class="number"> 31</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"> 32</span>
<span class="number"> 33</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"> 34</span>
<span class="number"> 35</span>   <a href="http://www.allegro.cc/manual/al_start_timer"><span class="a">al_start_timer</span></a><span class="k2">(</span>FPS<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 36</span>   <a href="http://www.allegro.cc/manual/al_start_timer"><span class="a">al_start_timer</span></a><span class="k2">(</span>LPS<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 37</span>
<span class="number"> 38</span>   <span class="k1">while</span><span class="k2">(</span><span class="n">1</span><span class="k2">)</span>
<span class="number"> 39</span>   <span class="k2">{</span>
<span class="number"> 40</span>
<span class="number"> 41</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"> 42</span>
<span class="number"> 43</span>      <span class="k1">if</span><span class="k2">(</span>ev.timer.source <span class="k3">=</span><span class="k3">=</span> LPS<span class="k2">)</span> <span class="k2">{</span> <span class="c">//LOGIC</span>
<span class="number"> 44</span>         Beep<span class="k2">(</span><span class="n">500</span>,<span class="n">10</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 45</span>      <span class="k2">}</span>
<span class="number"> 46</span>
<span class="number"> 47</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"> 48</span>         <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 49</span>      <span class="k2">}</span>
<span class="number"> 50</span>
<span class="number"> 51</span>      <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>ev.timer.source <span class="k3">=</span><span class="k3">=</span> FPS<span class="k2">)</span> <span class="k2">{</span> <span class="c">//DRAW</span>
<span class="number"> 52</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"> 53</span>         Beep<span class="k2">(</span><span class="n">100</span>,<span class="n">10</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 54</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"> 55</span>      <span class="k2">}</span>
<span class="number"> 56</span>   <span class="k2">}</span>
<span class="number"> 57</span>
<span class="number"> 58</span>   <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>FPS<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 59</span>   <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>LPS<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 60</span>   <a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 61</span>   <a href="http://www.allegro.cc/manual/al_destroy_event_queue"><span class="a">al_destroy_event_queue</span></a><span class="k2">(</span>event_queue<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 62</span>
<span class="number"> 63</span>   <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 64</span><span class="k2">}</span>
</div></div><p>

You can compile it right away. The <span class="source-code">Beep<span class="k2">(</span><span class="k2">)</span></span> function is just to make a &quot;beep&quot;...</p><p>I may be wrong but actually you should separate the input from the logic and the drawing, that is what I&#39;m trying to do. With Allegro 5 this is very easy to do.</p><p>But to do this, each object (if you&#39;re using C++, which I hope, since is the best for game programming) should have:</p><p>- A Draw Function<br />- A Logic Function</p><p>and..</p><p>- A Input function (depending if that object is controlled by the user.)</p><p>Anyway, I&#39;m not pretty sure about all this, I still learning. <img src="http://www.allegro.cc/forums/smileys/lipsrsealed.gif" alt=":-X" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (AMCerasoli)</author>
		<pubDate>Wed, 20 Apr 2011 22:21:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Desmond I guess it doesn&#39;t have anything to do with my game loop question but I&#39;m eager to know what advnatage would I have by using a timeout? I originally used al_wait_for_event_until as seen in the wiki tutorials but then I thought the simple the better and got rid off the timeout. Thanks</p><p>AMCerasoli, I tested it and it sucessfully separates game logic and FPS but still the FPS is pre determined. As suggested in the link I gave why run at 25 FPS when its possible to run it at 300 FPS <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /> it&#39;s wasting clock cycles. My code basically does the same thing except it doesn&#39;t put a limit on the FPS. I still don&#39;t see why it doesn&#39;t work though. any ideas?</p><p>EDIT: Ok here is an hybrid between AMCerasoli&#39;s and my code. Someone please tell me why &quot;Limitless update&quot; gets written at the same rate with &quot;Display updated&quot;? Change the FPS value and see it for your self. What am I doing wrong?</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="p">#include &lt;stdio.h&gt;</span>
<span class="number">  2</span><span class="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number">  3</span>
<span class="number">  4</span><span class="p">#define WIDTH 960</span>
<span class="number">  5</span><span class="p">#define HEIGHT 640</span>
<span class="number">  6</span><span class="p">#define LPS 1</span>
<span class="number">  7</span><span class="p">#define FPS 4</span>
<span class="number">  8</span>
<span class="number">  9</span><span class="k1">int</span> main<span class="k2">(</span><span class="k1">int</span> argc, <span class="k1">char</span> <span class="k3">*</span><span class="k3">*</span>argv<span class="k2">)</span>
<span class="number"> 10</span><span class="k2">{</span>
<span class="number"> 11</span>    <a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a> <span class="k3">*</span>display<span class="k2">;</span>
<span class="number"> 12</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_QUEUE"><span class="a">ALLEGRO_EVENT_QUEUE</span></a> <span class="k3">*</span>eventQueue<span class="k2">;</span>
<span class="number"> 13</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_TIMER"><span class="a">ALLEGRO_TIMER</span></a> <span class="k3">*</span>lpsTimer, <span class="k3">*</span>fpsTimer<span class="k2">;</span>
<span class="number"> 14</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> e<span class="k2">;</span>
<span class="number"> 15</span>
<span class="number"> 16</span>  <span class="k1">bool</span> isGameRunning <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 17</span>
<span class="number"> 18</span>  <span class="c">//Various inits</span>
<span class="number"> 19</span>    <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_init"><span class="a">al_init</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 20</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to initialize allegro\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 21</span>        <span class="k1">return</span> EXIT_FAILURE<span class="k2">;</span>
<span class="number"> 22</span>    <span class="k2">}</span>
<span class="number"> 23</span>
<span class="number"> 24</span>  lpsTimer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_timer"><span class="a">al_create_timer</span></a><span class="k2">(</span><span class="n">1</span>.<span class="n">0</span> <span class="k3">/</span> LPS<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 25</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>lpsTimer<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 26</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to create lpsTimer!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 27</span>    <span class="k1">return</span> EXIT_FAILURE<span class="k2">;</span>
<span class="number"> 28</span>  <span class="k2">}</span>
<span class="number"> 29</span>
<span class="number"> 30</span>  fpsTimer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_timer"><span class="a">al_create_timer</span></a><span class="k2">(</span><span class="n">1</span>.<span class="n">0</span> <span class="k3">/</span> FPS<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 31</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>fpsTimer<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 32</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to create fpsTimer!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 33</span>    <span class="k1">return</span> EXIT_FAILURE<span class="k2">;</span>
<span class="number"> 34</span>  <span class="k2">}</span>
<span class="number"> 35</span>
<span class="number"> 36</span>    display <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_display"><span class="a">al_create_display</span></a><span class="k2">(</span>WIDTH, HEIGHT<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 37</span>    <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>display<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 38</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to create display!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 39</span>    <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>lpsTimer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 40</span>    <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>fpsTimer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 41</span>        <span class="k1">return</span> EXIT_FAILURE<span class="k2">;</span>
<span class="number"> 42</span>    <span class="k2">}</span>
<span class="number"> 43</span>
<span class="number"> 44</span>  eventQueue <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_event_queue"><span class="a">al_create_event_queue</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 45</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>eventQueue<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 46</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to create eventQueue!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 47</span>    <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>lpsTimer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 48</span>    <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>fpsTimer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 49</span>    <a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 50</span>    <span class="k1">return</span> EXIT_FAILURE<span class="k2">;</span>
<span class="number"> 51</span>  <span class="k2">}</span>
<span class="number"> 52</span>
<span class="number"> 53</span>  <span class="c">//Tie events to queue</span>
<span class="number"> 54</span>  <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>eventQueue, <a href="http://www.allegro.cc/manual/al_get_display_event_source"><span class="a">al_get_display_event_source</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 55</span>  <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>eventQueue, <a href="http://www.allegro.cc/manual/al_get_timer_event_source"><span class="a">al_get_timer_event_source</span></a><span class="k2">(</span>lpsTimer<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 56</span>  <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>eventQueue, <a href="http://www.allegro.cc/manual/al_get_timer_event_source"><span class="a">al_get_timer_event_source</span></a><span class="k2">(</span>fpsTimer<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 57</span>
<span class="number"> 58</span>  <span class="c">//Start timers</span>
<span class="number"> 59</span>  <a href="http://www.allegro.cc/manual/al_start_timer"><span class="a">al_start_timer</span></a><span class="k2">(</span>lpsTimer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 60</span>  <a href="http://www.allegro.cc/manual/al_start_timer"><span class="a">al_start_timer</span></a><span class="k2">(</span>fpsTimer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 61</span>
<span class="number"> 62</span>  <span class="c">//Main loop</span>
<span class="number"> 63</span>  <span class="k1">while</span><span class="k2">(</span>isGameRunning<span class="k2">)</span>
<span class="number"> 64</span>  <span class="k2">{</span>
<span class="number"> 65</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>eventQueue, <span class="k3">&amp;</span>e<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 66</span>
<span class="number"> 67</span>    <span class="k1">switch</span><span class="k2">(</span>e.type<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 68</span>      <span class="k1">case</span> ALLEGRO_EVENT_DISPLAY_CLOSE:
<span class="number"> 69</span>        isGameRunning <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 70</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 71</span>
<span class="number"> 72</span>      <span class="k1">case</span> ALLEGRO_EVENT_TIMER:
<span class="number"> 73</span>        <span class="k1">if</span><span class="k2">(</span>e.timer.source <span class="k3">=</span><span class="k3">=</span> lpsTimer<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 74</span>          <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stdout, <span class="s">"Logic updated\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 75</span>        <span class="k2">}</span>
<span class="number"> 76</span>        <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>e.timer.source <span class="k3">=</span><span class="k3">=</span> fpsTimer<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 77</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">50</span>,<span class="n">123</span>,<span class="n">1</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 78</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"> 79</span>          <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stdout, <span class="s">"Display updated\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 80</span>        <span class="k2">}</span>
<span class="number"> 81</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 82</span>    <span class="k2">}</span>
<span class="number"> 83</span>
<span class="number"> 84</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stdout, <span class="s">"Limitless update\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 85</span>  <span class="k2">}</span>
<span class="number"> 86</span>
<span class="number"> 87</span>  <span class="c">//Cleaning</span>
<span class="number"> 88</span>  <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>lpsTimer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 89</span>  <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>fpsTimer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 90</span>    <a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 91</span>  <a href="http://www.allegro.cc/manual/al_destroy_event_queue"><span class="a">al_destroy_event_queue</span></a><span class="k2">(</span>eventQueue<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 92</span>
<span class="number"> 93</span>    <span class="k1">return</span> EXIT_SUCCESS<span class="k2">;</span>
<span class="number"> 94</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (almbfsek)</author>
		<pubDate>Thu, 21 Apr 2011 11:15:51 +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/607072/913912#target">AMCerasoli</a> said:</div><div class="quote"><p>
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>ev.timer.source <span class="k3">=</span><span class="k3">=</span> FPS<span class="k2">)</span> <span class="k2">{</span> <span class="c">//DRAW</span>
</pre></div></div><p>
</p></div></div><p>
You are checking the timer field of the event without knowing the type of the event. ev.timer and ev.timer.source could have absolutely any value. Stop it. <img src="http://www.allegro.cc/forums/smileys/cry.gif" alt=":&#39;(" /></p><p>My take on separating logic and drawing :</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">const</span> <span class="k1">float</span> LOGIC_PER_SECOND <span class="k3">=</span> <span class="n">120</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number">  2</span><span class="k1">const</span> <span class="k1">float</span> FRAMES_PER_SECOND <span class="k3">=</span> <span class="n">60</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number">  3</span>
<span class="number">  4</span><a href="http://www.allegro.cc/manual/ALLEGRO_TIMER"><span class="a">ALLEGRO_TIMER</span></a><span class="k3">*</span> logic_timer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_timer"><span class="a">al_create_timer</span></a><span class="k2">(</span>LOGIC_PER_SECOND<span class="k2">)</span><span class="k2">;</span>
<span class="number">  5</span><a href="http://www.allegro.cc/manual/ALLEGRO_TIMER"><span class="a">ALLEGRO_TIMER</span></a><span class="k3">*</span> display_timer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_timer"><span class="a">al_create_timer</span></a><span class="k2">(</span>FRAMES_PER_SECOND<span class="k2">)</span><span class="k2">;</span>
<span class="number">  6</span>
<span class="number">  7</span><span class="c">// Event loop</span>
<span class="number">  8</span><span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span>quit<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  9</span>   <span class="k1">while</span> <span class="k2">(</span><span class="n">1</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 10</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"> 11</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"> 12</span>      <span class="k1">if</span> <span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_TIMER<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 13</span>         <span class="k1">if</span> <span class="k2">(</span>ev.timer.source <span class="k3">=</span><span class="k3">=</span> logic_timer<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 14</span>            DoLogic<span class="k2">(</span><span class="n">1</span>.<span class="n">0</span><span class="k3">/</span>LOGIC_PER_SECOND<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span>         <span class="k2">}</span> <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>ev.timer.source <span class="k3">=</span><span class="k3">=</span> display_timer<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 16</span>            redraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 17</span>         <span class="k2">}</span>
<span class="number"> 18</span>      <span class="k2">}</span>
<span class="number"> 19</span>      <span class="k1">if</span> <span class="k2">(</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="k1">break</span><span class="k2">;</span><span class="k2">}</span>
<span class="number"> 20</span>   <span class="k2">}</span>
<span class="number"> 21</span>   <span class="k1">if</span> <span class="k2">(</span>redraw<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 22</span>      Redraw<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 23</span>   <span class="k2">}</span>
<span class="number"> 24</span>   <span class="c">// clean up</span>
<span class="number"> 25</span><span class="k2">}</span>
</div></div><p>
With this simple logic you can implement any logic per second, and any frames per second, with frames being dropped if they are taking too long.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Thu, 21 Apr 2011 12:04:42 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Edgar, that&#39;s what I came up with too. Can you solve my problem though?<br />BTW, what kind of effect does al_is_event_queue_empty(event_queue) have? why do I need it? thanks</p><p>edit: also, is it still logical to use interpolation with this method?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (almbfsek)</author>
		<pubDate>Thu, 21 Apr 2011 12:20:24 +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/607072/913976#target">almbfsek</a> said:</div><div class="quote"><p>
As suggested in the link I gave why run at 25 FPS when its possible to run it at 300 FPS
</p></div></div><p>
Drawing more frames than the number of Hz that your monitor runs at is pointless, as you will never see more than Hz number of frames anyway. If you&#39;re talking about logic per second that&#39;s different though.</p><div class="quote_container"><div class="title">almbfsek said:</div><div class="quote"><p>
Someone please tell me why &quot;Limitless update&quot; gets written at the same rate with &quot;Display updated&quot;?
</p></div></div><p>
Because you output &#39;Limitless update&#39; each time any event occurs - whether it&#39;s a logic event or a display event.</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/607072/913989#target">almbfsek</a> said:</div><div class="quote"><p>
Can you solve my problem though?<br />BTW, what kind of effect does al_is_event_queue_empty(event_queue) have? why do I need it? thanks 
</p></div></div><p>
You need to exhaust all of the events that are in the queue before you update your display so that all the logic events have been processed.</p><div class="source-code snippet"><div class="inner"><pre>   <span class="k1">if</span> <span class="k2">(</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="k1">break</span><span class="k2">;</span><span class="k2">}</span>
</pre></div></div><p>
This line will break out of the event loop once there are no events left to process. If there are events left, it will go to the beginning of the loop and check the next event.</p><p>If you want to adjust the rate that each timer runs, you can do that with <span class="source-code"><a href="http://www.allegro.cc/manual/al_set_timer_speed"><span class="a">al_set_timer_speed</span></a></span>.</p><p><b>Edit for your edit</b>
</p><div class="quote_container"><div class="title">almbfsek said:</div><div class="quote"><p>
edit: also, is it still logical to use interpolation with this method? 
</p></div></div><p>
Well, you could do it with ALLEGRO_EVENT.timestamp and <span class="source-code"><a href="http://www.allegro.cc/manual/al_get_time"><span class="a">al_get_time</span></a></span>. I don&#39;t see the point of using interpolation at this level though. It just complicates things needlessly. I also don&#39;t see the point of running logic at a different rate than the display.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Thu, 21 Apr 2011 12:35:33 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://">Edgar Reynaldo</a> said:</div><div class="quote"><p>Because you output &#39;Limitless update&#39; each time any event occurs - whether it&#39;s a logic event or a display event.</p></div></div><p>

Aah I see. It&#39;s because of al_wait_for_event(eventQueue, &amp;e) right? It waits until an event occurs thus &quot;Limitless update&quot; happens exactly at the same speed of the fastest occurring event.</p><p>How can I truly make it separate though? I don&#39;t want to limit my FPS. I want to make it run as fast as possible while limiting game logic to 25 lps for example?</p><p>NVM I better use a good old get_tick like routine. since timers in allegro are tied to the events what I&#39;m asking is not possible.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (almbfsek)</author>
		<pubDate>Thu, 21 Apr 2011 13:07:06 +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/607072/913995#target">almbfsek</a> said:</div><div class="quote"><p>
I don&#39;t want to limit my FPS.
</p></div></div><p>
It is physically impossible to render more frames per second than the refresh rate of the monitor. So set your display timer to the refresh rate of the monitor and forget about it.</p><div class="quote_container"><div class="title">almbfsek said:</div><div class="quote"><p>
I want to make it run as fast as possible while limiting game logic to 25 lps for example? 
</p></div></div><p>
Is your logic really so expensive that you can&#39;t run it at the same rate as your display?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Thu, 21 Apr 2011 14:53:41 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Edgar I agree that &quot;FPS dependent on Constant Game Speed&quot; type of game loop is simpler and works most of the time but I want to try new methods and see the difference for my self.</p><p>Also there might be scenarios where the refresh rate of the monitor is more than the computer can handle. For example my monitor runs at 75 Hz but 75 fps might be too much for my old GPU. In this case if game logic and fps are not separated game logic will slow down too. It&#39;s something that I especially not want in a network game. It&#39;s easier to sync players if the game logic has its own rate.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (almbfsek)</author>
		<pubDate>Thu, 21 Apr 2011 15:01:01 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You can easily skip logic or frames with the algorithm I suggested, and you don&#39;t have to make your game speed the same as your frame rate, but it will then look choppy if you don&#39;t interpolate.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Thu, 21 Apr 2011 15:17:19 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>that&#39;s what I use now. you&#39;re right that &quot;fps as fast as possible&quot; is not really needed. for interpolation I use something like this:</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">float</span> getLogicInterpolation<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 2</span>   <span class="k1">return</span> <span class="k2">(</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>lpsTimer<span class="k2">)</span> % LPS <span class="k3">+</span> <span class="n">1</span>.<span class="n">0</span><span class="k2">)</span> <span class="k3">/</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>LPS<span class="k2">;</span>
<span class="number"> 3</span><span class="k2">}</span>
</div></div><p>

and the main loop now looks like this
</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>isGameRunning<span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>  <span class="c">//Event handling</span>
<span class="number">  4</span>  <span class="k1">while</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>eventQueue<span class="k2">)</span><span class="k2">)</span><span class="k2">{</span>
<span class="number">  5</span>    <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> e<span class="k2">;</span>
<span class="number">  6</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>eventQueue, <span class="k3">&amp;</span>e<span class="k2">)</span><span class="k2">;</span>
<span class="number">  7</span>
<span class="number">  8</span>    <span class="k1">switch</span><span class="k2">(</span>e.type<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  9</span>      <span class="k1">case</span> ALLEGRO_EVENT_DISPLAY_CLOSE:
<span class="number"> 10</span>        isGameRunning <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 11</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 12</span>
<span class="number"> 13</span>      <span class="k1">case</span> ALLEGRO_EVENT_TIMER:
<span class="number"> 14</span>        <span class="k1">if</span><span class="k2">(</span>e.timer.source <span class="k3">=</span><span class="k3">=</span> lpsTimer<span class="k2">)</span>
<span class="number"> 15</span>          isLogicUpdateNeeded <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 16</span>        <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>e.timer.source <span class="k3">=</span><span class="k3">=</span> fpsTimer<span class="k2">)</span>
<span class="number"> 17</span>          isDisplayUpdateNeeded <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 18</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 19</span>    <span class="k2">}</span>
<span class="number"> 20</span>  <span class="k2">}</span>
<span class="number"> 21</span>
<span class="number"> 22</span>  <span class="c">//Game logic</span>
<span class="number"> 23</span>  <span class="k1">if</span><span class="k2">(</span>isLogicUpdateNeeded<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 24</span>    isLogicUpdateNeeded <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 25</span>    <span class="c">//updateLogic();</span>
<span class="number"> 26</span>  <span class="k2">}</span>
<span class="number"> 27</span>
<span class="number"> 28</span>  <span class="c">//Rendering</span>
<span class="number"> 29</span>  <span class="k1">if</span><span class="k2">(</span>isDisplayUpdateNeeded<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 30</span>    isDisplayUpdateNeeded <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 31</span>    <span class="c">//updateDisplay();</span>
<span class="number"> 32</span>  <span class="k2">}</span>
<span class="number"> 33</span><span class="k2">}</span>
</div></div><p>

thanks everyone for your help
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (almbfsek)</author>
		<pubDate>Thu, 21 Apr 2011 15:30:22 +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/607072/913988#target">Edgar Reynaldo</a> said:</div><div class="quote"><p>
You are checking the timer field of the event without knowing the type of the event. ev.timer and ev.timer.source could have absolutely any value. Stop it. 
</p></div></div><p>

Damn, is true I forgot to changed the last time!.</p><h1> </h1><p>

You should separate the drawing from the logic because:</p><ul><li><p>Drawing more frames than the number of Hz that your monitor runs at is pointless.
</p></li><li><p>Drawing takes 80 % more processing time than logic, basically you would be wasting GPU processing drawing the same frames, wasting battery if you&#39;re using a laptop, burning out your GPU, etc. this is why you Logic should always be faster than your frames per second
</p></li><li><p>After 30 FPS, the human eye can&#39;t notice the difference between 30 FPS or 3000 FPS.</p></li></ul><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/607072/914004#target">almbfsek</a> said:</div><div class="quote"><p>
In this case if game logic and fps are not separated game logic will slow down too. It&#39;s something that I especially not want in a network game.
</p></div></div><p>

Well, I don&#39;t know what system are you using to create your network game, may be Peer-to-peer or client-server, but I think synchronizing the game completely is not a good option, I haven&#39;t created an only game, but I use to think about it, and in a Client-Server game I think the Server program doesn&#39;t need any logic per second, let alone FPS. </p><p>I think it should be something like: the client send info to the server the server check if that info is correct and then send it to the other clients. so the Server just need receive as many request it&#39;s possible, and you don&#39;t need to time out the LPS of the Server... Anyway, read <a href="http://gafferongames.com/networking-for-game-programmers/what-every-programmer-needs-to-know-about-game-networking/">this </a>web page, is poor gold.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (AMCerasoli)</author>
		<pubDate>Thu, 21 Apr 2011 16:20:21 +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/607072/913988#target">Edgar Reynaldo</a> said:</div><div class="quote"><p>
You are checking the timer field of the event without knowing the type of the event. ev.timer and ev.timer.source could have absolutely any value. Stop it.
</p></div></div><p>

Actually in this case it&#39;s fine, as all event types have the three common fields: type, source, timestamp. It would be better style to use ev.any.source though.</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/607072/914023#target">AMCerasoli</a> said:</div><div class="quote"><p>
After 30 FPS, the human eye can&#39;t notice the difference between 30 FPS or 3000 FPS.
</p></div></div><p>

This old myth must die.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Wang)</author>
		<pubDate>Thu, 21 Apr 2011 16:40:26 +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/607072/914023#target">AMCerasoli</a> said:</div><div class="quote"><p> After 30 FPS, the human eye can&#39;t notice the difference between 30 FPS or 3000 FPS.</p></div></div><p>Actually I can quite easily see the successive images of a mountain sticking up out of the terrain as I spin a camera around in place, at least on a CRT.  Even at 85 fps.  But 30 fps is generally good enough.</p><p>I can also wave my finger around between my eye and the screen and see separate silhouettes, one for each refresh.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Arthur Kalliokoski)</author>
		<pubDate>Thu, 21 Apr 2011 16:45:12 +0000</pubDate>
	</item>
</rss>
