<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Porting from Allegro 4.4 to 5.0</title>
		<link>http://www.allegro.cc/forums/view/615454</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Fri, 19 Jun 2015 19:08:38 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m student and I just finished my 2nd year in computer engineering and I&#39;m working for my teacher for the summer and one of the task he gave me was to port a game from Allegro 4.4 to Allegro 5.0. He don&#39;t know anything about Allegro and the person who code the game (let&#39;s call him John) left so I have no reference at all. The game is 4 automated robot fighting with lasers and missiles and the student have to code their behaviour using C. As of now I think I did everything right using Allegro 4.4 and Allegro 5.0 User guide but there is some question I have that I can&#39;t seem to find any answer so I&#39;ll ask them here.</p><p>First : timers</p><p>In Allegro 4.4 John use LOCK_VARIABLE and LOCK_FUNCTION which from what I understand are needed in Allegro 4.4 for timers and are not used in Allegro 5.0 anymore. He also use install_int_ex function.</p><p>My question is : Do install_int_ex do the same thing as al_create_timer(timerName)? What does the LOCK function did in Allegro 4.4?</p><p>Here is the code:</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">volatile</span> <span class="k1">int</span> calcCounter <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  2</span><span class="k1">volatile</span> <span class="k1">int</span> calcsCompleted <span class="k3">=</span> <span class="n">0</span>, cps <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  3</span><span class="k1">volatile</span> <span class="k1">int</span> frameCounter <span class="k3">=</span> <span class="n">0</span>, fps <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  4</span>
