<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>event loop best practice</title>
		<link>http://www.allegro.cc/forums/view/617709</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Thu, 31 Jan 2019 05:01:32 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>On topic for once...</p><p>I have found that writing the main event loop is not trivial and there are several event-getting functions that Allegro has.</p><p>In the demos and examples they use different ways.<br /><a href="https://github.com/liballeg/allegro5/blob/6017bed18585146d2499aa0a13709f975a9bb047/demos/speed/main.c#L67-L129">Speed</a><br /><a href="https://github.com/liballeg/allegro5/blob/6017bed18585146d2499aa0a13709f975a9bb047/demos/skater/src/framework.c#L256-L464">Skater</a><br /><a href="https://github.com/liballeg/allegro5/blob/6017bed18585146d2499aa0a13709f975a9bb047/demos/cosmic_protector/src/logic.cpp#L52-L67">Cosmic Protector</a></p><p>I think this might be confusing for people starting out.</p><p>Is there a &#39;best&#39; way to do it (for programs that don&#39;t have unusual requirements) and if so, should we emphasize it in the docs/examples/demos?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Hull)</author>
		<pubDate>Fri, 25 Jan 2019 18:33:04 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Let&#39;s distill down the essence of each loop, shall we?</p><p>From your first link for Speed : <a href="https://github.com/liballeg/allegro5/blob/6017bed18585146d2499aa0a13709f975a9bb047/demos/speed/main.c#L67-L129">https://github.com/liballeg/allegro5/blob/6017bed18585146d2499aa0a13709f975a9bb047/demos/speed/main.c#L67-L129</a></p><p>We have 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><span class="k3">!</span>gameover<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  2</span>
