<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>timing animation again</title>
		<link>http://www.allegro.cc/forums/view/599116</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Fri, 13 Feb 2009 10:46:04 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>

hi,</p><p> here&#39;s my game loop :-</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td>&#160;</td></tr><tr><td class="number">2</td><td><span class="k1">while</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_ESC<span class="k2">]</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> play_state <span class="k3">=</span><span class="k3">=</span> PLAYING<span class="k2">)</span></td></tr><tr><td class="number">3</td><td>      <span class="k2">{</span></td></tr><tr><td class="number">4</td><td>         logic_calls <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">5</td><td>         <span class="k1">while</span><span class="k2">(</span>ticks <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">6</td><td>         <span class="k2">{</span></td></tr><tr><td class="number">7</td><td>            <a href="http://www.allegro.cc/manual/rest" target="_blank"><span class="a">rest</span></a><span class="k2">(</span><span class="n">100</span> <span class="k3">/</span> updates_per_second<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">8</td><td>         <span class="k2">}</span></td></tr><tr><td class="number">9</td><td>&#160;</td></tr><tr><td class="number">10</td><td>         <span class="k1">while</span><span class="k2">(</span>ticks <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">11</td><td>         <span class="k2">{</span></td></tr><tr><td class="number">12</td><td>               old_ticks <span class="k3">=</span> ticks<span class="k2">;</span></td></tr><tr><td class="number">13</td><td>&#160;</td></tr><tr><td class="number">14</td><td>               <span class="k3">+</span><span class="k3">+</span>logic_calls<span class="k2">;</span></td></tr><tr><td class="number">15</td><td>&#160;</td></tr><tr><td class="number">16</td><td>               <span class="k1">if</span><span class="k2">(</span>hero.opening_door <span class="k3">=</span><span class="k3">=</span> OPENING<span class="k2">)</span></td></tr><tr><td class="number">17</td><td>               <span class="k2">{</span></td></tr><tr><td class="number">18</td><td>                   <span class="k1">if</span><span class="k2">(</span>door_opening_info.anim_delay_counter <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">19</td><td>                   <span class="k2">{</span></td></tr><tr><td class="number">20</td><td>                       <span class="k3">-</span><span class="k3">-</span>door_opening_info.anim_delay_counter<span class="k2">;</span></td></tr><tr><td class="number">21</td><td>                       door_opening_info.draw <span class="k3">=</span> DONT_DRAW<span class="k2">;</span></td></tr><tr><td class="number">22</td><td>                   <span class="k2">}</span></td></tr><tr><td class="number">23</td><td>                   <span class="k1">else</span></td></tr><tr><td class="number">24</td><td>                   <span class="k2">{</span></td></tr><tr><td class="number">25</td><td>                       door_opening_info.draw <span class="k3">=</span> DRAW<span class="k2">;</span></td></tr><tr><td class="number">26</td><td>                       door_opening_info.anim_delay_counter <span class="k3">=</span> door_opening_info.anim_ticks_per_frame<span class="k2">;</span></td></tr><tr><td class="number">27</td><td>                   <span class="k2">}</span></td></tr><tr><td class="number">28</td><td>               <span class="k2">}</span></td></tr><tr><td class="number">29</td><td>&#160;</td></tr><tr><td class="number">30</td><td>               <span class="k1">if</span><span class="k2">(</span>hero.anim_delay_counter <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">31</td><td>               <span class="k2">{</span></td></tr><tr><td class="number">32</td><td>                   <span class="k3">-</span><span class="k3">-</span>hero.anim_delay_counter<span class="k2">;</span></td></tr><tr><td class="number">33</td><td>                   hero.update <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">34</td><td>               <span class="k2">}</span></td></tr><tr><td class="number">35</td><td>               <span class="k1">else</span></td></tr><tr><td class="number">36</td><td>               <span class="k2">{</span></td></tr><tr><td class="number">37</td><td>                   hero.update <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">38</td><td>                   hero.anim_delay_counter <span class="k3">=</span> hero.anim_ticks_per_frame<span class="k2">;</span></td></tr><tr><td class="number">39</td><td>               <span class="k2">}</span></td></tr><tr><td class="number">40</td><td>&#160;</td></tr><tr><td class="number">41</td><td>&#160;</td></tr><tr><td class="number">42</td><td>               do_non_drawing<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">43</td><td>               ticks--<span class="k2">;</span></td></tr><tr><td class="number">44</td><td>               <span class="k1">if</span><span class="k2">(</span>old_ticks <span class="k3">&lt;</span><span class="k3">=</span> ticks<span class="k2">)</span> <span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">45</td><td>&#160;</td></tr><tr><td class="number">46</td><td>         <span class="k2">}</span></td></tr><tr><td class="number">47</td><td>&#160;</td></tr><tr><td class="number">48</td><td>         draw_everything_to_buffer<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">49</td><td>         <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>buffer, <a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">640</span>, <span class="n">480</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">50</td><td>&#160;</td></tr><tr><td class="number">51</td><td>         <span class="k1">if</span><span class="k2">(</span>hero.leaving_level<span class="k2">)</span> play_state <span class="k3">=</span> LEAVE_LEVEL<span class="k2">;</span></td></tr><tr><td class="number">52</td><td>&#160;</td></tr><tr><td class="number">53</td><td>      <span class="k2">}</span></td></tr></tbody></table></div></div><p>