<span class="number">  5</span><span class="k1">void</span> FPSTimer<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  6</span>  fps <span class="k3">=</span> frameCounter<span class="k2">;</span>
<span class="number">  7</span>  frameCounter <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  8</span>  cps <span class="k3">=</span> calcsCompleted<span class="k2">;</span>
<span class="number">  9</span>  calcsCompleted <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 10</span><span class="k2">}</span>
<span class="number"> 11</span>
<span class="number"> 12</span><span class="k1">void</span> AddCalc<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 13</span>  calcCounter<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 14</span><span class="k2">}</span>
<span class="number"> 15</span>  <a href="http://www.allegro.cc/manual/LOCK_VARIABLE"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>calcCounter<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span>  <a href="http://www.allegro.cc/manual/LOCK_VARIABLE"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>calcsCompleted<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 17</span>  <a href="http://www.allegro.cc/manual/LOCK_VARIABLE"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>cps<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 18</span>  <a href="http://www.allegro.cc/manual/LOCK_VARIABLE"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>frameCounter<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span>  <a href="http://www.allegro.cc/manual/LOCK_FUNCTION"><span class="a">LOCK_FUNCTION</span></a><span class="k2">(</span>fps<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 20</span>  <a href="http://www.allegro.cc/manual/LOCK_FUNCTION"><span class="a">LOCK_FUNCTION</span></a><span class="k2">(</span>AddCalc<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 21</span>
<span class="number"> 22</span>  <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/install_int_ex"><span class="a">install_int_ex</span></a><span class="k2">(</span>AddCalc, BPS_TO_TIMER<span class="k2">(</span>CALCS_PER_SEC<span class="k2">)</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span>
<span class="number"> 23</span>    AbortOnError<span class="k2">(</span>
<span class="number"> 24</span>        <span class="s">"Fight() failed to create calcs timer.\nProgram will exit."</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 25</span>
<span class="number"> 26</span>  <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/install_int_ex"><span class="a">install_int_ex</span></a><span class="k2">(</span>FPSTimer, SECS_TO_TIMER<span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span>
<span class="number"> 27</span>    AbortOnError<span class="k2">(</span><span class="s">"Fight() failed to create FPS timer.\nProgram will exit."</span><span class="k2">)</span><span class="k2">;</span>
</div></div><p>


Second : floodfill</p><p>Floodfill was a function in Allegro 4.4 that did the same thing the fill bucket do in MSpaint.<br /><span class="source-code"><a href="http://www.allegro.cc/manual/floodfill"><span class="a">floodfill</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP"><span class="a">BITMAP</span></a> targetBitmap, <span class="k1">int</span> x, <span class="k1">int</span> y, <span class="k1">int</span> color<span class="k2">)</span><span class="k2">;</span></span><br />I did find a solution on the forum but the person told that it use alot of memory to draw pixel by pixel on a BITMAP. </p><p>My question : Is there any way to implement this function without using too much memory?</p><p>Third and last : do_line</p><p>This one is trickier. This function calculate all the point on a line and do a function along this line. In the game this is use to check if there is a something along a line sensor. If so the line stop at the first pixel it encounter that is not the background color.<br /><span class="source-code"><span class="k1">void</span> <a href="http://www.allegro.cc/manual/do_line"><span class="a">do_line</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP"><span class="a">BITMAP</span></a> <span class="k3">*</span>bmp, <span class="k1">int</span> x1, y1, x2, y2, <span class="k1">int</span> d, <span class="k1">void</span> <span class="k2">(</span><span class="k3">*</span>proc<span class="k2">)</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP"><span class="a">BITMAP</span></a> <span class="k3">*</span>bmp, <span class="k1">int</span> x, <span class="k1">int</span> y, <span class="k1">int</span> d<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></span></p><p>My question : Is there a way to do this? If not how should I do it using a minimum of memory.</p><p>*Sorry for my English.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Francis Langlais)</author>
		<pubDate>Tue, 16 Jun 2015 19:38:54 +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/615454/1014010#target">Francis Langlais</a> said:</div><div class="quote"><p>
First : timers</p><p>In Allegro 4.4 John use LOCK_VARIABLE and LOCK_FUNCTION which from what I understand are needed in Allegro 4.4 for timers and are not used in Allegro 5.0 anymore. He also use install_int_ex function.</p><p>My question is : Do install_int_ex do the same thing as al_create_timer(timerName)? What does the LOCK function did in Allegro 4.4?
</p></div></div><p>
You don&#39;t need to worry about locking any functions or data with Allegro 5, unless you&#39;re working with bitmap data directly, but there are functions for that.</p><p>install_int_ex doesn&#39;t do the same thing as al_create_timer. It installs a call back function that gets called every time the timer ticks. You can do the same thing in allegro 5 by doing this :
</p><div class="source-code snippet"><div class="inner"><pre>al_register_event_queue<span class="k2">(</span>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>timer<span class="k2">)</span><span class="k2">;</span>
<span class="c">//...</span>
<a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> ev<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>queue , <span class="k3">&amp;</span>ev<span class="k2">)</span><span class="k2">;</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="c">/// Put the code from install_int_ex inside here for the same effect</span>
   <span class="c">/// Eg...</span>
   <span class="c">/// ++count;</span>
<span class="k2">}</span>
</pre></div></div><p>

</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Third and last : do_line
</p></div></div><p>
This one is harder but can still be done using <span class="source-code"><a href="http://www.allegro.cc/manual/al_draw_soft_line"><span class="a">al_draw_soft_line</span></a></span>. I can&#39;t give you the exact details though.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Tue, 16 Jun 2015 20:05:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thank you! That help a lot for the timer.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Francis Langlais)</author>
		<pubDate>Tue, 16 Jun 2015 20:18:18 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Check out these for some differences between the two library versions:</p><p><a href="https://wiki.allegro.cc/index.php?title=Porting_from_A4_to_A5">https://wiki.allegro.cc/index.php?title=Porting_from_A4_to_A5</a></p><p><a href="https://www.allegro.cc/forums/thread/610896/964091">https://www.allegro.cc/forums/thread/610896/964091</a></p><p><a href="http://stackoverflow.com/questions/6418757/porting-allegro-4-to-allegro-5">http://stackoverflow.com/questions/6418757/porting-allegro-4-to-allegro-5</a></p><p>I&#39;m not sure if this is helpful, or rambling and confusing, so if the latter, feel free to disregard:</p><p>Basically, in Allegro 4, everything was double buffered (draw everything to a memory bitmap, and then when you&#39;re entirely done, blit that to the screen at the right time with vsync so it doesn&#39;t flicker) or page flipped. (Rare, everything is in video memory and VRAM-to-VRAM copied to a off-screen page of VRAM. Then when ready, change the videocard&#39;s &quot;screen&quot; to point to that new page. It uses two pages, and they are flipped between each other.) </p><p>I believe Allegro 5 is page flipped because modern Direct3D and OpenGL do that. Allegro is a thin layer over those. Whereas Allegro 4 had to &quot;re-invent the wheel&quot; with specific routines for everything because in general, there were no frameworks for that.</p><p>There are two ways to do things: </p><p>The old way, you either used double buffering (everyhthing was kept locally in RAM), or page flipping (everything in VRAM so it&#39;s hardware accelerated 2-D if the card supports it.). </p><p>The new way goes through OpenGL/DirectX, which then go through the native graphics driver. So instead of fiddling with registers, you&#39;re calling API&#39;s which call driver API&#39;s which say &quot;draw this please.&quot; Everything is in a texture, and Allegro bitmaps are tied to textures with some additional helper information around them.</p><p>[This paragraph can be skipped:]<br />The new way also has the &quot;Fixed/Classic Pipeline&quot; (~1995-2005) vs &quot;Modern Pipeline&quot; (~2005 onward). Classic pipeline used to be faster because it was set-in-stone. Shaders were for special things, and the fixed pipeline did everything else like vertex transformation. The modern pipeline let you (and forced you!) to use shaders for everything. Without a shader, you don&#39;t get anything on the screen. These days, the fixed pipeline forces the card into compatibility mode. It&#39;s slower, but still 1000&#39;s of times faster than your traditional old videocards. IIRC, Allegro normally runs in fixed mode, and that&#39;s fine for 2-D games. But if you go on, you&#39;ll want to look into the details of this.</p><p>They already mentioned that A4 used timers, A5 uses event queues.</p><p>Allegro 5 uses event queues for everything. They&#39;re not too hard, but they&#39;re different, so read up on them. You&#39;re just running an event handler that checks if any events are on the event queue, and if so, it deals with them. That&#39;s it. But if you&#39;re careful, you can still structure a game like Allegro 4 without an event handler, so it should be relatively easy to port an A4 game to A5 without ripping out the core logic.</p><p>[edit]</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/615454/1014010#target">Francis Langlais</a> said:</div><div class="quote"><p>
My question : Is there a way to do this? If not how should I do it using a minimum of memory.
</p></div></div><p>
I don&#39;t recall the solution to your problem off-the-top of my head, but don&#39;t worry about using &quot;minimum amounts of memory.&quot; Memory is cheap. Super cheap. Use whatever solution makes sense. It&#39;s unlikely you&#39;ll be wasting too much memory.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
*Sorry for my English.
</p></div></div><p>
Don&#39;t worry about it. I definitely had far worse English when I started here.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Chris Katko)</author>
		<pubDate>Tue, 16 Jun 2015 22:39:36 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>For an event source of a timer, do I have to clear the event queue after a tick or is every tick a new event? </p><p>I just don&#39;t understand when to clear my event queue or not.</p><p>Also, I don&#39;t want the whole game to wait for that timer (I guess, still not sure about that). Is there a way to store the present event into <span class="source-code"><a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> ev<span class="k2">;</span></span> without stopping the program and wait for it?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Francis Langlais)</author>
		<pubDate>Wed, 17 Jun 2015 18:15:14 +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/615454/1014036#target">Francis Langlais</a> said:</div><div class="quote"><p>
For an event source of a timer, do I have to clear the event queue after a tick or is every tick a new event? 
</p></div></div><p>
No, when you call <span class="source-code"><a href="http://www.allegro.cc/manual/al_wait_for_event"><span class="a">al_wait_for_event</span></a></span> or you call <span class="source-code"><a href="http://www.allegro.cc/manual/al_get_next_event"><span class="a">al_get_next_event</span></a></span> and it returns true, then the event is taken off the queue. So every tick is a new event, and it ticks at the rate you set with <span class="source-code"><a href="http://www.allegro.cc/manual/al_create_timer"><span class="a">al_create_timer</span></a></span>.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Also, I don&#39;t want the whole game to wait for that timer (I guess, still not sure about that). Is there a way to store the present event into ALLEGRO_EVENT ev; without stopping the program and wait for it? 
</p></div></div><p>
Yes, see <span class="source-code"><a href="http://www.allegro.cc/manual/al_get_next_event"><span class="a">al_get_next_event</span></a></span> or <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> or <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>.</p><p>Typically the input loop 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><a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_QUEUE"><span class="a">ALLEGRO_EVENT_QUEUE</span></a><span class="k3">*</span> 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">  2</span><span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>queue<span class="k2">)</span> <span class="k2">{</span><span class="k1">return</span> <span class="n">1</span><span class="k2">;</span><span class="k2">}</span>
<span class="number">  3</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>queue , <a href="http://www.allegro.cc/manual/al_get_keyboard_event_source"><span class="a">al_get_keyboard_event_source</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  4</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>queue , <a href="http://www.allegro.cc/manual/al_get_mouse_event_source"><span class="a">al_get_mouse_event_source</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  5</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>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">  6</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>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>timer<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  7</span>
<span class="number">  8</span><span class="c">// Input loop</span>
<span class="number">  9</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"> 10</span>   <span class="k1">if</span> <span class="k2">(</span>redraw<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 11</span>      <span class="c">// redraw</span>
<span class="number"> 12</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"> 13</span>      redraw <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 14</span>   <span class="k2">}</span>
<span class="number"> 15</span>
<span class="number"> 16</span>   <span class="k1">do</span> <span class="k2">{</span>
<span class="number"> 17</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"> 18</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>queue , <span class="k3">&amp;</span>ev<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</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"> 20</span>         <span class="c">// do some timed action</span>
<span class="number"> 21</span>         redraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 22</span>      <span class="k2">}</span>
<span class="number"> 23</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"> 24</span>         quit <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 25</span>         <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 26</span>      <span class="k2">}</span>
<span class="number"> 27</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>queue<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 28</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Wed, 17 Jun 2015 21:43:05 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ok so I think I understand.</p><p>In the example Edgar mentioned with the input loop, you have the <span class="source-code"><span class="k1">if</span><span class="k2">(</span>redraw<span class="k2">)</span></span> loop that redraw the whole scene every time the while start. Does that make it the FPS of my program?</p><p>Because as I say earlier, that was code using Allegro 4.4 and I think all the structure of the program is now wrong because of it. So should I try to match the example or should I just keep it as it is?</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">int</span> main<span class="k2">(</span><span class="k1">int</span> argc, <span class="k1">char</span> <span class="k3">*</span>argv<span class="k2">[</span><span class="k2">]</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  2</span>  ROBOTCOLORS colours<span class="k2">[</span><span class="n">4</span><span class="k2">]</span> <span class="k3">=</span> <span class="k2">{</span> ROBOT_RED, ROBOT_GREEN, ROBOT_YELLOW,
<span class="number">  3</span>      ROBOT_PURPLE <span class="k2">}</span><span class="k2">;</span>
<span class="number">  4</span>  <span class="k1">int</span> cnt<span class="k2">;</span>
<span class="number">  5</span>
<span class="number">  6</span>  ProcessCommandLine<span class="k2">(</span>argc, argv<span class="k2">)</span><span class="k2">;</span>
<span class="number">  7</span>  InitCompetition<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  8</span>
<span class="number">  9</span>  <span class="k1">for</span> <span class="k2">(</span>cnt <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> cnt <span class="k3">&lt;</span> numInCompetition<span class="k2">;</span> cnt<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 10</span>    <span class="k2">(</span><span class="k3">*</span>fpREG<span class="k2">[</span>registeredRobots<span class="k2">[</span>cnt<span class="k2">]</span><span class="k2">]</span><span class="k2">)</span><span class="k2">(</span>colours<span class="k2">[</span>cnt<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span>  <span class="k2">}</span>
<span class="number"> 12</span>
<span class="number"> 13</span>  Fight<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 14</span>  EndCompetition<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span>
<span class="number"> 16</span>  <span class="k1">return</span> EXIT_SUCCESS<span class="k2">;</span>
<span class="number"> 17</span><span class="k2">}</span>
</div></div><p>

This is my main and the action is in the <span class="source-code">Fight<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></span> function.<br />At the moment I have an event queue for my graphic when I draw everything and I have another one where I use the timer and my keyboard input.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Francis Langlais)</author>
		<pubDate>Wed, 17 Jun 2015 22:12:26 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>What does the Fight() function look like? I&#39;m not sure how you want to do it without seeing that first. Isn&#39;t there a loop somewhere?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Wed, 17 Jun 2015 23:09:42 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><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">void</span> Fight<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  2</span>  <span class="k1">int</span> calcsUntilOrders <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  3</span>  <span class="k1">char</span> systemMessage<span class="k2">[</span><span class="n">255</span><span class="k2">]</span> <span class="k3">=</span> <span class="s">""</span><span class="k2">;</span>