<span class="number">  3</span>      <span class="c">/* move everyone */</span>
<span class="number">  4</span>      <span class="k1">while</span> <span class="k2">(</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>inc_counter<span class="k2">)</span> <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k2">(</span><span class="k3">!</span>gameover<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  5</span>         update_view<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  6</span>         update_bullets<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  7</span>         update_explode<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  8</span>         update_message<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  9</span>
<span class="number"> 10</span>         <span class="k1">if</span> <span class="k2">(</span>update_badguys<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 11</span>            <span class="k1">if</span> <span class="k2">(</span>advance_view<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 12</span>               cyclenum<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 13</span>               <a href="http://www.allegro.cc/manual/al_set_timer_count"><span class="a">al_set_timer_count</span></a><span class="k2">(</span>inc_counter, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 14</span>               lay_attack_wave<span class="k2">(</span>TRUE<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span>               advance_player<span class="k2">(</span>TRUE<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span>            <span class="k2">}</span>
<span class="number"> 17</span>            <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 18</span>               lay_attack_wave<span class="k2">(</span>FALSE<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span>               advance_player<span class="k2">(</span>FALSE<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 20</span>            <span class="k2">}</span>
<span class="number"> 21</span>         <span class="k2">}</span>
<span class="number"> 22</span>
<span class="number"> 23</span>         gameover <span class="k3">=</span> update_player<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_set_timer_count"><span class="a">al_set_timer_count</span></a><span class="k2">(</span>inc_counter, <a href="http://www.allegro.cc/manual/al_get_timer_count"><span class="a">al_get_timer_count</span></a><span class="k2">(</span>inc_counter<span class="k2">)</span><span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 26</span>         redraw <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 27</span>      <span class="k2">}</span>
<span class="number"> 28</span>
<span class="number"> 29</span>      <span class="c">/* take a screenshot? */</span>
<span class="number"> 30</span>      <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/key"><span class="a">key</span></a><span class="k2">[</span>ALLEGRO_KEY_PRINTSCREEN<span class="k2">]</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 31</span>         <span class="k1">static</span> <span class="k1">int</span> ss_count <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 32</span>
<span class="number"> 33</span>         <span class="k1">char</span> fname<span class="k2">[</span><span class="n">80</span><span class="k2">]</span><span class="k2">;</span>
<span class="number"> 34</span>
<span class="number"> 35</span>         <a href="http://www.delorie.com/djgpp/doc/libc/libc_737.html" target="_blank">sprintf</a><span class="k2">(</span>fname, <span class="s">"speed%03d.tga"</span>, <span class="k3">+</span><span class="k3">+</span>ss_count<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 36</span>
<span class="number"> 37</span>         <a href="http://www.allegro.cc/manual/al_save_bitmap"><span class="a">al_save_bitmap</span></a><span class="k2">(</span>fname, <a href="http://www.allegro.cc/manual/al_get_backbuffer"><span class="a">al_get_backbuffer</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/screen"><span class="a">screen</span></a><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 38</span>
<span class="number"> 39</span>         <span class="k1">while</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/key"><span class="a">key</span></a><span class="k2">[</span>ALLEGRO_KEY_PRINTSCREEN<span class="k2">]</span><span class="k2">)</span>
<span class="number"> 40</span>            poll_input_wait<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 41</span>
<span class="number"> 42</span>         <a href="http://www.allegro.cc/manual/al_set_timer_count"><span class="a">al_set_timer_count</span></a><span class="k2">(</span>inc_counter, <span class="n">0</span><span class="k2">)</span><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">/* toggle fullscreen window */</span>
<span class="number"> 46</span>      <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/key"><span class="a">key</span></a><span class="k2">[</span>ALLEGRO_KEY_F<span class="k2">]</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 47</span>         <span class="k1">int</span> flags <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_display_flags"><span class="a">al_get_display_flags</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/screen"><span class="a">screen</span></a><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 48</span>         al_set_display_flag<span class="k2">(</span><a href="http://www.allegro.cc/manual/screen"><span class="a">screen</span></a>, ALLEGRO_FULLSCREEN_WINDOW,
<span class="number"> 49</span>            <span class="k3">!</span><span class="k2">(</span>flags <span class="k3">&amp;</span> ALLEGRO_FULLSCREEN_WINDOW<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 50</span>
<span class="number"> 51</span>         <span class="k1">while</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/key"><span class="a">key</span></a><span class="k2">[</span>ALLEGRO_KEY_F<span class="k2">]</span><span class="k2">)</span>
<span class="number"> 52</span>            poll_input_wait<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 53</span>      <span class="k2">}</span>
<span class="number"> 54</span>
<span class="number"> 55</span>      <span class="c">/* draw everyone */</span>
<span class="number"> 56</span>      <span class="k1">if</span> <span class="k2">(</span>redraw<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 57</span>         draw_view<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 58</span>         redraw <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 59</span>      <span class="k2">}</span>
<span class="number"> 60</span>      <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 61</span>         <a href="http://www.allegro.cc/manual/rest"><span class="a">rest</span></a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 62</span>      <span class="k2">}</span>
<span class="number"> 63</span><span class="k2">}</span>
</div></div><p>

Let&#39;s analyze that. The basic form is this :</p><div class="source-code snippet"><div class="inner"><pre>   <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span>gameover<span class="k2">)</span> <span class="k2">{</span>
      <span class="k1">while</span> <span class="k2">(</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>inc_counter<span class="k2">)</span> <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k2">(</span><span class="k3">!</span>gameover<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
         <span class="c">/* LOGIC */</span>
      <span class="k2">}</span>
      <span class="k1">if</span> <span class="k2">(</span>redraw<span class="k2">)</span> <span class="k2">{</span>
         draw_view<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
         redraw <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
      <span class="k2">}</span>
      <span class="k1">else</span> <span class="k2">{</span>
         <a href="http://www.allegro.cc/manual/rest"><span class="a">rest</span></a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
      <span class="k2">}</span>
   <span class="k2">}</span>
</pre></div></div><p>

How is that any different than the old A4 style game loop?
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">while</span> <span class="k2">(</span>keepgoing<span class="k2">)</span> <span class="k2">{</span>
   <span class="k1">while</span> <span class="k2">(</span>ticks--<span class="k2">)</span> <span class="k2">{</span>
      Logic<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
   <span class="k2">}</span>
   <span class="k1">if</span> <span class="k2">(</span>redraw<span class="k2">)</span> <span class="k2">{</span>
      Redraw<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
      redraw <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
   <span class="k2">}</span>
   <a href="http://www.allegro.cc/manual/rest"><span class="a">rest</span></a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

That&#39;s a horrible way to code a game loop.</p><p>Let&#39;s move on.</p><p>Example 2, Skater demo : <a href="https://github.com/liballeg/allegro5/blob/6017bed18585146d2499aa0a13709f975a9bb047/demos/skater/src/framework.c#L256-L464">https://github.com/liballeg/allegro5/blob/6017bed18585146d2499aa0a13709f975a9bb047/demos/skater/src/framework.c#L256-L464</a></p><p>Basically, it boils down to 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">/* Do the main loop; until we're not done. */</span>
<span class="number">  2</span><span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span>done<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/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> event<span class="k2">;</span>
<span class="number">  5</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>event_queue, <span class="k3">&amp;</span>event<span class="k2">)</span><span class="k2">;</span>
<span class="number">  7</span>
<span class="number">  8</span>   HandleEvent<span class="k2">(</span>event<span class="k2">)</span><span class="k2">;</span>
<span class="number">  9</span>   
<span class="number"> 10</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>event_queue<span class="k2">)</span><span class="k2">)</span> <span class="k1">continue</span><span class="k2">;</span>
<span class="number"> 11</span>
<span class="number"> 12</span>   <span class="c">/* Check if the timer has ticked. */</span>
<span class="number"> 13</span>   <span class="k1">while</span> <span class="k2">(</span>timer <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 14</span>      <span class="k3">-</span><span class="k3">-</span>timer<span class="k2">;</span>
<span class="number"> 15</span>
<span class="number"> 16</span>      CheckScreenshot<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 17</span>      
<span class="number"> 18</span>      HandleState<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span>
<span class="number"> 20</span>      <span class="c">/* We just did one logic frame so we assume we will need to update</span>
<span class="number"> 21</span><span class="c">         the visuals to reflect the changes this logic frame made. */</span>
<span class="number"> 22</span>      need_to_redraw <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 23</span>
<span class="number"> 24</span>      <span class="c">/* Let the framerate counter know that one logic frame was run. */</span>
<span class="number"> 25</span>      fps_tick<span class="k2">(</span>fps<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 26</span>
<span class="number"> 27</span>      keyboard_tick<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 28</span>      mouse_tick<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 29</span>   <span class="k2">}</span>
<span class="number"> 30</span>
<span class="number"> 31</span>   <span class="c">/* In case a frame of logic has just been run or the user wants</span>
<span class="number"> 32</span><span class="c">      unlimited framerate, we must redraw the screen. */</span>
<span class="number"> 33</span>   <span class="k1">if</span> <span class="k2">(</span>need_to_redraw <span class="k3">=</span><span class="k3">=</span> <span class="n">1</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k3">!</span>background_mode<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 34</span>      draw_framework<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 35</span>      need_to_redraw <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 36</span>   <span class="k2">}</span>
<span class="number"> 37</span>
<span class="number"> 38</span>   <span class="c">/* Check if the user pressed the close icon. */</span>
<span class="number"> 39</span>   done <span class="k3">=</span> done <span class="k3">|</span><span class="k3">|</span> closed<span class="k2">;</span>
<span class="number"> 40</span>
<span class="number"> 41</span><span class="k2">}</span>
</div></div><p>

That&#39;s ugly, and it depends on a bunch of globals.</p><p>Basically, it&#39;s 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">/* Do the main loop; until we're not done. */</span>
<span class="number">  2</span><span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span>done<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  3</span>
<span class="number">  4</span>   <span class="k1">do</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> event<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>event_queue, <span class="k3">&amp;</span>event<span class="k2">)</span><span class="k2">;</span>
<span class="number">  7</span>
<span class="number">  8</span>      HandleEvent<span class="k2">(</span>event<span class="k2">)</span><span class="k2">;</span>
<span class="number">  9</span>   <span class="k2">}</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>event_queue<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 10</span>
<span class="number"> 11</span>   <span class="c">/* Check if the timer has ticked. */</span>
<span class="number"> 12</span>   <span class="k1">while</span> <span class="k2">(</span>timer <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 13</span>      <span class="k3">-</span><span class="k3">-</span>timer<span class="k2">;</span>
<span class="number"> 14</span>      Update<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span>      redraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 16</span>   <span class="k2">}</span>
<span class="number"> 17</span>   <span class="k1">if</span> <span class="k2">(</span>redraw<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 18</span>      draw_framework<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span>      redraw <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 20</span>   <span class="k2">}</span>
<span class="number"> 21</span><span class="k2">}</span>
</div></div><p>

