<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Making a animation function,</title>
		<link>http://www.allegro.cc/forums/view/606852</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Mon, 28 Mar 2011 14:25:22 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hey guys,<br />I have took it upon myself to coming up with ideas for creating a function for animating a sprite. The parametres will/should look like this.</p><p>sprite_animate(Bitmap, FrameDimensionH, FrameDimensionW, StartFrame, EndFrame)</p><p>Okay, now here I will explain how it works. Please note, that this function will probably only work for a non varying frame sized animation. so here we go, you will declare a bitmap and assign a sprite strip/bmp to it. You will then set the frame dimensions like 32x32 or 16x16. It will then find those frames and order them from 0 to &quot;the last frames&quot;. So thats how it will work, but I still have to get my head around the coding. Hence why I am asking you guys for help on this, and what I should do?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Mozzie)</author>
		<pubDate>Sun, 27 Mar 2011 10:43:37 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>

Not that I&#39;m an expert but here&#39;s two cents :-</p><p>I think you need to think of it in stages instead of one function that does everything.</p><p>something like this :</p><p>update_animtion_frame()</p><p>draw_animation_frame(int frame_number, etc...)</p><p>Now the way I do the update of the frame is tied into the timing loop.</p><p>Here&#39;s my code : as basic as I can make it - that&#39;s how I code but it&#39;s C.</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">while</span><span class="k2">(</span> old_time <span class="k3">&lt;</span> <a href="http://www.allegro.cc/manual/al_get_timer_count"><span class="a">al_get_timer_count</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">)</span>
        <span class="k2">{</span>
            <span class="k3">+</span><span class="k3">+</span>old_time<span class="k2">;</span>
            
    

      <span class="k3">-</span><span class="k3">-</span>hero_frame_counter<span class="k2">;</span>
      <span class="k1">if</span><span class="k2">(</span>hero_frame_counter <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span>
      <span class="k2">{</span>
        hero_frame_counter <span class="k3">=</span> HERO_TICKS_PER_FRAMEUPDATE<span class="k2">;</span>
        
        update_hero_frame<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
      <span class="k2">}</span>
</pre></div></div><p>


As you can see every time the loop runs the hero_frame_counter gets one knocked off it. That means for each tick of the timer. When it reaches 0 it&#39;s time to move to the next frame.</p><p>When this loop stops, then the draw function gets called and the right frame gets called/** edit : drawn **/. Hopefully this would be a subsequent frame - ie frame 4 after frame 3 but if the previous draw took a long time then the logic loop (above) will get called more times in order to catch up with the actual time.</p><p>As far as I know this the way to do it.</p><p>HERO_TICKS_PER_FRAMEUPDATE is 30 which means that the loop must be called 30 times for hero_frame_counter to get to 0. When it does, hero_frame_counter is set back to 30.</p><p>My timer does 240 ticks per second so assuming the draw function isn&#39;t slowing things down, the frame changes 8 times per second ie at 30 ticks, 60 ticks, 90 ticks etc....</p><p>It&#39;s a bit of headache to get but using a proper timing loop will mean your game will look the same on different processors which run at different speeds.</p><p>Please ask any questions you need to.</p><p>/** ED : but I&#39;m now off to bed..
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (William Labbett)</author>
		<pubDate>Sun, 27 Mar 2011 11:00:14 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Here&#39;s a working win32 exe and source code that shows a simple stick figure animation (because my pixel art is severely lacking). It has everything you need to use animations in your program except for functions to load bitmaps from a spritesheet (which can vary in form widely).</p><p><a href="http://www.allegro.cc/files/attachment/603787">AnimationTest.zip</a></p><p>Look at Animation.hpp to see what functions are available to use and at AnimationTest.cpp to see a usage example. The heart of the animation is in the AnimationBase::SetFrameTime function :
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="k1">int</span> AnimationBase::SetFrameTime<span class="k2">(</span><span class="k1">double</span> frame_time<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  2</span>   frametime <span class="k3">=</span> frame_time<span class="k2">;</span>
<span class="number">  3</span>   <span class="k1">double</span> short_frame_time <span class="k3">=</span> frametime<span class="k2">;</span>
<span class="number">  4</span>   <span class="k1">double</span> num_loops <span class="k3">=</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">;</span>
<span class="number">  5</span>   <span class="k1">switch</span> <span class="k2">(</span>anim_type<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  6</span>      <span class="k1">case</span> FORWARD_ONCE <span class="k2">:</span>
<span class="number">  7</span>         <span class="k1">if</span> <span class="k2">(</span><span class="k2">(</span>frametime <span class="k3">&lt;</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <span class="k2">(</span>frametime <span class="k3">&gt;</span><span class="k3">=</span> duration<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  8</span>            frame_num <span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  9</span>            loop_num <span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number"> 10</span>         <span class="k2">}</span> <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 11</span>            frame_num <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span>frametime<span class="k3">*</span>frames_per_sec<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 12</span>            loop_num <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 13</span>         <span class="k2">}</span>
<span class="number"> 14</span>         <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 15</span>      <span class="k1">case</span> BACKWARD_ONCE <span class="k2">:</span>
<span class="number"> 16</span>         <span class="k1">if</span> <span class="k2">(</span><span class="k2">(</span>frametime <span class="k3">&lt;</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <span class="k2">(</span>frametime <span class="k3">&gt;</span><span class="k3">=</span> duration<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 17</span>            frame_num <span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number"> 18</span>            loop_num <span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number"> 19</span>         <span class="k2">}</span> <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 20</span>            frame_num <span class="k3">=</span> <span class="k2">(</span>num_frames <span class="k3">-</span> <span class="n">1</span><span class="k2">)</span> <span class="k3">-</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span>frametime<span class="k3">*</span>frames_per_sec<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 21</span>            loop_num <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 22</span>         <span class="k2">}</span>
<span class="number"> 23</span>         <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 24</span>      <span class="k1">case</span> FORWARD_AND_BACK_ONCE <span class="k2">:</span>
<span class="number"> 25</span>         <span class="k1">if</span> <span class="k2">(</span><span class="k2">(</span>frametime <span class="k3">&lt;</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <span class="k2">(</span>frametime <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">2</span>.<span class="n">0</span><span class="k3">*</span>duration<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 26</span>            frame_num <span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number"> 27</span>            loop_num <span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number"> 28</span>         <span class="k2">}</span> <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 29</span>            <span class="k1">if</span> <span class="k2">(</span>frametime <span class="k3">&lt;</span> duration<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 30</span>               frame_num <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span>frametime<span class="k3">*</span>frames_per_sec<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 31</span>            <span class="k2">}</span> <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 32</span>               frame_num <span class="k3">=</span> <span class="k2">(</span>num_frames <span class="k3">-</span> <span class="n">1</span><span class="k2">)</span> <span class="k3">-</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span><span class="k2">(</span>frametime-duration<span class="k2">)</span><span class="k3">*</span>frames_per_sec<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 33</span>            <span class="k2">}</span>
<span class="number"> 34</span>            loop_num <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 35</span>         <span class="k2">}</span>
<span class="number"> 36</span>         <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 37</span>      <span class="k1">case</span> FORWARD_REPEAT <span class="k2">:</span>
<span class="number"> 38</span>         loop_num <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 39</span>         <span class="k1">if</span> <span class="k2">(</span>frametime <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="number"> 40</span>            frame_num <span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number"> 41</span>            loop_num <span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number"> 42</span>         <span class="k2">}</span> <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 43</span>            <span class="k1">if</span> <span class="k2">(</span>frametime <span class="k3">&gt;</span><span class="k3">=</span> duration<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 44</span>               num_loops <span class="k3">=</span> frametime<span class="k3">/</span>duration<span class="k2">;</span>
<span class="number"> 45</span>               loop_num <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>num_loops<span class="k2">;</span>
<span class="number"> 46</span>               short_frame_time <span class="k3">=</span> frametime <span class="k3">-</span> duration<span class="k3">*</span><span class="k2">(</span><span class="k1">double</span><span class="k2">)</span><span class="k2">(</span>loop_num<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 47</span>            <span class="k2">}</span>
<span class="number"> 48</span>            frame_num <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span>short_frame_time<span class="k3">*</span>frames_per_sec<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 49</span>         <span class="k2">}</span>
<span class="number"> 50</span>         <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 51</span>      <span class="k1">case</span> BACKWARD_REPEAT <span class="k2">:</span>
<span class="number"> 52</span>         loop_num <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 53</span>         <span class="k1">if</span> <span class="k2">(</span>frametime <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="number"> 54</span>            frame_num <span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number"> 55</span>            loop_num <span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number"> 56</span>         <span class="k2">}</span> <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 57</span>            <span class="k1">if</span> <span class="k2">(</span>frametime <span class="k3">&gt;</span><span class="k3">=</span> duration<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 58</span>               num_loops <span class="k3">=</span> frametime<span class="k3">/</span>duration<span class="k2">;</span>
<span class="number"> 59</span>               loop_num <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>num_loops<span class="k2">;</span>
<span class="number"> 60</span>               short_frame_time <span class="k3">=</span> frametime <span class="k3">-</span> duration<span class="k3">*</span><span class="k2">(</span><span class="k1">double</span><span class="k2">)</span><span class="k2">(</span>loop_num<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 61</span>            <span class="k2">}</span>
<span class="number"> 62</span>            frame_num <span class="k3">=</span> <span class="k2">(</span>num_frames <span class="k3">-</span> <span class="n">1</span><span class="k2">)</span> <span class="k3">-</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span>short_frame_time<span class="k3">*</span>frames_per_sec<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 63</span><span class="c">//            frame_num = (int)(short_frame_time*frames_per_sec);</span>
<span class="number"> 64</span>         <span class="k2">}</span>
<span class="number"> 65</span>         <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 66</span>      <span class="k1">case</span> FORWARD_AND_BACK_REPEAT <span class="k2">:</span>
<span class="number"> 67</span>         loop_num <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 68</span>         <span class="k1">if</span> <span class="k2">(</span>frametime <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="number"> 69</span>            frame_num <span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number"> 70</span>            loop_num <span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number"> 71</span>         <span class="k2">}</span> <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 72</span>            <span class="k1">if</span> <span class="k2">(</span>frametime <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">2</span>.<span class="n">0</span><span class="k3">*</span>duration<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 73</span>               num_loops <span class="k3">=</span> frametime<span class="k3">/</span><span class="k2">(</span><span class="n">2</span>.<span class="n">0</span><span class="k3">*</span>duration<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 74</span>               loop_num <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>num_loops<span class="k2">;</span>
<span class="number"> 75</span>               short_frame_time <span class="k3">=</span> frametime <span class="k3">-</span> <span class="k2">(</span><span class="n">2</span>.<span class="n">0</span><span class="k3">*</span>duration<span class="k2">)</span><span class="k3">*</span><span class="k2">(</span><span class="k1">double</span><span class="k2">)</span>loop_num<span class="k2">;</span>
<span class="number"> 76</span>            <span class="k2">}</span>
<span class="number"> 77</span>            <span class="k1">if</span> <span class="k2">(</span>short_frame_time <span class="k3">&lt;</span> duration<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 78</span>               frame_num <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span>short_frame_time<span class="k3">*</span>frames_per_sec<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 79</span>            <span class="k2">}</span> <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 80</span>               frame_num <span class="k3">=</span> <span class="k2">(</span>num_frames <span class="k3">-</span> <span class="n">1</span><span class="k2">)</span> <span class="k3">-</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span><span class="k2">(</span>short_frame_time-duration<span class="k2">)</span><span class="k3">*</span>frames_per_sec<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 81</span>            <span class="k2">}</span>
<span class="number"> 82</span>         <span class="k2">}</span>
<span class="number"> 83</span>         <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 84</span>   <span class="k2">}</span>
<span class="number"> 85</span>   <span class="k1">if</span> <span class="k2">(</span>loop_stop_num <span class="k3">!</span><span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 86</span>      <span class="k1">if</span> <span class="k2">(</span>loop_num <span class="k3">&gt;</span> loop_stop_num<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 87</span>         frame_num <span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number"> 88</span>         loop_num <span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number"> 89</span>      <span class="k2">}</span>
<span class="number"> 90</span>   <span class="k2">}</span>
<span class="number"> 91</span>   <span class="k1">return</span> loop_num<span class="k2">;</span>
<span class="number"> 92</span><span class="k2">}</span>
</div></div><p>


Note that this is ripped out of my library, so not everything applies - the AnimationBase SetColor, SetRotation, and SetScale functions will not work with the SimpleAnimation class because it doesn&#39;t allocate those.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Mon, 28 Mar 2011 12:26:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Interesting, thanks. Erhm, does allegro have an irc, so we can live chat about it?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Mozzie)</author>
		<pubDate>Mon, 28 Mar 2011 13:43:34 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>There&#39;s #allegro on irc.freenode.net, but I&#39;ll probably only be up another hour today. Ask all the questions you want here and I&#39;ll answer them today if you&#39;re quick or else tomorrow.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Mon, 28 Mar 2011 14:25:22 +0000</pubDate>
	</item>
</rss>