<span class="number">  4</span>  ROBOT <span class="k3">*</span>robot<span class="k2">;</span>
<span class="number">  5</span>
<span class="number">  6</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">  7</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">  8</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_TIMER"><span class="a">ALLEGRO_TIMER</span></a> <span class="k3">*</span>FramePerSecondTimer<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>AddCalcTimer<span class="k2">;</span>
<span class="number"> 10</span>
<span class="number"> 11</span>  AddCalcTimer <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="k3">/</span> <span class="n">60</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 12</span>  FramePerSecondTimer <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="k2">)</span><span class="k2">;</span>
<span class="number"> 13</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"> 14</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_keyboard_event_source"><span class="a">al_get_keyboard_event_source</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</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,
<span class="number"> 16</span>      <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>FramePerSecondTimer<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 17</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,
<span class="number"> 18</span>      <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>AddCalcTimer<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span>
<span class="number"> 20</span>  <a href="http://www.allegro.cc/manual/al_get_next_event"><span class="a">al_get_next_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"> 21</span>  <span class="k1">if</span> <span class="k2">(</span>event.timer.source <span class="k3">=</span><span class="k3">=</span> AddCalcTimer<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 22</span>    AddCalc<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="number"> 25</span>  <span class="k1">if</span> <span class="k2">(</span>event.timer.source <span class="k3">=</span><span class="k3">=</span> FramePerSecondTimer<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 26</span>    FPSTimer<span class="k2">(</span><span class="k2">)</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="k1">while</span> <span class="k2">(</span>event.keyboard.keycode <span class="k3">!</span><span class="k3">=</span> ALLEGRO_KEY_SPACE<span class="k2">)</span>
<span class="number"> 30</span>    <span class="k2">;</span>  <span class="c">//Wait for screen to initialize before starting.</span>
<span class="number"> 31</span>
<span class="number"> 32</span>  theGame.state <span class="k3">=</span> GS_FIGHTING<span class="k2">;</span>
<span class="number"> 33</span>
<span class="number"> 34</span>  <span class="k1">while</span> <span class="k2">(</span>event.keyboard.keycode <span class="k3">!</span><span class="k3">=</span> ALLEGRO_KEY_ESCAPE<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 35</span>
<span class="number"> 36</span>    <span class="k1">if</span> <span class="k2">(</span>event.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_KEY_DOWN<span class="k2">)</span>     <span class="c">//Check for relevant keys.</span>
<span class="number"> 37</span>        <span class="k2">{</span>
<span class="number"> 38</span>      <span class="k1">if</span> <span class="k2">(</span>event.keyboard.keycode <span class="k3">=</span><span class="k3">=</span> <span class="s">'r'</span> <span class="k3">|</span><span class="k3">|</span> event.keyboard.keycode <span class="k3">=</span><span class="k3">=</span> <span class="s">'R'</span><span class="k2">)</span> <span class="c">//User wants re-randomized loc's.</span>
<span class="number"> 39</span>        ForeachLL_M<span class="k2">(</span>robotList, robot<span class="k2">)</span>
<span class="number"> 40</span>        <span class="k2">{</span>
<span class="number"> 41</span>          ChooseRandomLocation<span class="k2">(</span>robot<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 42</span>          robot-&gt;heading <span class="k3">=</span> GetRandomNumber<span class="k2">(</span><span class="n">360</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="k2">}</span>
<span class="number"> 45</span>
<span class="number"> 46</span>    <span class="k1">while</span> <span class="k2">(</span>calcCounter<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 47</span>      calcCounter--<span class="k2">;</span>
<span class="number"> 48</span>      calcsUntilOrders<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 49</span>
<span class="number"> 50</span>      UpdateEnergySystems<span class="k2">(</span>robotList<span class="k2">)</span><span class="k2">;</span>           <span class="c">//Do first so we know what</span>
<span class="number"> 51</span>                            <span class="c">//systems are powered.</span>
<span class="number"> 52</span>      MoveRobots<span class="k2">(</span>robotList<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 53</span>      DrawRobotBitmaps<span class="k2">(</span>robotList<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 54</span>      CheckRobotCollisions<span class="k2">(</span><span class="k3">&amp;</span>theGame, robotList<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 55</span>
<span class="number"> 56</span>      MoveWeapons<span class="k2">(</span>weaponList<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 57</span>      CheckWeaponCollisions<span class="k2">(</span><span class="k3">&amp;</span>theGame, robotList, weaponList<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 58</span>
<span class="number"> 59</span>      <span class="c">//Now that collisions are</span>
<span class="number"> 60</span>      ApplyDamage<span class="k2">(</span><span class="k3">&amp;</span>theGame, robotList, deadRobotList<span class="k2">)</span><span class="k2">;</span> <span class="c">//done and weapons have</span>
<span class="number"> 61</span>                               <span class="c">//hit, we apply damage.</span>
<span class="number"> 62</span>
<span class="number"> 63</span>      DrawSensorBitmaps<span class="k2">(</span>robotList<span class="k2">)</span><span class="k2">;</span>          <span class="c">//Need to draw BEFORE data is</span>
<span class="number"> 64</span>                           <span class="c">//updated because bimaps are</span>
<span class="number"> 65</span>                           <span class="c">//used in collision detection.</span>
<span class="number"> 66</span>      UpdateSensorData<span class="k2">(</span>robotList<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 67</span>
<span class="number"> 68</span>      UpdateParticles<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 69</span>
<span class="number"> 70</span>      calcsCompleted<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 71</span>
<span class="number"> 72</span>      <span class="k1">if</span> <span class="k2">(</span>calcsUntilOrders <span class="k3">=</span><span class="k3">=</span> ORDER_FREQ<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 73</span>        calcsUntilOrders <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 74</span>        ForeachLL_M<span class="k2">(</span>robotList, curRobot<span class="k2">)</span>
<span class="number"> 75</span>          curRobot-&gt;ActionsFunction<span class="k2">(</span>TURN_TIME<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 76</span>      <span class="k2">}</span>
<span class="number"> 77</span>
<span class="number"> 78</span>      <span class="k1">if</span> <span class="k2">(</span>theGame.useSounds<span class="k2">)</span>
<span class="number"> 79</span>        PlaySounds<span class="k2">(</span><span class="k3">&amp;</span>theGame<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 80</span>
<span class="number"> 81</span>    <span class="k2">}</span>
<span class="number"> 82</span>
<span class="number"> 83</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_737.html" target="_blank">sprintf</a><span class="k2">(</span>systemMessage, <span class="s">"FPS: %d  CPS: %d"</span>, fps, cps<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 84</span>    RenderScene<span class="k2">(</span>robotList, deadRobotList, weaponList, systemMessage<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 85</span>    frameCounter<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 86</span>  <span class="k2">}</span>
<span class="number"> 87</span><span class="k2">}</span>
</div></div><p>

That&#39;s the whole Fight function. It&#39;s where everything happens except for initializing/de-initializing everything.</p><p>The main difference I see with your example is that I draw everything at the end of my loop inside <span class="source-code">Fight<span class="k2">(</span><span class="k2">)</span></span>.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Francis Langlais)</author>
		<pubDate>Thu, 18 Jun 2015 18:09:09 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Allegro 5 is event based. You need to check for events inside a loop, because they will keep coming. You can&#39;t just check for an event once, and then expect it to change.</p><p>Also, you need to make sure the event type matches the data you are trying to get out of it.</p><p>Ie.
</p><div class="source-code snippet"><div class="inner"><pre><span class="c">// This loop will check for all current events</span>
<span class="k1">while</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_next_event"><span class="a">al_get_next_event</span></a><span class="k2">(</span>queue , <span class="k3">&amp;</span>ev<span class="k2">)</span> <span class="k2">{</span>
   <span class="k1">if</span> <span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_KEY_DOWN<span class="k2">)</span> <span class="k2">{</span>
      <span class="c">// Now it's okay to access the keyboard member, because we know it's a keyboard event</span>
      <span class="k1">if</span> <span class="k2">(</span>ev.keyboard.keycode <span class="k3">=</span><span class="k3">=</span> ALLEGRO_KEY_R<span class="k2">)</span> <span class="k2">{</span>
         <span class="c">// do stuff</span>
      <span class="k2">}</span>
   <span class="k2">}</span>
<span class="k2">}</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Thu, 18 Jun 2015 20:24:37 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>That will also spin the loop needlessly.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Fri, 19 Jun 2015 06:04:22 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I realize that. <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /> I&#39;m just trying to explain the basics of using a loop to process all the events. If you look at my earlier example it uses al_wait_for_event. He didn&#39;t seem to fully grasp that model yet so I tried to use a simpler version to explain things. That&#39;s all. <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Fri, 19 Jun 2015 19:08:38 +0000</pubDate>
	</item>
</rss>