Which is much cleaner and easier to understand. It&#39;s your basic A5 game loop.</p><p>Third, we have Cosmic Protector : <a href="https://github.com/liballeg/allegro5/blob/6017bed18585146d2499aa0a13709f975a9bb047/demos/cosmic_protector/src/logic.cpp#L52-L67">https://github.com/liballeg/allegro5/blob/6017bed18585146d2499aa0a13709f975a9bb047/demos/cosmic_protector/src/logic.cpp#L52-L67</a></p><p>And, I can&#39;t follow that or even find main, so I&#39;m not gonna try.</p><p>Skater wins.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Fri, 25 Jan 2019 22:58:04 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Actually, the SPEED loop is an Allegro 4 loop.  The original was written for a Speed Hack by Shawn himself. To include it as an example to the newer Allegro they wrote a sort of &quot;wrap layer&quot; to <i>simulate</i> Allegro 4, defined in file <a href="https://github.com/liballeg/allegro5/blob/6017bed18585146d2499aa0a13709f975a9bb047/demos/speed/a4_aux.h">a4_aux.h</a> and implemented in file <a href="https://github.com/liballeg/allegro5/blob/6017bed18585146d2499aa0a13709f975a9bb047/demos/speed/a4_aux.c">a4_aux.c</a>. It is an example about how to implement an old-school game system.</p><p>Also, you have more ways to work with the game loop.  Since my game engine is component based, my game loop is quite simpler than those, but of course it needs <a href="https://sourceforge.net/p/mingro/code/HEAD/tree/TRUNK/src/engine/mngevents.pas">a lot of &quot;behind the scene&quot; work</a>.</p><p>SourceForge doesn&#39;t have a fancy way to show code, so I just copypaste it here from <a href="https://sourceforge.net/p/mingro/code/HEAD/tree/TRUNK/src/engine/mnggame.pas#1166">mnggame.pas</a>:
</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"> 1164</span>    <span class="k2">{</span> Game loop. <span class="k2">}</span>
<span class="number"> 1165</span>      SELF.Log <span class="k2">(</span>etDebug, GAME_LOOP_START<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 1166</span>      fTimer.Start<span class="k2">;</span>
<span class="number"> 1167</span>      REPEAT
<span class="number"> 1168</span>        TRY
<span class="number"> 1169</span>          fEventManager.Poll
<span class="number"> 1170</span>        EXCEPT
<span class="number"> 1171</span>          ON E: Exception DO HandleException <span class="k2">(</span>E<span class="k2">)</span>
<span class="number"> 1172</span>        END
<span class="number"> 1173</span>      UNTIL fTerminated<span class="k2">;</span>
<span class="number"> 1174</span>      fTimer.Stop<span class="k2">;</span>
<span class="number"> 1175</span>      SELF.Log <span class="k2">(</span>etDebug, GAME_LOOP_END<span class="k2">)</span><span class="k2">;</span>
</div></div><p>

Simple explanation, each component that needs Allegro events just registers itself into the fEventManager and the Poll method just manages it.  The fTimer object, for example, is one of these components, and it not just updates the clock but also calls the appropriate methods to update the game and render the stuff on screen.  But it is quite more complex actually.</p><p>Anyway, <b>I think there&#39;s no one best way to do it</b>.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Niunio)</author>
		<pubDate>Sat, 26 Jan 2019 00:56:57 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I don&#39;t suppose there&#39;s a single best way that can be copied and pasted into every project. But if you look at what Edgar did, he was able to distill out the essence of each alternative.</p><p>In Cosmic Protector, the main loop looks like
</p><div class="source-code snippet"><div class="inner"><pre> repeat <span class="k2">{</span>
  delta <span class="k3">=</span> time_since_last_frame
  logic<span class="k2">(</span>delta<span class="k2">)</span> 
  render<span class="k2">(</span>delta<span class="k2">)</span> 
  <a href="http://www.delorie.com/djgpp/doc/libc/libc_613.html" target="_blank">pause</a> <span class="k1">for</span> <span class="n">1</span><span class="k3">/</span><span class="n">60</span> second
<span class="k2">}</span>
</pre></div></div><p>
and the &#39;logic&#39; is
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">while</span> <span class="k2">(</span>event queue <span class="k1">not</span> empty<span class="k2">)</span> <span class="k2">{</span>
 get event
 process event
<span class="k2">}</span>
</pre></div></div><p>
and the only events it&#39;s interested in are display close and switch out.</p><p>That timer-less approach is quite common in code I have seen.</p><p>Most code seems to use variations on the Skater loop, which uses a timer.</p><div class="source-code snippet"><div class="inner"><pre>repeat <span class="k2">{</span>
  repeat <span class="k2">{</span>
   get event
   <span class="k1">if</span> timer event then update <span class="k3">=</span> <span class="k1">true</span>
  <span class="k2">}</span> until <span class="k2">(</span>queue is empty<span class="k2">)</span>
  <span class="k1">if</span> update <span class="k2">{</span>
   logic
   redraw
  <span class="k2">}</span>