updates_per_second is 60.</p><p>I set hero.anim_ticks_per_frame to 1, so that aught to be the fastest option.<br />Anything bigger than 1 should slow him down.</p><p>The trouble is, as it is (set to 1) the character moves <b>too</b> slowly.</p><p>I&#39;m not sure why it&#39;s so slow.</p><p>I thought perhaps I needed to change the updates_per_second value.</p><p>The timer gets installed like so :</p><div class="source-code snippet"><div class="inner"><pre>
<a href="http://www.allegro.cc/manual/install_int_ex" target="_blank"><span class="a">install_int_ex</span></a><span class="k2">(</span>ticker, BPS_TO_TIMER<span class="k2">(</span>updates_per_second<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>


..and I don&#39;t understand the purpose of this bit of code in my game loop :</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">while</span><span class="k2">(</span>ticks <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span>
<span class="k2">{</span>
    <a href="http://www.allegro.cc/manual/rest" target="_blank"><span class="a">rest</span></a><span class="k2">(</span><span class="n">100</span> <span class="k3">/</span> updates_per_second<span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>


I didn&#39;t write it myself, I copied it from the article on the allegro wiki about regulating game speed.</p><p>As you may have gathered I&#39;m hoping to get some help on this matter.</p><p>Any help would be great.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (William Labbett)</author>
		<pubDate>Wed, 04 Feb 2009 05:32:18 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
..and I don&#39;t understand the purpose of this bit of code in my game loop :
</p></div></div><p>
</p><div class="quote_container"><div class="title">The Wiki said:</div><div class="quote"><p>

If the drawing takes less than a full tick, we rest until the full tick has passed, allowing for an efficient utilization of the CPU.
</p></div></div><p>

It makes your game not use 100% of the CPU if it can help it.</p><p>And I am not sure what you mean by the character moving too slowly. In the code above you don&#39;t seem to ever move the character?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (SiegeLord)</author>
		<pubDate>Wed, 04 Feb 2009 05:43:20 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yes apologies for that.</p><p> The function do_non_drawing()</p><p>is where the position of the character gets changed (if hero.update is 1).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (William Labbett)</author>
		<pubDate>Wed, 04 Feb 2009 05:59:14 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>To begin with, drop the <tt>old_ticks = ticks;</tt> and <tt>if(old_ticks &lt;= ticks) break;</tt> lines - that&#39;s being taken care of by the loop condition and the <tt>ticks</tt> decrement.<br />And why isn&#39;t the animation stuff in <tt>do_non_drawing()</tt> as well?</p><div class="quote_container"><div class="title">SiegeLord said:</div><div class="quote"><p>
It makes your game not use 100% of the CPU if it can help it.
</p></div></div><p>
The resting time is still completely arbitrary (1/10 of the update frequency? WTH?) though, so it might as well be replaced with rest(1). <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (gnolam)</author>
		<pubDate>Wed, 04 Feb 2009 06:32:52 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
To begin with, drop the old_ticks = ticks; and if(old_ticks &lt;= ticks) break; lines - that&#39;s being taken care of by the loop condition and the ticks decrement.
</p></div></div><p>
No it isn&#39;t. That code prevents the logic from taking too long and freezing the computer. As soon as the logic step starts taking larger than a single tick, the loop will never exit because ticks will increase faster than it is decreased. It&#39;s optional for most games, but a truly general game loop will need something to take care of that.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
The resting time is still completely arbitrary
</p></div></div><p>
rest(1) will work, but any value smaller than the update time slice will do.</p><p>If you want your character to move faster, then you also should increase his speed as well as decreasing the delay.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (SiegeLord)</author>
		<pubDate>Wed, 04 Feb 2009 06:41:18 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Okay thanks for the advice.</p><p>I&#39;d like to say that I was hoping I could get him moving faster without resorting to increasing the x difference per frame.</p><p>The animation has 8 frames and each time the frame increases, he gets moved 3 pixels.</p><p>This means he moves 24 pixels each cycle which works well because my game area is effectively a grid of 24 * 24 tiles.</p><p>If I increased the x increment to 6 say then I&#39;d only be able to use 4 frames.</p><p>I don&#39;t understand why it&#39;s so slow.</p><p>EDIT : if anyone has any further advice, please let me know.</p><p>EDIT : solved it myself <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (William Labbett)</author>
		<pubDate>Wed, 04 Feb 2009 19:13:17 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
solved it myself
</p></div></div><p>
<img src="http://www.allegro.cc/forums/smileys/cheesy.gif" alt=":D" /> Awesome. Could you share what you did?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (SiegeLord)</author>
		<pubDate>Wed, 04 Feb 2009 22:05:48 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yeah sure.</p><p>This timing business is all new to me so it gives me slightly the heebie jeebies when confronted with such a challenge.</p><p>Basically, because I had updates_per_second set to 60 the intervals between updates were quite big. </p><p>So if I set </p><p>hero.anim_ticks_per_frame</p><p>to just 1, the length of time between each update was 1/60 second all thins being equal and ignoring other things that might influence it.</p><p>So I realised that by increasing updates_per_second which is now 384, I could get more control over the speed of the updates. ie I could choose between multiples of<br />1/384 of a second instead of 1/60.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (William Labbett)</author>
		<pubDate>Thu, 05 Feb 2009 00:34:25 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>That&#39;s not a good idea for multiple reasons. First, the ticker controls the framerate, and anything about 60-70 Hz is a waste of CPU. Secondly, Allegro&#39;s timers are not accurate enough to support anything much above 100 Hz. The effect of your timer change is as if you did this:</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> ii <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> ii <span class="k3">&lt;</span> <span class="n">3</span><span class="k2">;</span> ii<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="k2">{</span>
    do_non_drawing<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

Which is almost the same as simply changing the speed parameter.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (SiegeLord)</author>
		<pubDate>Thu, 05 Feb 2009 05:24:34 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
So I realised that by increasing updates_per_second which is now 384, I could get more control over the speed of the updates. ie I could choose between multiples of<br />1/384 of a second instead of 1/60.
</p></div></div><p>

If you measured your animation times in actual seconds, it wouldn&#39;t matter what your update rate is. All you would have to do is pass the amount of time passed since the last update to your animation object, which can be calculated easily from the number of updates in a second and the number of ticks passed.</p><p>I coded up an example class that takes care of doing these things. Take a look at the AnimBase::AdvanceTime function. All you have to do is pass it the elapsed time, and it takes care of updating the index into the BITMAP* array.</p><p> </p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="c">//</span></td></tr><tr><td class="number">2</td><td>&#160;</td></tr><tr><td class="number">3</td><td><span class="p">#ifndef FrameAnimations_H</span></td></tr><tr><td class="number">4</td><td><span class="p">#define FrameAnimations_H</span></td></tr><tr><td class="number">5</td><td>&#160;</td></tr><tr><td class="number">6</td><td>&#160;</td></tr><tr><td class="number">7</td><td><span class="p">#include &lt;allegro.h&gt;</span></td></tr><tr><td class="number">8</td><td><span class="p">#include &lt;cstdlib&gt;</span></td></tr><tr><td class="number">9</td><td>&#160;</td></tr><tr><td class="number">10</td><td><span class="k1">class</span> AnimBase <span class="k2">{</span></td></tr><tr><td class="number">11</td><td><span class="k1">private</span> <span class="k2">:</span></td></tr><tr><td class="number">12</td><td>   <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span><span class="k3">*</span> frames<span class="k2">;</span></td></tr><tr><td class="number">13</td><td>   <span class="k1">unsigned</span> <span class="k1">int</span> num_frames<span class="k2">;</span></td></tr><tr><td class="number">14</td><td>   <span class="k1">unsigned</span> <span class="k1">int</span> cur_frame<span class="k2">;</span></td></tr><tr><td class="number">15</td><td>   <span class="k1">double</span> frames_per_sec<span class="k2">;</span></td></tr><tr><td class="number">16</td><td>   <span class="k1">double</span> total_anim_time<span class="k2">;</span></td></tr><tr><td class="number">17</td><td>   <span class="k1">double</span> cur_frame_time<span class="k2">;</span></td></tr><tr><td class="number">18</td><td>   <span class="k1">unsigned</span> <span class="k1">int</span> total_loops<span class="k2">;</span></td></tr><tr><td class="number">19</td><td>   <span class="k1">unsigned</span> <span class="k1">int</span> cur_loop<span class="k2">;</span></td></tr><tr><td class="number">20</td><td><span class="k1">public</span> <span class="k2">:</span></td></tr><tr><td class="number">21</td><td>   </td></tr><tr><td class="number">22</td><td>   AnimBase<span class="k2">(</span><span class="k2">)</span> <span class="k2">:</span> frames<span class="k2">(</span><span class="n">0</span><span class="k2">)</span> , num_frames<span class="k2">(</span><span class="n">0</span><span class="k2">)</span> , cur_frame<span class="k2">(</span><span class="n">0</span><span class="k2">)</span> , frames_per_sec<span class="k2">(</span><span class="n">0</span>.<span class="n">0</span><span class="k2">)</span> ,</td></tr><tr><td class="number">23</td><td>                total_anim_time<span class="k2">(</span><span class="n">0</span>.<span class="n">0</span><span class="k2">)</span> , cur_frame_time<span class="k2">(</span><span class="n">0</span>.<span class="n">0</span><span class="k2">)</span> , total_loops<span class="k2">(</span><span class="n">0</span><span class="k2">)</span> , cur_loop<span class="k2">(</span><span class="n">0</span><span class="k2">)</span> <span class="k2">{</span><span class="k2">}</span></td></tr><tr><td class="number">24</td><td>   ~AnimBase<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>FreeFrames<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span><span class="k2">}</span></td></tr><tr><td class="number">25</td><td>   </td></tr><tr><td class="number">26</td><td>   <span class="c">/// x and y are the location where you want the top left of the frame to be drawn</span></td></tr><tr><td class="number">27</td><td>   <span class="k1">void</span> DrawTo<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><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="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">28</td><td>      <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span> frame <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">29</td><td>      <span class="k1">if</span> <span class="k2">(</span>frames <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k2">(</span><span class="k2">(</span>total_loops <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <span class="k2">(</span>cur_loop <span class="k3">&lt;</span> total_loops<span class="k2">)</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">30</td><td>         frame <span class="k3">=</span> frames<span class="k2">[</span>cur_frame<span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">31</td><td>         <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>frame , bmp , <span class="n">0</span> , <span class="n">0</span> , x , y , frame-&gt;w , frame-&gt;h<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">32</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">33</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">34</td><td>   </td></tr><tr><td class="number">35</td><td>   <span class="c">/// Returns the value of the CompletedAnimation function, so you know whether it is still playing</span></td></tr><tr><td class="number">36</td><td>   <span class="k1">bool</span> AdvanceTime<span class="k2">(</span><span class="k1">double</span> deltatime<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">37</td><td>      <span class="k1">if</span> <span class="k2">(</span>deltatime <span class="k3">&lt;</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>deltatime <span class="k3">=</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">;</span><span class="k2">}</span></td></tr><tr><td class="number">38</td><td>      cur_frame_time <span class="k3">+</span><span class="k3">=</span> deltatime<span class="k2">;</span></td></tr><tr><td class="number">39</td><td>      <span class="k1">if</span> <span class="k2">(</span>cur_frame_time <span class="k3">&gt;</span><span class="k3">=</span> total_anim_time<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">40</td><td>         <span class="k1">unsigned</span> <span class="k1">int</span> nloop_advance <span class="k3">=</span> <span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">int</span><span class="k2">)</span><span class="k2">(</span>cur_frame_time<span class="k3">/</span>total_anim_time<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">41</td><td>         cur_loop <span class="k3">+</span><span class="k3">=</span> nloop_advance<span class="k2">;</span></td></tr><tr><td class="number">42</td><td>         cur_frame_time <span class="k3">-</span><span class="k3">=</span> <span class="k2">(</span><span class="k1">double</span><span class="k2">)</span>nloop_advance<span class="k3">*</span>total_anim_time<span class="k2">;</span></td></tr><tr><td class="number">43</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">44</td><td>      cur_frame <span class="k3">=</span> <span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">int</span><span class="k2">)</span><span class="k2">(</span><span class="k2">(</span>cur_frame_time<span class="k3">/</span>total_anim_time<span class="k2">)</span><span class="k3">*</span><span class="k2">(</span><span class="k1">double</span><span class="k2">)</span><span class="k2">(</span>num_frames<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">45</td><td>      <span class="k1">return</span> CompletedAnimation<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">46</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">47</td><td>   </td></tr><tr><td class="number">48</td><td>   <span class="c">/// Returns true if the animation has finished playing the requested number of loops yet</span></td></tr><tr><td class="number">49</td><td>   <span class="c">/// A looping animation will always return false for this function.</span></td></tr><tr><td class="number">50</td><td>   <span class="k1">bool</span> CompletedAnimation<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">51</td><td>      <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>total_loops<span class="k2">)</span> <span class="k2">{</span><span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span><span class="k2">}</span></td></tr><tr><td class="number">52</td><td>      <span class="k1">return</span> <span class="k2">(</span>cur_loop <span class="k3">&lt;</span> total_loops<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">53</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">54</td><td>   </td></tr><tr><td class="number">55</td><td>   <span class="k1">void</span> Restart<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">56</td><td>      cur_frame <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">57</td><td>      cur_frame_time <span class="k3">=</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">58</td><td>      cur_loop <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">59</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">60</td><td>   </td></tr><tr><td class="number">61</td><td>   <span class="c">/// nloops value : pass 0 to loop, or &gt;0 for a specific number of loops</span></td></tr><tr><td class="number">62</td><td>   <span class="k1">bool</span> MakeForwardAnimation<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span><span class="k3">*</span> frame_array , <span class="k1">unsigned</span> <span class="k1">int</span> nframes , <span class="k1">double</span> total_time , <span class="k1">unsigned</span> <span class="k1">int</span> nloops<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">63</td><td>      <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>frame_array<span class="k2">)</span> <span class="k2">{</span><span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span><span class="k2">}</span></td></tr><tr><td class="number">64</td><td>      <span class="k1">if</span> <span class="k2">(</span>total_time <span class="k3">&lt;</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">)</span> <span class="k2">{</span><span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span><span class="k2">}</span></td></tr><tr><td class="number">65</td><td>      <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>MakeFrames<span class="k2">(</span>nframes<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span><span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span><span class="k2">}</span></td></tr><tr><td class="number">66</td><td>      <span class="k1">for</span> <span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">int</span> i <span class="k3">=</span> <span class="n">0</span> <span class="k2">;</span> i <span class="k3">&lt;</span> nframes <span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>i<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">67</td><td>         <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>frame_array<span class="k3">&lt;</span>i&gt;<span class="k2">)</span> <span class="k2">{</span><span class="c">// invalid BITMAP* for one of the animation frames</span></td></tr><tr><td class="number">68</td><td>            FreeFrames<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">69</td><td>            <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">70</td><td>         <span class="k2">}</span></td></tr><tr><td class="number">71</td><td>         frames<span class="k3">&lt;</span>i&gt; <span class="k3">=</span> frame_array<span class="k3">&lt;</span>i&gt;<span class="k2">;</span></td></tr><tr><td class="number">72</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">73</td><td>      total_anim_time <span class="k3">=</span> total_time<span class="k2">;</span></td></tr><tr><td class="number">74</td><td>      frames_per_sec <span class="k3">=</span> <span class="k2">(</span><span class="k1">double</span><span class="k2">)</span>num_frames<span class="k3">/</span>total_anim_time<span class="k2">;</span></td></tr><tr><td class="number">75</td><td>      total_loops <span class="k3">=</span> nloops<span class="k2">;</span></td></tr><tr><td class="number">76</td><td>      <span class="c">// cur_loop, cur_frame, and cur_frame_time are already 0 </span></td></tr><tr><td class="number">77</td><td>      <span class="c">// (due to the MakeFrames call, which calls FreeFrames, which calls Clear)</span></td></tr><tr><td class="number">78</td><td>      <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span></td></tr><tr><td class="number">79</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">80</td><td>   </td></tr><tr><td class="number">81</td><td>   <span class="k1">bool</span> MakeFrames<span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">int</span> nframes<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">82</td><td>      FreeFrames<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">83</td><td>      <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>nframes<span class="k2">)</span> <span class="k2">{</span><span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span><span class="k2">}</span></td></tr><tr><td class="number">84</td><td>      frames <span class="k3">=</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span><span class="k3">*</span><span class="k2">)</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_551.html" target="_blank">malloc</a><span class="k2">(</span><span class="k1">sizeof</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span><span class="k2">)</span><span class="k3">*</span>nframes<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">85</td><td>      <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>frames<span class="k2">)</span> <span class="k2">{</span><span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span><span class="k2">}</span></td></tr><tr><td class="number">86</td><td>      <span class="k1">for</span> <span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">int</span> i <span class="k3">=</span> <span class="n">0</span> <span class="k2">;</span> i <span class="k3">&lt;</span> nframes <span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>i<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">87</td><td>         frames<span class="k3">&lt;</span>i&gt; <span class="k3">=</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span><span class="k2">)</span><span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">88</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">89</td><td>      num_frames <span class="k3">=</span> nframes<span class="k2">;</span></td></tr><tr><td class="number">90</td><td>      <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span></td></tr><tr><td class="number">91</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">92</td><td>   </td></tr><tr><td class="number">93</td><td>   <span class="k1">void</span> Clear<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">94</td><td>      frames <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">95</td><td>      num_frames <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">96</td><td>      cur_frame <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">97</td><td>      frames_per_sec <span class="k3">=</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">98</td><td>      total_anim_time <span class="k3">=</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">99</td><td>      cur_frame_time <span class="k3">=</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">100</td><td>      total_loops <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">101</td><td>      cur_loop <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">102</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">103</td><td>   </td></tr><tr><td class="number">104</td><td>   <span class="k1">void</span> FreeFrames<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">105</td><td>      <span class="k1">if</span> <span class="k2">(</span>frames<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">106</td><td>         <a href="http://www.delorie.com/djgpp/doc/libc/libc_350.html" target="_blank">free</a><span class="k2">(</span>frames<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">107</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">108</td><td>      Clear<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">109</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">110</td><td><span class="k2">}</span><span class="k2">;</span></td></tr><tr><td class="number">111</td><td>&#160;</td></tr><tr><td class="number">112</td><td>&#160;</td></tr><tr><td class="number">113</td><td><span class="p">#endif // FrameAnimations_H</span></td></tr><tr><td class="number">114</td><td>&#160;</td></tr><tr><td class="number">115</td><td><span class="c">//</span></td></tr></tbody></table></div></div><p>

Then to use it all you have to do is call AdvanceTime once for each logic iteration and then display it. You can even produce a slow motion or hyper motion effect by using a multiplier on the elapsed time that you pass to the function. And that could also be used to vary the animation speed of a walking or running animation. In that case the time scaling factor that you use is :</p><p> <img class="math" src="http://www.allegro.cc/images/tex/a/d/ad12ef726284e37e2fffe645435a17fc-96.png" alt="&lt;math&gt;TimeScaleFactor = \frac{TotalAnimationTime*WalkingSpeed}{2*StrideLength}&lt;/math&gt;" /></p><p>This is assuming that the animation is one complete set of 2 strides, and that TotalAnimationTime is the time value passed to AnimBase::MakeForwardAnimation for the total_time parameter. WalkingSpeed is just the velocity of the player, and StrideLength should be the largest possible distance in pixels between the player&#39;s feet from the animation frames.</p><p>A usage example of the class :
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="c">//</span></td></tr><tr><td class="number">2</td><td>AnimBase clouds_anim<span class="k2">;</span></td></tr><tr><td class="number">3</td><td>clouds_anim.MakeForwardAnimation<span class="k2">(</span>cloud_frames , <span class="n">120</span> , <span class="n">4</span>.<span class="n">0</span> , <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">4</td><td><span class="k1">double</span> time_warp_factor <span class="k3">=</span> <span class="n">3</span>.<span class="n">0</span><span class="k2">;</span><span class="c">// render at 3X normal speed</span></td></tr><tr><td class="number">5</td><td>&#160;</td></tr><tr><td class="number">6</td><td><span class="k1">while</span><span class="k2">(</span><span class="k3">!</span>quit<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">7</td><td>  <span class="k1">while</span><span class="k2">(</span>ticks <span class="k3">&lt;</span> <span class="n">1</span><span class="k2">)</span> <span class="k2">{</span><a href="http://www.allegro.cc/manual/rest" target="_blank"><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></td></tr><tr><td class="number">8</td><td>  time_passed <span class="k3">=</span> <span class="k2">(</span><span class="k1">double</span><span class="k2">)</span>ticks<span class="k3">*</span>secs_per_tick<span class="k2">;</span></td></tr><tr><td class="number">9</td><td>  ticks <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">10</td><td>&#160;</td></tr><tr><td class="number">11</td><td>  <span class="c">// logic</span></td></tr><tr><td class="number">12</td><td>  clouds_anim.AdvanceTime<span class="k2">(</span>time_passed<span class="k3">*</span>time_warp_factor<span class="k2">)</span><span class="k2">;</span>  </td></tr><tr><td class="number">13</td><td>&#160;</td></tr><tr><td class="number">14</td><td>  <span class="c">// drawing</span></td></tr><tr><td class="number">15</td><td>  clouds_anim.DrawTo<span class="k2">(</span>buffer , <span class="n">0</span> , <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">16</td><td>&#160;</td></tr><tr><td class="number">17</td><td>  <span class="c">// display</span></td></tr><tr><td class="number">18</td><td>  <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>buffer , <a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a> , <span class="n">0</span> , <span class="n">0</span> , <span class="n">0</span> , <span class="n">0</span> , buffer-&gt;w , buffer-&gt;h<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">19</td><td>&#160;</td></tr><tr><td class="number">20</td><td><span class="k2">}</span></td></tr><tr><td class="number">21</td><td>&#160;</td></tr><tr><td class="number">22</td><td><span class="c">//</span></td></tr></tbody></table></div></div><p>

If you need transitions between animations you could code another class on top of it that handles a queue of AnimBase* objects. It could turn off the looping of one AnimBase and queue another AnimBase to replace it when the current one finishes.</p><p>I realize this is in C++, but it should be relatively easy to turn it into C if you wish to, and it&#39;s far more useful to me as C++, so that&#39;s what I wrote it as. That way I can continue to use it, but hopefully it will still be helpful to you.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Thu, 05 Feb 2009 18:14:22 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>sorry I couldn&#39;t reply sooner. Had trouble with my internet connection.</p><p>Thanks very much Edgar,</p><p>I&#39;ll get to work on adapting that code. If I get stuck I might well have to ask a few things.</p><p>EDIT</p><p>I do need to ask a few things to make use of your help Edgar.</p><p>In this code ;</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">while</span><span class="k2">(</span><span class="k3">!</span>quit<span class="k2">)</span> <span class="k2">{</span>
  <span class="k1">while</span><span class="k2">(</span>ticks <span class="k3">&lt;</span> <span class="n">1</span><span class="k2">)</span> <span class="k2">{</span><a href="http://www.allegro.cc/manual/rest" target="_blank"><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>
  time_passed <span class="k3">=</span> <span class="k2">(</span><span class="k1">double</span><span class="k2">)</span>ticks<span class="k3">*</span>secs_per_tick<span class="k2">;</span>
  ticks <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
</pre></div></div><p>

I presume ticks is updated by an interrupt - is that right ?</p><p>...and why is it set to 0 ?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (William Labbett)</author>
		<pubDate>Mon, 09 Feb 2009 00:32:50 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
I presume ticks is updated by an interrupt - is that right ?</p><p>...and why is it set to 0 ?
</p></div></div><p>
Yes, ticks is incremented by an interrupt. It&#39;s set to zero because the amount of time passed is recorded in the time_passed variable there. I generally use delta time in my programs, and pass the amount of time passed on to functions that use it. In this fashion, frames are dropped automatically when the combined logic and rendering are taking too long. In this way, if you notice a low frame rate, you know that your cpu is having trouble doing everything requested of it.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Mon, 09 Feb 2009 00:47:49 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Okay, great. Glad you&#39;re around to help!</p><p>I was just wondering if setting ticks to 0 might cause problems for other parts of the program using the ticks variable.</p><p>Could it just as easily use a copy of ticks ?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (William Labbett)</author>
		<pubDate>Mon, 09 Feb 2009 00:50:49 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
I was just wondering if setting ticks to 0 might cause problems for other parts of the program using the ticks variable.</p><p>Could it just as easily use a copy of ticks ?
</p></div></div><p>
If other parts of your program rely on the value of the ticks variable, then yes, changing the value will probably mess with things.</p><p>If you favor the tick decrementation loop, it can work with the class I put up just as easily :
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="c">//</span></td></tr><tr><td class="number">2</td><td>AnimBase clouds_anim<span class="k2">;</span></td></tr><tr><td class="number">3</td><td>clouds_anim.MakeForwardAnimation<span class="k2">(</span>cloud_frames , <span class="n">120</span> , <span class="n">4</span>.<span class="n">0</span> , <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">4</td><td><span class="k1">double</span> time_warp_factor <span class="k3">=</span> <span class="n">3</span>.<span class="n">0</span><span class="k2">;</span><span class="c">// render at 3X normal speed</span></td></tr><tr><td class="number">5</td><td>&#160;</td></tr><tr><td class="number">6</td><td><span class="k1">while</span><span class="k2">(</span><span class="k3">!</span>quit<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">7</td><td>  <span class="k1">while</span><span class="k2">(</span>ticks <span class="k3">&lt;</span> <span class="n">1</span><span class="k2">)</span> <span class="k2">{</span><a href="http://www.allegro.cc/manual/rest" target="_blank"><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></td></tr><tr><td class="number">8</td><td>&#160;</td></tr><tr><td class="number">9</td><td>  ticks_passed <span class="k3">=</span> ticks<span class="k2">;</span></td></tr><tr><td class="number">10</td><td>  ticks <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">11</td><td>  <span class="k1">for</span> <span class="k2">(</span>i <span class="k3">=</span> <span class="n">0</span> <span class="k2">;</span> i <span class="k3">&lt;</span> ticks_passed <span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>i<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">12</td><td>    time_passed <span class="k3">=</span> secs_per_tick<span class="k2">;</span></td></tr><tr><td class="number">13</td><td>&#160;</td></tr><tr><td class="number">14</td><td>    <span class="c">// logic</span></td></tr><tr><td class="number">15</td><td>    clouds_anim.AdvanceTime<span class="k2">(</span>time_passed<span class="k3">*</span>time_warp_factor<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">16</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">17</td><td>&#160;</td></tr><tr><td class="number">18</td><td>  <span class="c">// drawing</span></td></tr><tr><td class="number">19</td><td>  clouds_anim.DrawTo<span class="k2">(</span>buffer , <span class="n">0</span> , <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td>&#160;</td></tr><tr><td class="number">21</td><td>  <span class="c">// display</span></td></tr><tr><td class="number">22</td><td>  <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>buffer , <a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a> , <span class="n">0</span> , <span class="n">0</span> , <span class="n">0</span> , <span class="n">0</span> , buffer-&gt;w , buffer-&gt;h<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td>&#160;</td></tr><tr><td class="number">24</td><td><span class="k2">}</span></td></tr><tr><td class="number">25</td><td>&#160;</td></tr><tr><td class="number">26</td><td><span class="c">//</span></td></tr></tbody></table></div></div><p>

With this kind of logic processing you&#39;ll have to watch out for the runaway train effect though - if the logic and rendering are taking more than one tick total, then the number of ticks_passed between each iteration of the while(!quit) loop will steadily increase. Since just the logic portion generally takes less time than the rendering loop, this will offset the increase somewhat, but it&#39;s still something to be aware of.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Mon, 09 Feb 2009 01:04:36 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
With this kind of logic processing you&#39;ll have to watch out for the runaway train effect though - if the logic and rendering are taking more than one tick total, then the number of ticks_passed between each iteration of the while(!quit) loop will steadily increase. Since just the logic portion generally takes less time than the rendering loop, this will offset the increase somewhat, but it&#39;s still something to be aware of.
</p></div></div><p>

If you just use the algorithm in the wiki, all this would have already been taken care of. <img src="http://www.allegro.cc/forums/smileys/rolleyes.gif" alt="::)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (SiegeLord)</author>
		<pubDate>Mon, 09 Feb 2009 02:23:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">SiegeLord said:</div><div class="quote"><p>

If you just use the algorithm in the wiki, all this would have already been taken care of. <img src="http://www.allegro.cc/forums/smileys/rolleyes.gif" alt="::)" />
</p></div></div><p>
Do you mean <a href="http://wiki.allegro.cc/index.php?title=Timers#Making_use_of_the_ticks">this part</a>?</p><div class="quote_container"><div class="title">wiki page on Timers : Making use of the ticks said:</div><div class="quote"><p>

</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td>        <span class="k1">while</span><span class="k2">(</span><span class="k3">!</span>quit<span class="k2">)</span></td></tr><tr><td class="number">2</td><td>        <span class="k2">{</span></td></tr><tr><td class="number">3</td><td>                <span class="k1">while</span><span class="k2">(</span>ticks <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">4</td><td>                <span class="k2">{</span></td></tr><tr><td class="number">5</td><td>                        <a href="http://www.allegro.cc/manual/rest" target="_blank"><span class="a">rest</span></a><span class="k2">(</span><span class="n">100</span> <span class="k3">/</span> updates_per_second<span class="k2">)</span><span class="k2">;</span><span class="c">//rest until a full tick has passed</span></td></tr><tr><td class="number">6</td><td>                <span class="k2">}</span></td></tr><tr><td class="number">7</td><td>&#160;</td></tr><tr><td class="number">8</td><td>                <span class="k1">while</span><span class="k2">(</span>ticks <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">9</td><td>                <span class="k2">{</span></td></tr><tr><td class="number">10</td><td>                        <span class="k1">int</span> old_ticks <span class="k3">=</span> ticks<span class="k2">;</span></td></tr><tr><td class="number">11</td><td>&#160;</td></tr><tr><td class="number">12</td><td>                        DoLogic<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">13</td><td>&#160;</td></tr><tr><td class="number">14</td><td>                        ticks--<span class="k2">;</span></td></tr><tr><td class="number">15</td><td>                        <span class="k1">if</span><span class="k2">(</span>old_ticks <span class="k3">&lt;</span><span class="k3">=</span> ticks<span class="k2">)</span><span class="c">//logic is taking too long: abort and draw a frame</span></td></tr><tr><td class="number">16</td><td>                        <span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">17</td><td>                <span class="k2">}</span></td></tr><tr><td class="number">18</td><td>&#160;</td></tr><tr><td class="number">19</td><td>                DrawEverything<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td>        <span class="k2">}</span></td></tr></tbody></table></div></div><p>
</p></div></div><p>

Resting 100/updates_per_second milliseconds is too long. When that line is executed, it could be just before the timer interrupt that increments ticks is called. That means it could waste exactly as much time is rested there before it gets around to taking care of the logic and drawing. This means that in the worst case, one tick of the logic loop has at most<br /> <img class="math" src="http://www.allegro.cc/images/tex/7/8/78ace859a930bd459757a773452122fe-96.png" alt="&lt;math&gt;SecondsPerUpdate - \frac{100}{UpdatesPerSecond}*\frac{1}{1000}&lt;/math&gt;" /><br />seconds to execute the logic before ticks will equal old_ticks. That works out to<br /> <img class="math" src="http://www.allegro.cc/images/tex/1/0/101e61bb620762756882fd0a49e364bb-96.png" alt="&lt;math&gt;\frac{9}{10}SecondsPerUpdate&lt;/math&gt;" /><br />seconds allowed to execute the logic.</p><p>If you only rest(1) while (ticks &lt; 0) then you are far more likely to start as close as possible to when the timer is incremented than you are with the other method.</p><p>This method gives the logic portion (SecondsPerUpdate - 0.001) seconds to execute (ignoring the granularity of an Allegro timer ms, of course).</p><p>So, which gives the logic more time to execute, based on SecondsPerUpdate?<br /> <img class="math" src="http://www.allegro.cc/images/tex/f/f/ff1e1e73968b98698007d6e19319a448-96.png" alt="&lt;math&gt;\frac{9}{10}SecondsPerUpdate &lt;?&gt; SecondsPerUpdate - 0.001&lt;/math&gt;" /></p><p> <img class="math" src="http://www.allegro.cc/images/tex/f/0/f01c2de84b053d97b8a1cf8f3b53880d-96.png" alt="&lt;math&gt;0.01 &lt;?&gt; SecondsPerUpdate&lt;/math&gt;" /></p><p>If SecondsPerUpdate is &gt; 0.01 (A timer running at less than 100Hz), then (SecondsPerUpdate - 0.001) (which is the time the logic has with rest(1)) is larger, and gives the logic more time to execute. Since the vast majority of timers for games are less than 100 Hz since they are usually synchronized with the monitor refresh rate, rest(1) makes more sense.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
</p><div class="source-code snippet"><div class="inner"><pre>                <span class="k1">while</span><span class="k2">(</span>ticks <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span>
                <span class="k2">{</span>
                        <span class="k1">int</span> old_ticks <span class="k3">=</span> ticks<span class="k2">;</span>

                        DoLogic<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>

                        ticks--<span class="k2">;</span>
                        <span class="k1">if</span><span class="k2">(</span>old_ticks <span class="k3">&lt;</span><span class="k3">=</span> ticks<span class="k2">)</span><span class="c">//logic is taking too long: abort and draw a frame</span>
                        <span class="k1">break</span><span class="k2">;</span>
                <span class="k2">}</span>
</pre></div></div><p>
</p></div></div><p>

This portion logically says &quot;If ticks increments during the time just before and just after DoLogic() is called, then don&#39;t process any more logic before rendering a frame.&quot; So if the timer is incremented while DoLogic is processing, then it stops and draws a frame. Depending on the relative position of the current time to the next interrupt time, it will behave differently.</p><p>If logic and drawing combined are taking longer than the update interval (L + D &gt; I), the best option is just to discard the extra ticks and let the program slow down. Since L + D is larger than I, between updates it is guaranteed to have at least one tick incrementation occur, and the updates will be at a fairly consistent rate. </p><p>On all computers fast enough to process it, there will be time left over before the next update and the cpu can be allowed to rest. On slower computers, they will run at 100% cpu at a consistent rate based on their processor power.</p><p>So I don&#39;t see any rationale that dissuades me from using something as completely simple as this :
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span>quit<span class="k2">)</span> <span class="k2">{</span>
   <span class="k1">while</span> <span class="k2">(</span>ticks <span class="k3">&lt;</span> <span class="n">1</span><span class="k2">)</span> <span class="k2">{</span><a href="http://www.allegro.cc/manual/rest" target="_blank"><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>
   ticks <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
   <span class="c">/// Process one update at most, so count time passed as</span>
   <span class="c">/// one tick, or seconds_per_update seconds.</span>
   DoLogic<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
   Display<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

If you don&#39;t want to use up 100% cpu on a slower computer, then you need to slow down your timer enough to allow the cpu rest time between updates. You can do this based on the number of milliseconds that you rest between updates. If it is 0, then you need to slow down your timer, and if it is greater than 0 then you can try to speed up your timer. You&#39;d also have to test for fluctuating rate changes and stabilize the timer rate at the slower of the two fluctuating values.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Mon, 09 Feb 2009 11:16:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
stuff about rest
</p></div></div><p>

rest(100 / 60) = rest(1). But yeah, rest(1) is probably simpler there.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
If logic and drawing combined are taking longer than the update interval (L + D &gt; I), the best option is just to discard the extra ticks and let the program slow down. Since L + D is larger than I, between updates it is guaranteed to have at least one tick incrementation occur, and the updates will be at a fairly consistent rate.
</p></div></div><p>

Do you know the point of fixed step timing? The point of it is to update the logic of the game at a fixed rate relative to the time passed in the real world. You can&#39;t just lump L and D together. The point of fixed step timing is to keep them separate. There are three cases that an average game encounters:</p><p>1) In most games, D &gt;&gt; L. So, for every frame, multiple ticks will pass, usually around 1 or 2. The wiki algorithm measures these ticks, and then calls the DoLogic() the number of times that the ticks were incremented. That is the standard domain of operation.</p><p>2) If somehow D &lt; 1, then the program can rest and not use 100% CPU. At this point, the ratio of logics to frames will be 1.</p><p>3) If somehow L &gt; 1, then we enter the bad territory, and must escape it gracefully. Arguably, the best solution is to lock the ratio of the logic updates to frame updates to 1. </p><p>Those three cases are solved by the wiki algorithm. If you can think of something better, by all means suggest it. In my experimentation that was the simplest algorithm that fulfilled those three cases properly.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
So I don&#39;t see any rationale that dissuades me from using something as completely simple as this :
</p></div></div><p>

It doesn&#39;t handle case 1.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
If you don&#39;t want to use up 100% cpu on a slower computer, then you need to slow down your timer enough to allow the cpu rest time between updates. You can do this based on the number of milliseconds that you rest between updates. If it is 0, then you need to slow down your timer, and if it is greater than 0 then you can try to speed up your timer. You&#39;d also have to test for fluctuating rate changes and stabilize the timer rate at the slower of the two fluctuating values.
</p></div></div><p>

What? You never ever touch the rate of your timer after you set it up. That would introduce non-determinism into the system. The timer always ticks at the same rate.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (SiegeLord)</author>
		<pubDate>Mon, 09 Feb 2009 11:41:14 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Do you know the point of fixed step timing? The point of it is to update the logic of the game at a fixed rate relative to the time passed in the real world.
</p></div></div><p>
Which cannot be done once the sum of one logic step and one drawing step take more than one timing interval.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
You can&#39;t just lump L and D together. The point of fixed step timing is to keep them separate.
</p></div></div><p>
L and D are inseparable as far as timing is concerned. For every frame drawn, it needs at least one logic step.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
1) In most allegro games, D &gt;&gt; L (at least, in Allegro land). So, for every frame, multiple ticks will pass, usually around 1 or 2. The wiki algorithm measures these ticks, and then calls the DoLogic() the number of times that the ticks were incremented. That is the standard domain of operation.
</p></div></div><p>
If more than one tick passes from the time logic and drawing start and conclude, then the computer is too slow to handle the amount of processing required to maintain that frame rate. If you process more than one logic tick at a time, you are dropping frames, and dropping information to present to the user.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
3) If somehow L &gt; 1, then we enter the bad territory, and must escape it gracefully. <b>Arguably, the best solution is to lock the ratio of the logic updates to frame updates to 1</b>.
</p></div></div><p>
You&#39;re contradicting yourself. If only one logic call can be executed for each frame, then that is exactly what I posted at the end of my last post. The algorithm from the wiki does not do this, as the ratio of logic updates to frame updates can vary.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Those three cases are solved by the wiki algorithm.
</p></div></div><p>
It handles 2) fine, but what sane algorithm wouldn&#39;t?</p><p>As for 3) :
</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
</p><div class="source-code snippet"><div class="inner"><pre>             <span class="k1">while</span><span class="k2">(</span>ticks <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span>
                <span class="k2">{</span>
                        <span class="k1">int</span> old_ticks <span class="k3">=</span> ticks<span class="k2">;</span>

                        DoLogic<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>

                        ticks--<span class="k2">;</span>
                        <span class="k1">if</span><span class="k2">(</span>old_ticks <span class="k3">&lt;</span><span class="k3">=</span> ticks<span class="k2">)</span><span class="c">//logic is taking too long: abort and draw a frame</span>
                        <span class="k1">break</span><span class="k2">;</span>
                <span class="k2">}</span>
</pre></div></div><p>
</p></div></div><p>
With this algorithm, ticks is allowed to pile up behind old_ticks, and as many ticks are processed as possible as long as one tick is processed faster than one timing interval. If one tick can&#39;t be processed during that interval then ticks starts to pile up. Like I said before, there&#39;s also the problem where the ticks counter is just about to increment when DoLogic() starts and increments before it finishes. That makes it exit and draw immediately, regardless of whether or not the DoLogic function was taking too long. What all that makes for is what sounds like a choppy update rate, where it starts and stops with an uneven drawing rate. Of course that will hardly be noticed on a computer that&#39;s fast enough to process L+D faster than the timing interval, but for slow computers I bet it could make a noticeable difference.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
That&#39;s not fixed step timing. It is thrown out of the window immediately.
</p></div></div><p>
Actually, the code example I put up is fixed timing. What makes you think it isn&#39;t? ticks &gt;= 1 makes for one tick and therefore one logic update and one drawing update. No visual information is lost, no frames are skipped, not logic frames, or drawing frames either. All it does is slow down on computers that aren&#39;t fast enough to handle it.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
What? You never ever touch the rate of your timer after you set it up. That would introduce non-determinism into the system. The timer always ticks at the same rate.
</p></div></div><p>
You can still use your fixed step update with a slower timer. A slower timer just means more time has passed, and you can iteratively subtract your fixed time step from it if you like. Not to mention that you could use two timers, one fixed to a constant rate that you use to count how many logic frames should be processed, and a second timer that you use to determine whether you should be updating your display. In this fashion, you would wait on the second timer and proceed only if the first timer has ticks on it as well. That way you would still have exactly the same number of logic frames processed at the same fixed step, but the view onto the world could be in different time frames.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
If you can think of something better, by all means suggest it.
</p></div></div><p>
</p><div class="source-code snippet"><div class="inner"><pre><span class="c">//</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="k1">while</span> <span class="k2">(</span>ticks <span class="k3">&lt;</span> <span class="n">1</span><span class="k2">)</span> <span class="k2">{</span><a href="http://www.allegro.cc/manual/rest" target="_blank"><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>
   ticks <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
   <span class="c">/// Process one update at most, so count time passed as</span>
   <span class="c">/// one tick, or seconds_per_update seconds.</span>
   DoLogic<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
   Display<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
<span class="c">//</span>
</pre></div></div><p>
Everyone on every computer would see exactly the same thing given the same platform peculiarities, and those with slower processors would just see it more slowly. <img src="http://www.allegro.cc/forums/smileys/cheesy.gif" alt=":D" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Mon, 09 Feb 2009 12:57:10 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Everyone on every computer would see exactly the same thing given the same platform peculiarities, and those with slower processors would just see it more slowly. <img src="http://www.allegro.cc/forums/smileys/cheesy.gif" alt=":D" />
</p></div></div><p>You have funny ideas of what&#39;s &quot;Better&quot;. A slower computer should just skip drawing the screen and get the logic up to date (to a point).</p><p>Maybe I&#39;m out of touch, but doesn&#39;t rest(1) actually end up resting for at LEAST one scheduler time slot (in some OSs, thats 10ms a piece)? Seeing as you can&#39;t wait for less than one slot on fixed frequency timer schedulers. (linux with NO_HZ might be able to let an app sleep for 1ms at a time, but then, the actual sleep time depends on how much time other processes use, how long it takes to switch processes, if the process actually slept at all, etc)</p><p>edit:
</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Everyone on every computer would see exactly the same thing given the same platform peculiarities
</p></div></div><p>Most people won&#39;t see the same exact platform peculiarities. Hardware versions, driver version, OS versions and other software (and various versions thereof) all lead to different characteristics on pretty much every PC.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Mon, 09 Feb 2009 15:59:42 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
That&#39;s not a good idea for multiple reasons. First, the ticker controls the framerate, and anything about 60-70 Hz is a waste of CPU. Secondly, Allegro&#39;s timers are not accurate enough to support anything much above 100 Hz. The effect of your timer change is as if you did this:
</p></div></div><p>


So updates_per_second shouldn&#39;t be more than 60.</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">if</span><span class="k2">(</span>hero.anim_delay_counter <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span>
<span class="k2">{</span>
                   <span class="k3">-</span><span class="k3">-</span>hero.anim_delay_counter<span class="k2">;</span>
                   hero.update <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>
                   hero.update <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
                   hero.anim_delay_counter <span class="k3">=</span> hero.anim_ticks_per_frame<span class="k2">;</span>
               <span class="k2">}</span>
</pre></div></div><p>

The fastest movement I can get is with anim_ticks_per_frame set to 1 but this is still too slow.</p><p>Does this mean I&#39;ve no choice but to change my animation so it draws less frames per 24 pixel move ?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (William Labbett)</author>
		<pubDate>Tue, 10 Feb 2009 05:01:46 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Thomas Fjellstrom said:</div><div class="quote"><p>

Most people won&#39;t see the same exact platform peculiarities. Hardware versions, driver version, OS versions and other software (and various versions thereof) all lead to different characteristics on pretty much every PC.
</p></div></div><p>
That&#39;s why I qualified it as &#39;<i>given the same platform peculiarities</i>&#39;.</p><div class="quote_container"><div class="title">Thomas Fjellstrom said:</div><div class="quote"><p>

You have funny ideas of what&#39;s &quot;Better&quot;. A slower computer should just skip drawing the screen and get the logic up to date (to a point).
</p></div></div><p>
Better for what purpose though?</p><p>The only real argument here is what should happen on computers that are too slow to handle your program. And the only two choices you have are to slow down game time relative to real time, or drop display frames.</p><p>That&#39;s a preference though, so maybe I should have clarified it as &#39;Better for some&#39; as opposed to &#39;Better in general&#39;, but that doesn&#39;t fix the oddities I pointed out in the wiki algorithm.</p><div class="quote_container"><div class="title">William Labbett said:</div><div class="quote"><p>

The fastest movement I can get is with anim_ticks_per_frame set to 1 but this is still too slow.
</p></div></div><p>
You&#39;re running at 60Hz, and incrementing your animation&#39;s frame counter 1 for each update, and it is still too slow? That should be showing 60 fps for your animation. Show more code.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Tue, 10 Feb 2009 07:47:37 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
L and D are inseparable as far as timing is concerned. For every frame drawn, it needs at least one logic step.
</p></div></div><p>
That is true.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
If you process more than one logic tick at a time, you are dropping frames, and dropping information to present to the user.
</p></div></div><p>
Dropping frames the the standard procedure. The game, however, does not slow down, since logic frames per second should remain constant.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
You&#39;re contradicting yourself. If only one logic call can be executed for each frame, then that is exactly what I posted at the end of my last post. The algorithm from the wiki does not do this, as the ratio of logic updates to frame updates can vary.
</p></div></div><p>
Read what I said again. <i>If</i> L &gt; 1 <i>then</i> the ratio is locked to 1. It is not always locked to 1, because that would violate case #1. To satisfy case 1 and 3 the ratio has to vary.</p><p>Your simplification fails to satisfy the first case, and as soon as your frame rate drops below 60, your game will slow down. This is not acceptable for a game. You are suggesting the equivalent using a fixed delta time in your favourite delta timing game loop. If you think that this idea is so good, by are you even calculating a delta time? Just assume it&#39;s 1/60 and anyone who can&#39;t match that can go upgrade their computers.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Of course that will hardly be noticed on a computer that&#39;s fast enough to process L+D faster than the timing interval, but for slow computers I bet it could make a noticeable difference
</p></div></div><p>
The choppiness will be preferable to an all across the board slowdown that your algorithm will necessitate. Moreover, my tests have shown that the choppiness is not very noticeable. Choppiness can be eliminated by forcing the ratio of logic updates to frame updates to be an integer number, but I have not figured out how to do this simply. If this somehow can be done simply, it&#39;d be an even better algorithm than the one in the wiki.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Not to mention that you could use two timers, one fixed to a constant rate that you use to count how many logic frames should be processed, and a second timer that you use to determine whether you should be updating your display. In this fashion, you would wait on the second timer and proceed only if the first timer has ticks on it as well. That way you would still have exactly the same number of logic frames processed at the same fixed step, but the view onto the world could be in different time frames.
</p></div></div><p>
Yeah, that is a good idea... but the algorithm for that might be complicated. I&#39;ll need to see how that would work. In either case, the amount of game time that each logic tick simulates has to remain constant. If we can combine this with the integral ratio idea I mentioned above, it&#39;d be nigh perfect algorithm.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (SiegeLord)</author>
		<pubDate>Tue, 10 Feb 2009 08:25:31 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
That&#39;s why I qualified it as &#39;given the same platform peculiarities&#39;.
</p></div></div><p>You&#39;d have to have identical hardware, with identical driver, os and software versions installed for that to happen. Not exactly something you can rely on.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Better for what purpose though?
</p></div></div><p>I&#39;d prefer the game to be somewhat playable on more machines than to be slow as molasses on more machines.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Tue, 10 Feb 2009 14:06:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
You&#39;d have to have identical hardware, with identical driver, os and software versions installed for that to happen. Not exactly something you can rely on.
</p></div></div><p>
It&#39;s not exactly something I was depending on. Of course different machines behave differently, but it&#39;s mostly irrelevant to what I was talking about.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
I&#39;d prefer the game to be somewhat playable on more machines than to be slow as molasses on more machines.
</p></div></div><p>
Okay, so you&#39;d prefer that objects teleport in your programs when the cpu can&#39;t handle it, that&#39;s fine. Like I said, that&#39;s your preference. It sounds like trying to play online first person games with packet lag. You can do it, but it doesn&#39;t sound like much fun to me.</p><div class="quote_container"><div class="title">SiegeLord said:</div><div class="quote"><p>

Yeah, that is a good idea... but the algorithm for that might be complicated. I&#39;ll need to see how that would work. In either case, the amount of game time that each logic tick simulates has to remain constant. If we can combine this with the integral ratio idea I mentioned above, it&#39;d be nigh perfect algorithm.
</p></div></div><p>
I&#39;ll see if I can come up with a prototype or two when I have some more time.</p><p>Yes I realize I just got through saying I prefer not to drop frames, but it pays to have the ability to be versatile, so it&#39;s still worth exploring to me.</p><p>William, since your animation is still running slower than it seems it should be, please show us more code, specifically all that relates to the logical processing and the struct you&#39;re using for your hero object.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Tue, 10 Feb 2009 14:58:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
You can do it, but it doesn&#39;t sound like much fun to me.
</p></div></div><p>Nor does everything going slow.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Tue, 10 Feb 2009 16:26:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
William, since your animation is still running slower than it seems it should be, please show us more code, specifically all that relates to the logical processing and the struct you&#39;re using for your hero object.
</p></div></div><p>

Sure thing. I&#39;ll post my main() aswell :-</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">2</td><td><span class="k2">{</span></td></tr><tr><td class="number">3</td><td>   <span class="k1">int</span> old_ticks<span class="k2">;</span></td></tr><tr><td class="number">4</td><td>&#160;</td></tr><tr><td class="number">5</td><td>   init<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">6</td><td>&#160;</td></tr><tr><td class="number">7</td><td>   get_shadow_colours<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">8</td><td>   load_data<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">9</td><td>   colour_codes_init<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">10</td><td>   generate_shapes_info<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">11</td><td>   create_and_organise_bitmaps<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">12</td><td>&#160;</td></tr><tr><td class="number">13</td><td>   temp_buffer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/create_bitmap" target="_blank"><span class="a">create_bitmap</span></a><span class="k2">(</span><span class="n">640</span>, <span class="n">480</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">14</td><td>&#160;</td></tr><tr><td class="number">15</td><td>   initialise_levels<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">16</td><td>&#160;</td></tr><tr><td class="number">17</td><td>   level_x <span class="k3">=</span> <span class="n">4</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td>   level_y <span class="k3">=</span> <span class="n">5</span><span class="k2">;</span></td></tr><tr><td class="number">19</td><td>&#160;</td></tr><tr><td class="number">20</td><td>   current_level <span class="k3">=</span> level_numbers<span class="k2">[</span>level_y<span class="k2">]</span><span class="k2">[</span>level_x<span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">21</td><td>&#160;</td></tr><tr><td class="number">22</td><td>   initialise_hero_for_first_level<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td>&#160;</td></tr><tr><td class="number">24</td><td>   <span class="k1">while</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_ESC<span class="k2">]</span><span class="k2">)</span></td></tr><tr><td class="number">25</td><td>   <span class="k2">{</span></td></tr><tr><td class="number">26</td><td>      <span class="c">//read_level(level_number);</span></td></tr><tr><td class="number">27</td><td>&#160;</td></tr><tr><td class="number">28</td><td>&#160;</td></tr><tr><td class="number">29</td><td>      initialise_level_variables<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">30</td><td>&#160;</td></tr><tr><td class="number">31</td><td>      initialise_water_tiles<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">32</td><td>      initialise_nodes<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">33</td><td>&#160;</td></tr><tr><td class="number">34</td><td>      draw_first_frame<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">35</td><td>      fade_in_level<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">36</td><td>      <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>buffer, <a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">640</span>, <span class="n">480</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">37</td><td>     </td></tr><tr><td class="number">38</td><td>      play_state <span class="k3">=</span> PLAYING<span class="k2">;</span></td></tr><tr><td class="number">39</td><td>&#160;</td></tr><tr><td class="number">40</td><td>      <span class="k1">while</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_ESC<span class="k2">]</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> play_state <span class="k3">=</span><span class="k3">=</span> PLAYING<span class="k2">)</span></td></tr><tr><td class="number">41</td><td>      <span class="k2">{</span></td></tr><tr><td class="number">42</td><td>         logic_calls <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">43</td><td>         </td></tr><tr><td class="number">44</td><td>         <span class="k1">while</span><span class="k2">(</span>ticks <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">45</td><td>         <span class="k2">{</span></td></tr><tr><td class="number">46</td><td>            <a href="http://www.allegro.cc/manual/rest" target="_blank"><span class="a">rest</span></a><span class="k2">(</span><span class="n">100</span> <span class="k3">/</span> updates_per_second<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">47</td><td>         <span class="k2">}</span></td></tr><tr><td class="number">48</td><td>         </td></tr><tr><td class="number">49</td><td>&#160;</td></tr><tr><td class="number">50</td><td>         <span class="k1">while</span><span class="k2">(</span>ticks <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">51</td><td>         <span class="k2">{</span></td></tr><tr><td class="number">52</td><td>               old_ticks <span class="k3">=</span> ticks<span class="k2">;</span></td></tr><tr><td class="number">53</td><td>&#160;</td></tr><tr><td class="number">54</td><td>               <span class="k3">+</span><span class="k3">+</span>logic_calls<span class="k2">;</span></td></tr><tr><td class="number">55</td><td>&#160;</td></tr><tr><td class="number">56</td><td>               <span class="k1">if</span><span class="k2">(</span>hero.opening_door <span class="k3">=</span><span class="k3">=</span> OPENING<span class="k2">)</span></td></tr><tr><td class="number">57</td><td>               <span class="k2">{</span></td></tr><tr><td class="number">58</td><td>                   <span class="k1">if</span><span class="k2">(</span>door_opening_info.anim_delay_counter <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">59</td><td>                   <span class="k2">{</span></td></tr><tr><td class="number">60</td><td>                       <span class="k3">-</span><span class="k3">-</span>door_opening_info.anim_delay_counter<span class="k2">;</span></td></tr><tr><td class="number">61</td><td>                       door_opening_info.change_frame <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span><span class="k2">;</span></td></tr><tr><td class="number">62</td><td>                   <span class="k2">}</span></td></tr><tr><td class="number">63</td><td>                   <span class="k1">else</span></td></tr><tr><td class="number">64</td><td>                   <span class="k2">{</span></td></tr><tr><td class="number">65</td><td>                       door_opening_info.change_frame <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">66</td><td>                       door_opening_info.anim_delay_counter <span class="k3">=</span> door_opening_info.anim_ticks_per_frame<span class="k2">;</span></td></tr><tr><td class="number">67</td><td>                   <span class="k2">}</span></td></tr><tr><td class="number">68</td><td>               <span class="k2">}</span></td></tr><tr><td class="number">69</td><td>&#160;</td></tr><tr><td class="number">70</td><td>&#160;</td></tr><tr><td class="number">71</td><td>               <span class="k1">if</span><span class="k2">(</span>water_animation_info.anim_delay_counter <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">72</td><td>                  water_animation_info.anim_delay_counter--<span class="k2">;</span></td></tr><tr><td class="number">73</td><td>                  water_animation_info.draw <span class="k3">=</span> DONT_DRAW<span class="k2">;</span></td></tr><tr><td class="number">74</td><td>               <span class="k2">}</span></td></tr><tr><td class="number">75</td><td>               <span class="k1">else</span></td></tr><tr><td class="number">76</td><td>               <span class="k2">{</span></td></tr><tr><td class="number">77</td><td>                   water_animation_info.draw <span class="k3">=</span> DRAW<span class="k2">;</span></td></tr><tr><td class="number">78</td><td>                   water_animation_info.anim_delay_counter <span class="k3">=</span> water_animation_info.anim_ticks_per_frame<span class="k2">;</span></td></tr><tr><td class="number">79</td><td>               <span class="k2">}</span></td></tr><tr><td class="number">80</td><td>&#160;</td></tr><tr><td class="number">81</td><td>&#160;</td></tr><tr><td class="number">82</td><td>               <span class="k1">if</span><span class="k2">(</span>hero.anim_delay_counter <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">83</td><td>               <span class="k2">{</span></td></tr><tr><td class="number">84</td><td>                   <span class="k3">-</span><span class="k3">-</span>hero.anim_delay_counter<span class="k2">;</span></td></tr><tr><td class="number">85</td><td>                   hero.update <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">86</td><td>               <span class="k2">}</span></td></tr><tr><td class="number">87</td><td>               <span class="k1">else</span></td></tr><tr><td class="number">88</td><td>               <span class="k2">{</span></td></tr><tr><td class="number">89</td><td>                   hero.update <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">90</td><td>                   hero.anim_delay_counter <span class="k3">=</span> hero.anim_ticks_per_frame<span class="k2">;</span></td></tr><tr><td class="number">91</td><td>               <span class="k2">}</span></td></tr><tr><td class="number">92</td><td>&#160;</td></tr><tr><td class="number">93</td><td>&#160;</td></tr><tr><td class="number">94</td><td>               do_non_drawing<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">95</td><td>               ticks--<span class="k2">;</span></td></tr><tr><td class="number">96</td><td>               <span class="k1">if</span><span class="k2">(</span>old_ticks <span class="k3">&lt;</span><span class="k3">=</span> ticks<span class="k2">)</span> <span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">97</td><td>&#160;</td></tr><tr><td class="number">98</td><td>         <span class="k2">}</span></td></tr><tr><td class="number">99</td><td>&#160;</td></tr><tr><td class="number">100</td><td>&#160;</td></tr><tr><td class="number">101</td><td>&#160;</td></tr><tr><td class="number">102</td><td>         draw_everything_to_buffer<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">103</td><td>         <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>buffer, <a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">640</span>, <span class="n">480</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">104</td><td>&#160;</td></tr><tr><td class="number">105</td><td>         <span class="k1">if</span><span class="k2">(</span>hero.leaving_level<span class="k2">)</span></td></tr><tr><td class="number">106</td><td>         <span class="k2">{</span></td></tr><tr><td class="number">107</td><td>             hero.level_exit_x <span class="k3">=</span> hero.x<span class="k2">;</span></td></tr><tr><td class="number">108</td><td>             hero.level_exit_y <span class="k3">=</span> hero.y<span class="k2">;</span></td></tr><tr><td class="number">109</td><td>&#160;</td></tr><tr><td class="number">110</td><td>             initialise_next_level<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">111</td><td>             play_state <span class="k3">=</span> LEAVE_LEVEL<span class="k2">;</span></td></tr><tr><td class="number">112</td><td>         <span class="k2">}</span></td></tr><tr><td class="number">113</td><td>&#160;</td></tr><tr><td class="number">114</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">115</td><td>&#160;</td></tr><tr><td class="number">116</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">117</td><td>&#160;</td></tr><tr><td class="number">118</td><td>&#160;</td></tr><tr><td class="number">119</td><td>   <a href="http://www.delorie.com/djgpp/doc/libc/libc_308.html" target="_blank">fclose</a><span class="k2">(</span>logfile<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">120</td><td>   <a href="http://www.allegro.cc/manual/save_bitmap" target="_blank"><span class="a">save_bitmap</span></a><span class="k2">(</span><span class="s">"buffer.bmp"</span>, buffer, NULL<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">121</td><td>&#160;</td></tr><tr><td class="number">122</td><td>   <a href="http://www.allegro.cc/manual/allegro_exit" target="_blank"><span class="a">allegro_exit</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">123</td><td>   <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">124</td><td><span class="k2">}</span></td></tr><tr><td class="number">125</td><td><a href="http://www.allegro.cc/manual/END_OF_MAIN" target="_blank"><span class="a">END_OF_MAIN</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr></tbody></table></div></div><p>




</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">void</span> do_non_drawing<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span></td></tr><tr><td class="number">2</td><td><span class="k2">{</span></td></tr><tr><td class="number">3</td><td>    <span class="c">/* if hero.animating is IN_ANIMATION then just need</span></td></tr><tr><td class="number">4</td><td><span class="c">    to draw him in next position.</span></td></tr><tr><td class="number">5</td><td><span class="c">    hero.animating needs to be changed to IN_ANIMATION when :</span></td></tr><tr><td class="number">6</td><td><span class="c">          it's been determined that he'll move</span></td></tr><tr><td class="number">7</td><td><span class="c">          when's this ?</span></td></tr><tr><td class="number">8</td><td><span class="c">          when determine_heros_move is called.</span></td></tr><tr><td class="number">9</td><td><span class="c">    On the other hand it has to be changed to NOT_IN_ANIMATION when :</span></td></tr><tr><td class="number">10</td><td><span class="c">          he's finished moving or whatever he was doing.</span></td></tr><tr><td class="number">11</td><td><span class="c"></span></td></tr><tr><td class="number">12</td><td><span class="c">    */</span></td></tr><tr><td class="number">13</td><td>&#160;</td></tr><tr><td class="number">14</td><td>    <span class="k1">if</span><span class="k2">(</span>hero.update <span class="k3">&amp;</span><span class="k3">&amp;</span> hero.animating <span class="k3">=</span><span class="k3">=</span> NOT_IN_ANIMATION<span class="k2">)</span></td></tr><tr><td class="number">15</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">16</td><td>        get_hero_input<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">17</td><td>        <span class="c">/* assigns hero.direction_hero_wants_to_move</span></td></tr><tr><td class="number">18</td><td><span class="c">               hero.trying_to_push</span></td></tr><tr><td class="number">19</td><td><span class="c">               hero.trying_to_pull              */</span></td></tr><tr><td class="number">20</td><td>&#160;</td></tr><tr><td class="number">21</td><td>        hero.what_hero_can_do <span class="k3">=</span> determine_heros_move<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">22</td><td>&#160;</td></tr><tr><td class="number">23</td><td>&#160;</td></tr><tr><td class="number">24</td><td>&#160;</td></tr><tr><td class="number">25</td><td>        <span class="k1">if</span><span class="k2">(</span>   hero.what_hero_can_do <span class="k3">=</span><span class="k3">=</span> MOVE_ONLY</td></tr><tr><td class="number">26</td><td>           <span class="k3">|</span><span class="k3">|</span> hero.what_hero_can_do <span class="k3">=</span><span class="k3">=</span> JUST_HOLD</td></tr><tr><td class="number">27</td><td>           <span class="k3">|</span><span class="k3">|</span> hero.what_hero_can_do <span class="k3">=</span><span class="k3">=</span> JUST_UNHOLD</td></tr><tr><td class="number">28</td><td>           <span class="k3">|</span><span class="k3">|</span> hero.what_hero_can_do <span class="k3">=</span><span class="k3">=</span> MOVE_AND_PULL</td></tr><tr><td class="number">29</td><td>           <span class="k3">|</span><span class="k3">|</span> hero.what_hero_can_do <span class="k3">=</span><span class="k3">=</span> MOVE_AND_PUSH</td></tr><tr><td class="number">30</td><td>           <span class="k3">|</span><span class="k3">|</span> hero.what_hero_can_do <span class="k3">=</span><span class="k3">=</span> REACH</td></tr><tr><td class="number">31</td><td>           <span class="k3">|</span><span class="k3">|</span> hero.what_hero_can_do <span class="k3">=</span><span class="k3">=</span> UNREACH<span class="k2">)</span></td></tr><tr><td class="number">32</td><td>        <span class="k2">{</span></td></tr><tr><td class="number">33</td><td>               hero.animating <span class="k3">=</span> IN_ANIMATION<span class="k2">;</span></td></tr><tr><td class="number">34</td><td>        <span class="k2">}</span></td></tr><tr><td class="number">35</td><td>&#160;</td></tr><tr><td class="number">36</td><td>        update_hero_frame_and_position<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">37</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">38</td><td>&#160;</td></tr><tr><td class="number">39</td><td>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>hero.update<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">40</td><td>       update_hero_frame_and_position<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">41</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">42</td><td>&#160;</td></tr><tr><td class="number">43</td><td>    <span class="c">/* shapes_info.shape_being_moved</span></td></tr><tr><td class="number">44</td><td><span class="c">       needs to be changed to NOT_BEING_MOVED because draw_shapes() must only be called</span></td></tr><tr><td class="number">45</td><td><span class="c">       when a shape needs moving on the "tops" bitmap. Can writing comments like this solve</span></td></tr><tr><td class="number">46</td><td><span class="c">       problems ? That's what I want to find out by trying. */</span></td></tr><tr><td class="number">47</td><td>&#160;</td></tr><tr><td class="number">48</td><td>&#160;</td></tr><tr><td class="number">49</td><td>&#160;</td></tr><tr><td class="number">50</td><td>    <span class="k1">if</span><span class="k2">(</span>outcast.level_has_outcast<span class="k2">)</span>  update_outcast<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">51</td><td>&#160;</td></tr><tr><td class="number">52</td><td>&#160;</td></tr><tr><td class="number">53</td><td>    <span class="k1">if</span><span class="k2">(</span>hero.update <span class="k3">&amp;</span><span class="k3">&amp;</span> shapes_info.needs_drawing <span class="k3">=</span><span class="k3">=</span> NEEDS_DRAWING<span class="k2">)</span> update_moving_shapes<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">54</td><td>&#160;</td></tr><tr><td class="number">55</td><td>&#160;</td></tr><tr><td class="number">56</td><td>    <span class="k1">if</span><span class="k2">(</span>hero.opening_door <span class="k3">=</span><span class="k3">=</span> OPENING <span class="k3">&amp;</span><span class="k3">&amp;</span> door_opening_info.change_frame <span class="k3">=</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span></td></tr><tr><td class="number">57</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">58</td><td>        <span class="k3">+</span><span class="k3">+</span>door_opening_info.door_frame<span class="k2">;</span></td></tr><tr><td class="number">59</td><td>        <span class="k1">if</span><span class="k2">(</span>door_opening_info.door_frame <span class="k3">=</span><span class="k3">=</span> NUMBER_OF_FRAMES_FOR_DOOR_ANIMATION <span class="k3">+</span> <span class="n">2</span><span class="k2">)</span></td></tr><tr><td class="number">60</td><td>        <span class="k2">{</span></td></tr><tr><td class="number">61</td><td>           <span class="k3">-</span><span class="k3">-</span>door_opening_info.door_frame<span class="k2">;</span></td></tr><tr><td class="number">62</td><td>        <span class="k2">}</span></td></tr><tr><td class="number">63</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">64</td><td>&#160;</td></tr><tr><td class="number">65</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

That&#39;s my logic loop. Please forgive the crazy commenting.</p><p>The hero struct is :</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td>&#160;</td></tr><tr><td class="number">2</td><td><span class="k1">struct</span> hero <span class="k2">{</span></td></tr><tr><td class="number">3</td><td>   <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>hwh<span class="k2">[</span>NUMBER_OF_WH_FRAMES<span class="k2">]</span><span class="k2">;</span> <span class="c">/* hero walking horizontally frames */</span></td></tr><tr><td class="number">4</td><td>   <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>hwd<span class="k2">[</span>NUMBER_OF_WALKING_DOWN_FRAMES<span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">5</td><td>   <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>hs<span class="k2">[</span>NUMBER_OF_STILL_FRAMES<span class="k2">]</span><span class="k2">;</span>         <span class="c">/* hero still */</span></td></tr><tr><td class="number">6</td><td>   <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>hh<span class="k2">[</span>NUMBER_OF_HOLDING_FRAMES<span class="k2">]</span><span class="k2">;</span>         <span class="c">/* hero holding */</span></td></tr><tr><td class="number">7</td><td>   <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>hp<span class="k2">[</span>NUMBER_OF_PULLING_FRAMES<span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">8</td><td>   <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>hrfu<span class="k2">[</span>NUMBER_OF_REACHING_FRAMES<span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">9</td><td>   <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>hrfa<span class="k2">[</span>NUMBER_OF_REACHING_FRAMES<span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">10</td><td>   <span class="k1">int</span> moving<span class="k2">;</span></td></tr><tr><td class="number">11</td><td>   <span class="k1">int</span> pushing<span class="k2">;</span></td></tr><tr><td class="number">12</td><td>&#160;</td></tr><tr><td class="number">13</td><td>   <span class="k1">unsigned</span> <span class="k1">short</span> animating<span class="k2">;</span></td></tr><tr><td class="number">14</td><td>   <span class="k1">int</span> direction_hero_wants_to_move<span class="k2">;</span></td></tr><tr><td class="number">15</td><td>   <span class="k1">short</span> trying_to_push<span class="k2">;</span></td></tr><tr><td class="number">16</td><td>   <span class="k1">short</span> trying_to_pull<span class="k2">;</span></td></tr><tr><td class="number">17</td><td>   <span class="k1">int</span> reaching_for_door<span class="k2">;</span></td></tr><tr><td class="number">18</td><td>   <span class="k1">short</span> direction_facing<span class="k2">;</span></td></tr><tr><td class="number">19</td><td>   <span class="k1">short</span> what_hero_can_do<span class="k2">;</span></td></tr><tr><td class="number">20</td><td>   <span class="k1">short</span> distance_from_xy<span class="k2">;</span></td></tr><tr><td class="number">21</td><td>   <span class="k1">int</span> x, y<span class="k2">;</span></td></tr><tr><td class="number">22</td><td>&#160;</td></tr><tr><td class="number">23</td><td>   <span class="k1">int</span> holding<span class="k2">;</span></td></tr><tr><td class="number">24</td><td>&#160;</td></tr><tr><td class="number">25</td><td>   <span class="k1">int</span> holding_frame<span class="k2">;</span></td></tr><tr><td class="number">26</td><td>   <span class="k1">int</span> reaching_frame<span class="k2">;</span></td></tr><tr><td class="number">27</td><td>   <span class="k1">int</span> opening_door<span class="k2">;</span></td></tr><tr><td class="number">28</td><td>   <span class="k1">int</span> opening_door_frame<span class="k2">;</span></td></tr><tr><td class="number">29</td><td>&#160;</td></tr><tr><td class="number">30</td><td>   <span class="k1">int</span> leaving_level<span class="k2">;</span></td></tr><tr><td class="number">31</td><td>   <span class="k1">unsigned</span> <span class="k1">short</span> increment_for_walking<span class="k2">;</span></td></tr><tr><td class="number">32</td><td>&#160;</td></tr><tr><td class="number">33</td><td>   <span class="k1">int</span> draw<span class="k2">;</span></td></tr><tr><td class="number">34</td><td>   <span class="k1">int</span> anim_delay_counter<span class="k2">;</span></td></tr><tr><td class="number">35</td><td>   <span class="k1">int</span> anim_ticks_per_frame<span class="k2">;</span></td></tr><tr><td class="number">36</td><td>   <span class="k1">int</span> update<span class="k2">;</span></td></tr><tr><td class="number">37</td><td>&#160;</td></tr><tr><td class="number">38</td><td>   <span class="k1">int</span> level_exit_x, level_exit_y<span class="k2">;</span></td></tr><tr><td class="number">39</td><td>&#160;</td></tr><tr><td class="number">40</td><td>&#160;</td></tr><tr><td class="number">41</td><td><span class="k2">}</span><span class="k2">;</span></td></tr></tbody></table></div></div><p>

not all it&#39;s members are still in use but I&#39;ve not gotten around to fleecing it yet.</p><p>This function :-</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td>&#160;</td></tr><tr><td class="number">2</td><td><span class="k1">void</span> initialise_hero_for_first_level<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span></td></tr><tr><td class="number">3</td><td><span class="k2">{</span></td></tr><tr><td class="number">4</td><td>   <span class="k1">int</span> x, y<span class="k2">;</span></td></tr><tr><td class="number">5</td><td>&#160;</td></tr><tr><td class="number">6</td><td>   hero.x <span class="k3">=</span> hero.y <span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">7</td><td>   <span class="c">/* Find out where hero starts. */</span></td></tr><tr><td class="number">8</td><td>   <span class="k1">for</span><span class="k2">(</span>y <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> y <span class="k3">&lt;</span> LEVEL_HEIGHT<span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>y<span class="k2">)</span></td></tr><tr><td class="number">9</td><td>      <span class="k1">for</span><span class="k2">(</span>x <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> x <span class="k3">&lt;</span> LEVEL_WIDTH<span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>x<span class="k2">)</span></td></tr><tr><td class="number">10</td><td>         <span class="k1">if</span><span class="k2">(</span>levels_array<span class="k2">[</span>current_level <span class="k3">-</span> <span class="n">1</span><span class="k2">]</span>.level<span class="k2">[</span>x<span class="k2">]</span><span class="k2">[</span>y<span class="k2">]</span>.level_map_colour <span class="k3">=</span><span class="k3">=</span> tc<span class="k2">[</span>PLAYER_START<span class="k2">]</span><span class="k2">)</span></td></tr><tr><td class="number">11</td><td>         <span class="k2">{</span></td></tr><tr><td class="number">12</td><td>            hero.x <span class="k3">=</span> x<span class="k2">;</span></td></tr><tr><td class="number">13</td><td>            hero.y <span class="k3">=</span> y<span class="k2">;</span></td></tr><tr><td class="number">14</td><td>         <span class="k2">}</span></td></tr><tr><td class="number">15</td><td>   <span class="k1">if</span><span class="k2">(</span>hero.x <span class="k3">=</span><span class="k3">=</span> <span class="k3">-</span><span class="n">1</span> <span class="k3">|</span><span class="k3">|</span> hero.y <span class="k3">=</span><span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">)</span></td></tr><tr><td class="number">16</td><td>   <span class="k2">{</span></td></tr><tr><td class="number">17</td><td>       print_error<span class="k2">(</span><span class="s">"In read_level.c : read_level() : PLAYER_START not found.\n\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td>       <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Level number %d."</span>, current_level <span class="k3">-</span> <span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">19</td><td>       exit_game<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">21</td><td>&#160;</td></tr><tr><td class="number">22</td><td>&#160;</td></tr><tr><td class="number">23</td><td>   hero.update <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td>   hero.anim_delay_counter <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">25</td><td>   hero.anim_ticks_per_frame <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td>&#160;</td></tr><tr><td class="number">27</td><td>   hero.animating <span class="k3">=</span> NOT_IN_ANIMATION<span class="k2">;</span></td></tr><tr><td class="number">28</td><td>   hero.direction_facing <span class="k3">=</span> FACING_RIGHT<span class="k2">;</span></td></tr><tr><td class="number">29</td><td>   hero.trying_to_push <span class="k3">=</span> NOT_TRYING<span class="k2">;</span></td></tr><tr><td class="number">30</td><td>   hero.trying_to_pull <span class="k3">=</span> NOT_TRYING<span class="k2">;</span></td></tr><tr><td class="number">31</td><td>   hero.holding <span class="k3">=</span> NOT_HOLDING<span class="k2">;</span></td></tr><tr><td class="number">32</td><td>   hero.increment_for_walking <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">33</td><td>   hero.reaching_frame <span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">34</td><td>   hero.reaching_for_door <span class="k3">=</span> NOT_REACHING<span class="k2">;</span></td></tr><tr><td class="number">35</td><td>   hero.opening_door <span class="k3">=</span> NOT_OPENING<span class="k2">;</span></td></tr><tr><td class="number">36</td><td>&#160;</td></tr><tr><td class="number">37</td><td>   hero.leaving_level <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">38</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

sets things up.</p><p>Really appreciate your willingness to help.</p><p>edit : ...and I&#39;ll be happy to post any more code that needs to be seen.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (William Labbett)</author>
		<pubDate>Tue, 10 Feb 2009 18:16:59 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Give your project a profiling party. It will help you that much for finding where exactly you consume the most part of your cpu time.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (GullRaDriel)</author>
		<pubDate>Tue, 10 Feb 2009 20:18:15 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>what&#39;s a profiling party please ?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (William Labbett)</author>
		<pubDate>Tue, 10 Feb 2009 20:45:18 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Example:</p><p>I compiled an old project with the following gcc flags for activating profiling: -pg</p><p>After what I launch my code one time, I play with it, and after exiting I call gprof.</p><p>Here are the commands and the result:
</p><div class="source-code snippet"><div class="inner"><pre>gcc <span class="k3">-</span>c <span class="k3">-</span>Wall <span class="k3">-</span>pedantic <span class="k3">-</span>pg <span class="k3">-</span>mwindows <span class="k3">*</span>.c
gcc <span class="k3">-</span>pg <span class="k3">-</span>o test.exe MapEditor.o m_action.o m_grafic.o m_help.o m_ressource.o <span class="k3">-</span>lnilorea <span class="k3">-</span>lagl <span class="k3">-</span>lalleg <span class="k3">-</span>luser32 <span class="k3">-</span>lgdi32 <span class="k3">-</span>lopengl32 <span class="k3">-</span>lglu32 <span class="k3">-</span>lglaux <span class="k3">-</span>lwsock32 <span class="k3">-</span>lws2_32 <span class="k3">-</span>lpthreadGC2
</pre></div></div><p>

</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td>test.exe</td></tr><tr><td class="number">2</td><td>Done <span class="k3">!</span></td></tr><tr><td class="number">3</td><td>gprof test.exe</td></tr><tr><td class="number">4</td><td>Flat profile:</td></tr><tr><td class="number">5</td><td>&#160;</td></tr><tr><td class="number">6</td><td>Each sample counts as <span class="n">0</span>.<span class="n">01</span> seconds.</td></tr><tr><td class="number">7</td><td>  %   cumulative   self              self     total</td></tr><tr><td class="number">8</td><td> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a>   seconds   seconds    calls  Ts<span class="k3">/</span>call  Ts<span class="k3">/</span>call  name</td></tr><tr><td class="number">9</td><td> <span class="n">33</span>.<span class="n">33</span>      <span class="n">0</span>.<span class="n">01</span>     <span class="n">0</span>.<span class="n">01</span>                             allegro_gl_is_extension_s</td></tr><tr><td class="number">10</td><td> <span class="n">33</span>.<span class="n">33</span>      <span class="n">0</span>.<span class="n">02</span>     <span class="n">0</span>.<span class="n">01</span>                             draw_map</td></tr><tr><td class="number">11</td><td> <span class="n">33</span>.<span class="n">33</span>      <span class="n">0</span>.<span class="n">03</span>     <span class="n">0</span>.<span class="n">01</span>                             split_color</td></tr><tr><td class="number">12</td><td>  <span class="n">0</span>.<span class="n">00</span>      <span class="n">0</span>.<span class="n">03</span>     <span class="n">0</span>.<span class="n">00</span>      <span class="n">365</span>     <span class="n">0</span>.<span class="n">00</span>     <span class="n">0</span>.<span class="n">00</span>  draw_gui</td></tr><tr><td class="number">13</td><td>  <span class="n">0</span>.<span class="n">00</span>      <span class="n">0</span>.<span class="n">03</span>     <span class="n">0</span>.<span class="n">00</span>        <span class="n">3</span>     <span class="n">0</span>.<span class="n">00</span>     <span class="n">0</span>.<span class="n">00</span>  clear</td></tr><tr><td class="number">14</td><td>  <span class="n">0</span>.<span class="n">00</span>      <span class="n">0</span>.<span class="n">03</span>     <span class="n">0</span>.<span class="n">00</span>        <span class="n">1</span>     <span class="n">0</span>.<span class="n">00</span>     <span class="n">0</span>.<span class="n">00</span>  at_exit_job</td></tr><tr><td class="number">15</td><td>  <span class="n">0</span>.<span class="n">00</span>      <span class="n">0</span>.<span class="n">03</span>     <span class="n">0</span>.<span class="n">00</span>        <span class="n">1</span>     <span class="n">0</span>.<span class="n">00</span>     <span class="n">0</span>.<span class="n">00</span>  create_new_map</td></tr><tr><td class="number">16</td><td>&#160;</td></tr><tr><td class="number">17</td><td> %         the percentage of the total running <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> of the</td></tr><tr><td class="number">18</td><td><a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a>       program used by <span class="k1">this</span> function.</td></tr><tr><td class="number">19</td><td>&#160;</td></tr><tr><td class="number">20</td><td>cumulative a running sum of the number of seconds accounted</td></tr><tr><td class="number">21</td><td> seconds   <span class="k1">for</span> by <span class="k1">this</span> function <span class="k1">and</span> those listed above it.</td></tr><tr><td class="number">22</td><td>&#160;</td></tr><tr><td class="number">23</td><td> self      the number of seconds accounted <span class="k1">for</span> by <span class="k1">this</span></td></tr><tr><td class="number">24</td><td>seconds    function alone.  This is the major sort <span class="k1">for</span> <span class="k1">this</span></td></tr><tr><td class="number">25</td><td>           listing.</td></tr><tr><td class="number">26</td><td>&#160;</td></tr><tr><td class="number">27</td><td>calls      the number of <a href="http://www.delorie.com/djgpp/doc/libc/libc_822.html" target="_blank">times</a> <span class="k1">this</span> function was invoked, <span class="k1">if</span></td></tr><tr><td class="number">28</td><td>           <span class="k1">this</span> function is profiled, <span class="k1">else</span> blank.</td></tr><tr><td class="number">29</td><td>&#160;</td></tr><tr><td class="number">30</td><td> self      the average number of milliseconds spent in <span class="k1">this</span></td></tr><tr><td class="number">31</td><td>ms<span class="k3">/</span>call    function per call, <span class="k1">if</span> <span class="k1">this</span> function is profiled,</td></tr><tr><td class="number">32</td><td>           <span class="k1">else</span> blank.</td></tr><tr><td class="number">33</td><td>&#160;</td></tr><tr><td class="number">34</td><td> total     the average number of milliseconds spent in <span class="k1">this</span></td></tr><tr><td class="number">35</td><td>ms<span class="k3">/</span>call    function <span class="k1">and</span> its descendents per call, <span class="k1">if</span> <span class="k1">this</span></td></tr><tr><td class="number">36</td><td>           function is profiled, <span class="k1">else</span> blank.</td></tr><tr><td class="number">37</td><td>&#160;</td></tr><tr><td class="number">38</td><td>name       the name of the function.  This is the minor sort</td></tr><tr><td class="number">39</td><td>           <span class="k1">for</span> <span class="k1">this</span> listing. The <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a> shows the location of</td></tr><tr><td class="number">40</td><td>           the function in the gprof listing. If the <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a> is</td></tr><tr><td class="number">41</td><td>           in parenthesis it shows where it would appear in</td></tr><tr><td class="number">42</td><td>           the gprof listing <span class="k1">if</span> it were to be printed.</td></tr><tr><td class="number">43</td><td>♀</td></tr><tr><td class="number">44</td><td>                     Call graph <span class="k2">(</span>explanation follows<span class="k2">)</span></td></tr><tr><td class="number">45</td><td>&#160;</td></tr><tr><td class="number">46</td><td>&#160;</td></tr><tr><td class="number">47</td><td>granularity: each sample hit covers <span class="n">4</span> byte<span class="k2">(</span>s<span class="k2">)</span> <span class="k1">for</span> <span class="n">33</span>.<span class="n">33</span>% of <span class="n">0</span>.<span class="n">03</span> seconds</td></tr><tr><td class="number">48</td><td>&#160;</td></tr><tr><td class="number">49</td><td><a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a> % <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a>    self  children    called     name</td></tr><tr><td class="number">50</td><td>                                                 <span class="k3">&lt;</span>spontaneous&gt;</td></tr><tr><td class="number">51</td><td><span class="k2">[</span><span class="n">1</span><span class="k2">]</span>     <span class="n">33</span>.<span class="n">3</span>    <span class="n">0</span>.<span class="n">01</span>    <span class="n">0</span>.<span class="n">00</span>                 allegro_gl_is_extension_supported</td></tr><tr><td class="number">52</td><td><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span></td></tr><tr><td class="number">53</td><td>                                                 <span class="k3">&lt;</span>spontaneous&gt;</td></tr><tr><td class="number">54</td><td><span class="k2">[</span><span class="n">2</span><span class="k2">]</span>     <span class="n">33</span>.<span class="n">3</span>    <span class="n">0</span>.<span class="n">01</span>    <span class="n">0</span>.<span class="n">00</span>                 draw_map <span class="k2">[</span><span class="n">2</span><span class="k2">]</span></td></tr><tr><td class="number">55</td><td><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span></td></tr><tr><td class="number">56</td><td>                                                 <span class="k3">&lt;</span>spontaneous&gt;</td></tr><tr><td class="number">57</td><td><span class="k2">[</span><span class="n">3</span><span class="k2">]</span>     <span class="n">33</span>.<span class="n">3</span>    <span class="n">0</span>.<span class="n">01</span>    <span class="n">0</span>.<span class="n">00</span>                 split_color <span class="k2">[</span><span class="n">3</span><span class="k2">]</span></td></tr><tr><td class="number">58</td><td><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span></td></tr><tr><td class="number">59</td><td>                <span class="n">0</span>.<span class="n">00</span>    <span class="n">0</span>.<span class="n">00</span>     <span class="n">365</span><span class="k3">/</span><span class="n">365</span>         main <span class="k2">[</span><span class="n">464</span><span class="k2">]</span></td></tr><tr><td class="number">60</td><td><span class="k2">[</span><span class="n">6</span><span class="k2">]</span>      <span class="n">0</span>.<span class="n">0</span>    <span class="n">0</span>.<span class="n">00</span>    <span class="n">0</span>.<span class="n">00</span>     <span class="n">365</span>         draw_gui <span class="k2">[</span><span class="n">6</span><span class="k2">]</span></td></tr><tr><td class="number">61</td><td><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span></td></tr><tr><td class="number">62</td><td>                <span class="n">0</span>.<span class="n">00</span>    <span class="n">0</span>.<span class="n">00</span>       <span class="n">3</span><span class="k3">/</span><span class="n">3</span>           main <span class="k2">[</span><span class="n">464</span><span class="k2">]</span></td></tr><tr><td class="number">63</td><td><span class="k2">[</span><span class="n">7</span><span class="k2">]</span>      <span class="n">0</span>.<span class="n">0</span>    <span class="n">0</span>.<span class="n">00</span>    <span class="n">0</span>.<span class="n">00</span>       <span class="n">3</span>         clear <span class="k2">[</span><span class="n">7</span><span class="k2">]</span></td></tr><tr><td class="number">64</td><td><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span></td></tr><tr><td class="number">65</td><td>                <span class="n">0</span>.<span class="n">00</span>    <span class="n">0</span>.<span class="n">00</span>       <span class="n">1</span><span class="k3">/</span><span class="n">1</span>           main <span class="k2">[</span><span class="n">464</span><span class="k2">]</span></td></tr><tr><td class="number">66</td><td><span class="k2">[</span><span class="n">8</span><span class="k2">]</span>      <span class="n">0</span>.<span class="n">0</span>    <span class="n">0</span>.<span class="n">00</span>    <span class="n">0</span>.<span class="n">00</span>       <span class="n">1</span>         at_exit_job <span class="k2">[</span><span class="n">8</span><span class="k2">]</span></td></tr><tr><td class="number">67</td><td><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span></td></tr><tr><td class="number">68</td><td>                <span class="n">0</span>.<span class="n">00</span>    <span class="n">0</span>.<span class="n">00</span>       <span class="n">1</span><span class="k3">/</span><span class="n">1</span>           main <span class="k2">[</span><span class="n">464</span><span class="k2">]</span></td></tr><tr><td class="number">69</td><td><span class="k2">[</span><span class="n">9</span><span class="k2">]</span>      <span class="n">0</span>.<span class="n">0</span>    <span class="n">0</span>.<span class="n">00</span>    <span class="n">0</span>.<span class="n">00</span>       <span class="n">1</span>         create_new_map <span class="k2">[</span><span class="n">9</span><span class="k2">]</span></td></tr><tr><td class="number">70</td><td><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span></td></tr><tr><td class="number">71</td><td>&#160;</td></tr><tr><td class="number">72</td><td> This table describes the call tree of the program, <span class="k1">and</span> was sorted by</td></tr><tr><td class="number">73</td><td> the total amount of <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> spent in each function <span class="k1">and</span> its children.</td></tr><tr><td class="number">74</td><td>&#160;</td></tr><tr><td class="number">75</td><td> Each entry in <span class="k1">this</span> table consists of several lines.  The <a href="http://www.allegro.cc/manual/line" target="_blank"><span class="a">line</span></a> with the</td></tr><tr><td class="number">76</td><td> <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a> number at the left hand margin lists the current function.</td></tr><tr><td class="number">77</td><td> The lines above it list the functions that called <span class="k1">this</span> function,</td></tr><tr><td class="number">78</td><td> <span class="k1">and</span> the lines below it list the functions <span class="k1">this</span> one called.</td></tr><tr><td class="number">79</td><td> This <a href="http://www.allegro.cc/manual/line" target="_blank"><span class="a">line</span></a> lists:</td></tr><tr><td class="number">80</td><td>     <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a>      A unique number given to each element of the table.</td></tr><tr><td class="number">81</td><td>                Index numbers are sorted numerically.</td></tr><tr><td class="number">82</td><td>                The <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a> number is printed next to every function name so</td></tr><tr><td class="number">83</td><td>                it is easier to look up where the function in the table.</td></tr><tr><td class="number">84</td><td>&#160;</td></tr><tr><td class="number">85</td><td>     % <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a>     This is the percentage of the `total<span class="s">' time that was spent</span></td></tr><tr><td class="number">86</td><td><span class="s">                in this function and its children.  Note that due to</span></td></tr><tr><td class="number">87</td><td><span class="s">                different viewpoints, functions excluded by options, etc,</span></td></tr><tr><td class="number">88</td><td><span class="s">                these numbers will NOT add up to 100%.</span></td></tr><tr><td class="number">89</td><td><span class="s"></span></td></tr><tr><td class="number">90</td><td><span class="s">     self       This is the total amount of time spent in this function.</span></td></tr><tr><td class="number">91</td><td><span class="s"></span></td></tr><tr><td class="number">92</td><td><span class="s">     children   This is the total amount of time propagated into this</span></td></tr><tr><td class="number">93</td><td><span class="s">                function by its children.</span></td></tr><tr><td class="number">94</td><td><span class="s"></span></td></tr><tr><td class="number">95</td><td><span class="s">     called     This is the number of times the function was called.</span></td></tr><tr><td class="number">96</td><td><span class="s">                If the function called itself recursively, the number</span></td></tr><tr><td class="number">97</td><td><span class="s">                only includes non-recursive calls, and is followed by</span></td></tr><tr><td class="number">98</td><td><span class="s">                a `+'</span> <span class="k1">and</span> the number of recursive calls.</td></tr><tr><td class="number">99</td><td>&#160;</td></tr><tr><td class="number">100</td><td>     name       The name of the current function.  The <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a> number is</td></tr><tr><td class="number">101</td><td>                printed after it.  If the function is a member of a</td></tr><tr><td class="number">102</td><td>                cycle, the cycle number is printed between the</td></tr><tr><td class="number">103</td><td>                function<span class="s">'s name and the index number.</span></td></tr><tr><td class="number">104</td><td><span class="s"></span></td></tr><tr><td class="number">105</td><td><span class="s"></span></td></tr><tr><td class="number">106</td><td><span class="s"> For the function'</span>s parents, the fields have the following meanings:</td></tr><tr><td class="number">107</td><td>&#160;</td></tr><tr><td class="number">108</td><td>     self       This is the amount of <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> that was propagated directly</td></tr><tr><td class="number">109</td><td>                from the function into <span class="k1">this</span> parent.</td></tr><tr><td class="number">110</td><td>&#160;</td></tr><tr><td class="number">111</td><td>     children   This is the amount of <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> that was propagated from</td></tr><tr><td class="number">112</td><td>                the function<span class="s">'s children into this parent.</span></td></tr><tr><td class="number">113</td><td><span class="s"></span></td></tr><tr><td class="number">114</td><td><span class="s">     called     This is the number of times this parent called the</span></td></tr><tr><td class="number">115</td><td><span class="s">                function `/'</span> the total number of <a href="http://www.delorie.com/djgpp/doc/libc/libc_822.html" target="_blank">times</a> the function</td></tr><tr><td class="number">116</td><td>                was called.  Recursive calls to the function are <span class="k1">not</span></td></tr><tr><td class="number">117</td><td>                included in the number after the `<span class="k3">/</span><span class="s">'.</span></td></tr><tr><td class="number">118</td><td><span class="s"></span></td></tr><tr><td class="number">119</td><td><span class="s">     name       This is the name of the parent.  The parent'</span>s <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a></td></tr><tr><td class="number">120</td><td>                number is printed after it.  If the parent is a</td></tr><tr><td class="number">121</td><td>                member of a cycle, the cycle number is printed between</td></tr><tr><td class="number">122</td><td>                the name <span class="k1">and</span> the <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a> number.</td></tr><tr><td class="number">123</td><td>&#160;</td></tr><tr><td class="number">124</td><td> If the parents of the function cannot be determined, the word</td></tr><tr><td class="number">125</td><td> `<span class="k3">&lt;</span>spontaneous&gt;<span class="s">' is printed in the `name'</span> field, <span class="k1">and</span> all the other</td></tr><tr><td class="number">126</td><td> fields are blank.</td></tr><tr><td class="number">127</td><td>&#160;</td></tr><tr><td class="number">128</td><td> For the function<span class="s">'s children, the fields have the following meanings:</span></td></tr><tr><td class="number">129</td><td><span class="s"></span></td></tr><tr><td class="number">130</td><td><span class="s">     self       This is the amount of time that was propagated directly</span></td></tr><tr><td class="number">131</td><td><span class="s">                from the child into the function.</span></td></tr><tr><td class="number">132</td><td><span class="s"></span></td></tr><tr><td class="number">133</td><td><span class="s">     children   This is the amount of time that was propagated from the</span></td></tr><tr><td class="number">134</td><td><span class="s">                child'</span>s children to the function.</td></tr><tr><td class="number">135</td><td>&#160;</td></tr><tr><td class="number">136</td><td>     called     This is the number of <a href="http://www.delorie.com/djgpp/doc/libc/libc_822.html" target="_blank">times</a> the function called</td></tr><tr><td class="number">137</td><td>                <span class="k1">this</span> child `<span class="k3">/</span><span class="s">' the total number of times the child</span></td></tr><tr><td class="number">138</td><td><span class="s">                was called.  Recursive calls by the child are not</span></td></tr><tr><td class="number">139</td><td><span class="s">                listed in the number after the `/'</span>.</td></tr><tr><td class="number">140</td><td>&#160;</td></tr><tr><td class="number">141</td><td>     name       This is the name of the child.  The child<span class="s">'s index</span></td></tr><tr><td class="number">142</td><td><span class="s">                number is printed after it.  If the child is a</span></td></tr><tr><td class="number">143</td><td><span class="s">                member of a cycle, the cycle number is printed</span></td></tr><tr><td class="number">144</td><td><span class="s">                between the name and the index number.</span></td></tr><tr><td class="number">145</td><td><span class="s"></span></td></tr><tr><td class="number">146</td><td><span class="s"> If there are any cycles (circles) in the call graph, there is an</span></td></tr><tr><td class="number">147</td><td><span class="s"> entry for the cycle-as-a-whole.  This entry shows who called the</span></td></tr><tr><td class="number">148</td><td><span class="s"> cycle (as parents) and the members of the cycle (as children.)</span></td></tr><tr><td class="number">149</td><td><span class="s"> The `+'</span> recursive calls entry shows the number of function calls that</td></tr><tr><td class="number">150</td><td> were internal to the cycle, <span class="k1">and</span> the calls entry <span class="k1">for</span> each member shows,</td></tr><tr><td class="number">151</td><td> <span class="k1">for</span> that member, how many <a href="http://www.delorie.com/djgpp/doc/libc/libc_822.html" target="_blank">times</a> it was called from other members of</td></tr><tr><td class="number">152</td><td> the cycle.</td></tr><tr><td class="number">153</td><td>&#160;</td></tr><tr><td class="number">154</td><td>♀</td></tr><tr><td class="number">155</td><td>Index by function name</td></tr><tr><td class="number">156</td><td>&#160;</td></tr><tr><td class="number">157</td><td>   <span class="k2">[</span><span class="n">1</span><span class="k2">]</span> allegro_gl_is_extension_supported <span class="k2">[</span><span class="n">9</span><span class="k2">]</span> create_new_map <span class="k2">[</span><span class="n">3</span><span class="k2">]</span> split_color</td></tr><tr><td class="number">158</td><td>   <span class="k2">[</span><span class="n">8</span><span class="k2">]</span> at_exit_job             <span class="k2">[</span><span class="n">6</span><span class="k2">]</span> draw_gui</td></tr><tr><td class="number">159</td><td>   <span class="k2">[</span><span class="n">7</span><span class="k2">]</span> clear                   <span class="k2">[</span><span class="n">2</span><span class="k2">]</span> draw_map</td></tr></tbody></table></div></div><p>

And now I know where my time was mostly spent.</p><p>My top two eating functions are allegro_gl_is_extension_s and draw_map. Obvious, but sometime it helps.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (GullRaDriel)</author>
		<pubDate>Tue, 10 Feb 2009 21:27:05 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>thanks Gull..</p><p>I tried it but I get :-</p><p>http://www.allegro.cc/files/attachment/597746</p><p>I appreciate your help.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (William Labbett)</author>
		<pubDate>Wed, 11 Feb 2009 07:06:06 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You made sure to run your program before running it through gprof right?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Wed, 11 Feb 2009 08:52:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yeah, as stated before and repeated by Thomas, you must run it one time as usual before calling gprof on it.</p><p>So, let&#39;s first do a &#39;17.exe&#39; call, after what you will be able to launch gprof on it.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (GullRaDriel)</author>
		<pubDate>Wed, 11 Feb 2009 15:08:10 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Just to be clear William, you meant that your animation speed was too slow, not your program speed, right?</p><p>This may be part of it :
</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
</p><div class="source-code snippet"><div class="inner"><pre><span class="c">//</span>
<span class="k1">if</span><span class="k2">(</span>hero.anim_delay_counter <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span>
<span class="k2">{</span>
                   <span class="k3">-</span><span class="k3">-</span>hero.anim_delay_counter<span class="k2">;</span>
                   hero.update <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>
                   hero.update <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
                   hero.anim_delay_counter <span class="k3">=</span> hero.anim_ticks_per_frame<span class="k2">;</span>
               <span class="k2">}</span>

<span class="c">//</span>
</pre></div></div><p>
</p></div></div><p>
If you have the anim_ticks_per_frame set to 1, then your anim_delay_counter gets set to 1 when it is 0, and decremented when it is greater than zero.</p><p>So starting from hero.anim_delay_counter = 0, it is set to 1 on the first logic call. On the second call it will be decremented. On the third call it will reach zero again. This effectively means that hero.update would only be set to 1 on every other logic call. With this setup it means hero.update is only set to 1 on every (hero.anim_ticks_per_frame + 1)<sup>th</sup> frame.</p><p>What you want is to decrement your tick counter on every pass through the logic loop, and detect when it reaches zero that way. So something more like :
</p><div class="source-code snippet"><div class="inner"><pre><span class="c">//</span>
<span class="k3">-</span><span class="k3">-</span>hero.anim_delay_counter<span class="k2">;</span>
<span class="k1">if</span> <span class="k2">(</span>hero.anim_delay_counter <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>
  <span class="c">// reached the time to update the hero's frame</span>
  hero.update <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
  hero.anim_delay_counter <span class="k3">=</span> hero.anim_ticks_per_frame<span class="k2">;</span>
<span class="k2">}</span> <span class="k1">else</span> <span class="k2">{</span>
  hero.update <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="k2">}</span>
<span class="c">//</span>
</pre></div></div><p>

This way when the counter starts at 1 at the beginning of the logic call, it will be decremented to zero which triggers the frame update and resets the delay counter to the number of ticks per frame.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Wed, 11 Feb 2009 17:38:45 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Okay guys.</p><p>Thanks to Thomas, Edgar and Gulladriel <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /> I appreciate your patience.</p><p>I&#39;ve got things to work on now, so I&#39;ll be absent for a while, while I work through the help.</p><p>I&#39;ll get back when I&#39;ve done some work.</p><p>EDIT :</p><p>hi again. Trying to use profiling but with no luck.</p><p>I have : used the -pg compiler flag.<br />         used -pg with the linker.<br />         ran the program before gprof.</p><p>..but I still get gmon.out : no such file or directory.</p><p>Can anyone help ?</p><p>EDIT 2 :</p><p>actually I&#39;ve got it now.</p><p>Here&#39;s the profile :</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td>Flat profile:</td></tr><tr><td class="number">2</td><td>&#160;</td></tr><tr><td class="number">3</td><td>Each sample counts as <span class="n">0</span>.<span class="n">01</span> seconds.</td></tr><tr><td class="number">4</td><td>  %   cumulative   self              self     total           </td></tr><tr><td class="number">5</td><td> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a>   seconds   seconds    calls  ms<span class="k3">/</span>call  ms<span class="k3">/</span>call  name    </td></tr><tr><td class="number">6</td><td> <span class="n">30</span>.<span class="n">00</span>      <span class="n">0</span>.<span class="n">06</span>     <span class="n">0</span>.<span class="n">06</span>                             _mangled_main</td></tr><tr><td class="number">7</td><td> <span class="n">15</span>.<span class="n">00</span>      <span class="n">0</span>.<span class="n">09</span>     <span class="n">0</span>.<span class="n">03</span>      <span class="n">117</span>     <span class="n">0</span>.<span class="n">26</span>     <span class="n">0</span>.<span class="n">26</span>  get_hero_input</td></tr><tr><td class="number">8</td><td> <span class="n">10</span>.<span class="n">00</span>      <span class="n">0</span>.<span class="n">11</span>     <span class="n">0</span>.<span class="n">02</span>      <span class="n">404</span>     <span class="n">0</span>.<span class="n">05</span>     <span class="n">0</span>.<span class="n">17</span>  do_non_drawing</td></tr><tr><td class="number">9</td><td> <span class="n">10</span>.<span class="n">00</span>      <span class="n">0</span>.<span class="n">13</span>     <span class="n">0</span>.<span class="n">02</span>        <span class="n">5</span>     <span class="n">4</span>.<span class="n">00</span>     <span class="n">4</span>.<span class="n">00</span>  add_two_pixel_border</td></tr><tr><td class="number">10</td><td>  <span class="n">5</span>.<span class="n">00</span>      <span class="n">0</span>.<span class="n">14</span>     <span class="n">0</span>.<span class="n">01</span>      <span class="n">202</span>     <span class="n">0</span>.<span class="n">05</span>     <span class="n">0</span>.<span class="n">05</span>  update_hero_frame_and_position</td></tr><tr><td class="number">11</td><td>  <span class="n">5</span>.<span class="n">00</span>      <span class="n">0</span>.<span class="n">15</span>     <span class="n">0</span>.<span class="n">01</span>      <span class="n">117</span>     <span class="n">0</span>.<span class="n">09</span>     <span class="n">0</span>.<span class="n">09</span>  determine_heros_move</td></tr><tr><td class="number">12</td><td>  <span class="n">5</span>.<span class="n">00</span>      <span class="n">0</span>.<span class="n">16</span>     <span class="n">0</span>.<span class="n">01</span>        <span class="n">1</span>    <span class="n">10</span>.<span class="n">00</span>    <span class="n">10</span>.<span class="n">00</span>  fade_in_level</td></tr><tr><td class="number">13</td><td>  <span class="n">5</span>.<span class="n">00</span>      <span class="n">0</span>.<span class="n">17</span>     <span class="n">0</span>.<span class="n">01</span>        <span class="n">1</span>    <span class="n">10</span>.<span class="n">00</span>    <span class="n">10</span>.<span class="n">00</span>  get_shadow_colours</td></tr><tr><td class="number">14</td><td>  <span class="n">5</span>.<span class="n">00</span>      <span class="n">0</span>.<span class="n">18</span>     <span class="n">0</span>.<span class="n">01</span>        <span class="n">1</span>    <span class="n">10</span>.<span class="n">00</span>    <span class="n">30</span>.<span class="n">00</span>  grass_from_pattern</td></tr><tr><td class="number">15</td><td>  <span class="n">5</span>.<span class="n">00</span>      <span class="n">0</span>.<span class="n">19</span>     <span class="n">0</span>.<span class="n">01</span>        <span class="n">1</span>    <span class="n">10</span>.<span class="n">00</span>    <span class="n">10</span>.<span class="n">00</span>  make_a_pattern</td></tr><tr><td class="number">16</td><td>  <span class="n">5</span>.<span class="n">00</span>      <span class="n">0</span>.<span class="n">20</span>     <span class="n">0</span>.<span class="n">01</span>        <span class="n">1</span>    <span class="n">10</span>.<span class="n">00</span>    <span class="n">10</span>.<span class="n">00</span>  save_shadow_array</td></tr><tr><td class="number">17</td><td>  <span class="n">0</span>.<span class="n">00</span>      <span class="n">0</span>.<span class="n">20</span>     <span class="n">0</span>.<span class="n">00</span>    <span class="n">22768</span>     <span class="n">0</span>.<span class="n">00</span>     <span class="n">0</span>.<span class="n">00</span>  <a href="http://www.allegro.cc/manual/hline" target="_blank"><span class="a">hline</span></a></td></tr><tr><td class="number">18</td><td>  <span class="n">0</span>.<span class="n">00</span>      <span class="n">0</span>.<span class="n">20</span>     <span class="n">0</span>.<span class="n">00</span>    <span class="n">22528</span>     <span class="n">0</span>.<span class="n">00</span>     <span class="n">0</span>.<span class="n">00</span>  random_number</td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (William Labbett)</author>
		<pubDate>Thu, 12 Feb 2009 01:57:28 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It&#39;s nice to see that you&#39;ve got profiling working for you. You will probably want a sample size larger than running your program for 0.20 seconds though, and you might as well wait until you&#39;ve got all your basic program elements running before you worry about which functions are taking the longest overall.</p><p>Did you try the fix for the animation rate that I pointed out in my last post?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Thu, 12 Feb 2009 09:15:43 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Did you try the fix for the animation rate that I pointed out in my last post?
</p></div></div><p>


Not until I read the above. I was being neurotic about it. And I was having trouble getting on my feet today for some reason.</p><p>When I saw you&#39;d replied, I cut and pasted the code you wrote in place of the old code in my main function and commented the old code out.</p><p>When I ran it, I couldn&#39;t believe it. The hero walks about really fast which is brilliant because that means I can actually choose how fast I want him to move by increasing hero.anim_ticks_per_frame which will slow him down a bit.</p><p>So I&#39;m really pleased, really relieved and feeling more positive my project now.</p><p>Thanks very much for the help Edgar. You spotted exactly what the problem was.</p><p><img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (William Labbett)</author>
		<pubDate>Thu, 12 Feb 2009 22:39:10 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Well, I kind of glossed over it first. I should have read it more closely.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
So I&#39;m really pleased, really relieved and feeling more positive my project now.
</p></div></div><p>
That&#39;s good. Sometimes a small victory is enough to carry the whole day.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Fri, 13 Feb 2009 10:46:04 +0000</pubDate>
	</item>
</rss>