<span class="k2">}</span>
</pre></div></div><p>
(with the possible refinement of handling &gt; 1 timer event per batch of events)</p><p>There are also <span class="source-code"><a href="http://www.allegro.cc/manual/al_wait_for_event_timed"><span class="a">al_wait_for_event_timed</span></a></span> and <span class="source-code"><a href="http://www.allegro.cc/manual/al_wait_for_event_until"><span class="a">al_wait_for_event_until</span></a></span> which I don&#39;t think I have seen used anywhere, but they ought to be usable to control timing in an event loop.</p><p>Finally there are the bad ones
</p><div class="source-code snippet"><div class="inner"><pre>repeat <span class="k2">{</span>
 get event
 process event
 logic
 redraw
<span class="k2">}</span>
</pre></div></div><p>
and 
</p><div class="source-code snippet"><div class="inner"><pre>repeat <span class="k2">{</span>
 <a href="http://www.delorie.com/djgpp/doc/libc/libc_858.html" target="_blank">wait</a> <span class="k1">for</span> event
 process event
 logic 
 redraw
<span class="k2">}</span>
</pre></div></div><p>
which need no further discussion!</p><p><b>EDIT</b>:<br />Coincidentally this appeared on the front page of Hacker News this morning but I haven&#39;t been bothered to read it yet.<br /><a href="http://gameprogrammingpatterns.com/game-loop.html">http://gameprogrammingpatterns.com/game-loop.html</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Hull)</author>
		<pubDate>Sun, 27 Jan 2019 15:52:07 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>What about frame skipping and different logic and rendering rates? We should discuss those too.</p><p>Logical frame skipping is simple. Only run one update, even if there are multiple timer events. Ignoring them will make your game slow down gracefully and you will see every update on the screen. However, sometimes you don&#39;t want your game to slow down. You can run multiple logic updates per render call, and then your game will run the same <i>speed</i> on every computer if you&#39;re using a timer. However, this may lead to teleportation if it takes longer to process logic than you have time available after setting a rendering rate.</p><p>My personal preference is to drop all timer events after the first. I&#39;d rather the game slow down if the computer can&#39;t handle it. Then I can see whether or not my hardware is good enough to run it.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Mon, 28 Jan 2019 04:29:56 +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/617709/1041027#target">Edgar Reynaldo</a> said:</div><div class="quote"><p> What about frame skipping and different logic and rendering rates? We should discuss those too.
</p></div></div><p>Yes; some games (maybe the more &#39;vector-ish&#39; ones, like flight sims, might suit that)</p><p>Also, in the code above
</p><div class="source-code snippet"><div class="inner"><pre>   <span class="k1">do</span> <span class="k2">{</span>
      <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> event<span class="k2">;</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>event<span class="k2">)</span><span class="k2">;</span>

      HandleEvent<span class="k2">(</span>event<span class="k2">)</span><span class="k2">;</span>
   <span class="k2">}</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>event_queue<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
is there a chance that the queue will <i>never</i> be empty (say if you whizzed the mouse about continually) and so the loop will never run?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Hull)</author>
		<pubDate>Thu, 31 Jan 2019 00:58:46 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>A mouse has a refresh rate up to 1000hz, I don&#39;t think a mouse event handler couldn&#39;t run under 0.001 seconds. I suppose if some of the event handlers do take a lot of time the loop could potentially not finish.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (l j)</author>
		<pubDate>Thu, 31 Jan 2019 03:45:31 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ve never been able to whizz the mouse around fast enough to make the rendering pause or stutter. Don&#39;t think it&#39;s likely under normal circumstances.</p><p>If you were feeling paranoid, you could set a limit on the max number of events to handle at once, but then you get events piling up sometimes.</p><p>I know if you try to render once for every mouse event you&#39;re gonna feel the pain, because most screens don&#39;t update as fast as the mouse.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Thu, 31 Jan 2019 05:01:32 +0000</pubDate>
	</item>
</rss>
