<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Animation works right in two arrays, but not this one?</title>
		<link>http://www.allegro.cc/forums/view/591840</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Tue, 12 Jun 2007 04:44:20 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Okay, so after getting a lot of help from this board, I managed to get my basic fight stance animation working for my sword fighting game.  After that, I figured all my other animations would be easy.  I did my running forward animation and it worked fine.  Now I tried using the same procedure to put in my running backward animation and I&#39;m not getting good results.  When I pass what should be the correct number into the function, it skips the last frame of the animation.  When I pass 4 into the function (what should be one too high), it displays that last frame, but there&#39;s a stuttering glitch that comes in every second or two.  Note: I used the same exact method to put it in as I did the last two sprite sheets, and there are four frames on the sprite sheet for the problematic animation.</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">// Sword Play</span></td></tr><tr><td class="number">2</td><td>&#160;</td></tr><tr><td class="number">3</td><td><span class="c">// Known issues:</span></td></tr><tr><td class="number">4</td><td>&#160;</td></tr><tr><td class="number">5</td><td><span class="c">// flawlessly, player can move forward...and that's it</span></td></tr><tr><td class="number">6</td><td><span class="c">// moving backward has animation issues</span></td></tr><tr><td class="number">7</td><td><span class="c">// many more sprite sheets still needed</span></td></tr><tr><td class="number">8</td><td>&#160;</td></tr><tr><td class="number">9</td><td><span class="p">#include &lt;allegro.h&gt;</span></td></tr><tr><td class="number">10</td><td>&#160;</td></tr><tr><td class="number">11</td><td><span class="p">#define BLACK makecol(0, 0, 0)</span></td></tr><tr><td class="number">12</td><td><span class="p">#define GREEN makecol(0, 255, 0)</span></td></tr><tr><td class="number">13</td><td><span class="p">#define WHITE makecol(255, 255, 255)</span></td></tr><tr><td class="number">14</td><td>&#160;</td></tr><tr><td class="number">15</td><td><span class="k1">volatile</span> <span class="k1">int</span> frame1 <span class="k3">=</span> <span class="n">0</span>, frame2 <span class="k3">=</span> <span class="n">0</span>, p1 <span class="k3">=</span> <span class="n">40</span>, p2 <span class="k3">=</span> <a href="http://www.allegro.cc/manual/SCREEN_W" target="_blank"><span class="a">SCREEN_W</span></a> <span class="k3">-</span> <span class="n">40</span>, player, stamina1 <span class="k3">=</span> <span class="n">100</span>, stamina2 <span class="k3">=</span> <span class="n">100</span>, ticks <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">16</td><td><span class="k1">const</span> <span class="k1">int</span> frameRate <span class="k3">=</span> <span class="n">8</span>, staticy <span class="k3">=</span> <span class="n">200</span><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">// obtains sprites from a sprite sheet</span></td></tr><tr><td class="number">19</td><td><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>grabframe<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>source, <span class="k1">int</span> width, <span class="k1">int</span> height, <span class="k1">int</span> startx, <span class="k1">int</span> starty, <span class="k1">int</span> columns, <span class="k1">int</span> frame<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>  <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>temp <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>width, height<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>  <span class="k1">int</span> x <span class="k3">=</span> startx <span class="k3">+</span> <span class="k2">(</span>frame % columns<span class="k2">)</span> <span class="k3">*</span> width<span class="k2">;</span></td></tr><tr><td class="number">24</td><td>  <span class="k1">int</span> y <span class="k3">=</span> starty <span class="k3">+</span> <span class="k2">(</span>frame <span class="k3">/</span> columns<span class="k2">)</span> <span class="k3">*</span> height<span class="k2">;</span></td></tr><tr><td class="number">25</td><td>&#160;</td></tr><tr><td class="number">26</td><td>  <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>source, temp, x, y, <span class="n">0</span>, <span class="n">0</span>, width, height<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">27</td><td>&#160;</td></tr><tr><td class="number">28</td><td>  <span class="k1">return</span> temp<span class="k2">;</span></td></tr><tr><td class="number">29</td><td><span class="k2">}</span></td></tr><tr><td class="number">30</td><td><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>buffer<span class="k2">;</span> <span class="c">// used to smooth out the animation</span></td></tr><tr><td class="number">31</td><td><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>buffer2<span class="k2">;</span> <span class="c">// used to smooth out animation even more</span></td></tr><tr><td class="number">32</td><td><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>pic<span class="k2">;</span> <span class="c">// temporary variable for putting sprites into an array</span></td></tr><tr><td class="number">33</td><td><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>SwordPlayTitle<span class="k2">;</span> <span class="c">// title screen picture</span></td></tr><tr><td class="number">34</td><td>&#160;</td></tr><tr><td class="number">35</td><td><span class="c">// sprite arrays end in s (for sprite) to differentiate from functions</span></td></tr><tr><td class="number">36</td><td><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>fightStances<span class="k2">[</span><span class="n">4</span><span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">37</td><td><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>runForwards<span class="k2">[</span><span class="n">9</span><span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">38</td><td><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>runBackwards<span class="k2">[</span><span class="n">4</span><span class="k2">]</span><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="c">/*BITMAP *attackHeads[10];</span></td></tr><tr><td class="number">41</td><td><span class="c">BITMAP *attackHands[10];</span></td></tr><tr><td class="number">42</td><td><span class="c">BITMAP *attackFoots[10];</span></td></tr><tr><td class="number">43</td><td><span class="c">BITMAP *defendHeads[1];</span></td></tr><tr><td class="number">44</td><td><span class="c">BITMAP *defendHands[1];</span></td></tr><tr><td class="number">45</td><td><span class="c">BITMAP *defendFoots[1];</span></td></tr><tr><td class="number">46</td><td><span class="c"></span></td></tr><tr><td class="number">47</td><td><span class="c">BITMAP *powerStruggles[1];</span></td></tr><tr><td class="number">48</td><td><span class="c">BITMAP *pushs[4];*/</span></td></tr><tr><td class="number">49</td><td>&#160;</td></tr><tr><td class="number">50</td><td><span class="k1">void</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a><span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// used to count hundredths of a second</span></td></tr><tr><td class="number">51</td><td><span class="k1">void</span> frame1Function<span class="k2">(</span><span class="k1">int</span> maxframes<span class="k2">)</span><span class="k2">;</span> <span class="c">// controls animation of current action for player 1</span></td></tr><tr><td class="number">52</td><td>&#160;</td></tr><tr><td class="number">53</td><td><span class="k1">void</span> runForward<span class="k2">(</span><span class="k1">int</span> player<span class="k2">)</span><span class="k2">;</span> <span class="c">// 9 frames</span></td></tr><tr><td class="number">54</td><td><span class="k1">void</span> runBackward<span class="k2">(</span><span class="k1">int</span> player<span class="k2">)</span><span class="k2">;</span> <span class="c">// 4 frames</span></td></tr><tr><td class="number">55</td><td>&#160;</td></tr><tr><td class="number">56</td><td><span class="c">/*void attackHead(int player);</span></td></tr><tr><td class="number">57</td><td><span class="c">void attackHand(int player);</span></td></tr><tr><td class="number">58</td><td><span class="c">void attackFoot(int player);</span></td></tr><tr><td class="number">59</td><td><span class="c">void defendHead(int player);</span></td></tr><tr><td class="number">60</td><td><span class="c">void defendHand(int player);</span></td></tr><tr><td class="number">61</td><td><span class="c">void defendFoot(int player);</span></td></tr><tr><td class="number">62</td><td><span class="c"></span></td></tr><tr><td class="number">63</td><td><span class="c">void push(int player); // 5 frames: one player stumbles backward, other stays in fightStance</span></td></tr><tr><td class="number">64</td><td><span class="c">void powerStruggle(void); // both players go through same two frames, then loser is pushed*/</span></td></tr><tr><td class="number">65</td><td>&#160;</td></tr><tr><td class="number">66</td><td><span class="k1">void</span> stamina<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// displays players' stamina bars</span></td></tr><tr><td class="number">67</td><td><span class="k1">void</span> increaseStamina<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// slightly regenerates stamina every second</span></td></tr><tr><td class="number">68</td><td><span class="c">/*void decreaseStamina(void); // decreases player's stamina when an attack is blocked*/</span></td></tr><tr><td class="number">69</td><td>&#160;</td></tr><tr><td class="number">70</td><td><span class="k1">int</span> main<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span></td></tr><tr><td class="number">71</td><td><span class="k2">{</span></td></tr><tr><td class="number">72</td><td>  <a href="http://www.allegro.cc/manual/allegro_init" target="_blank"><span class="a">allegro_init</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// uses Allegro</span></td></tr><tr><td class="number">73</td><td>  <a href="http://www.allegro.cc/manual/install_timer" target="_blank"><span class="a">install_timer</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// initializes timing functionality</span></td></tr><tr><td class="number">74</td><td>  <a href="http://www.allegro.cc/manual/install_keyboard" target="_blank"><span class="a">install_keyboard</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// allows use of keyboard</span></td></tr><tr><td class="number">75</td><td>  <a href="http://www.allegro.cc/manual/set_color_depth" target="_blank"><span class="a">set_color_depth</span></a><span class="k2">(</span><span class="n">32</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// sets color depth for pallette of sprites</span></td></tr><tr><td class="number">76</td><td>  <a href="http://www.allegro.cc/manual/set_gfx_mode" target="_blank"><span class="a">set_gfx_mode</span></a><span class="k2">(</span>GFX_AUTODETECT_WINDOWED, <span class="n">640</span>, <span class="n">480</span>, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// makes the screen a 640x480 window</span></td></tr><tr><td class="number">77</td><td>  SwordPlayTitle <span class="k3">=</span> <a href="http://www.allegro.cc/manual/load_bitmap" target="_blank"><span class="a">load_bitmap</span></a><span class="k2">(</span><span class="s">"SwordPlayTitle.bmp"</span>, NULL<span class="k2">)</span><span class="k2">;</span> <span class="c">// loads title screen image</span></td></tr><tr><td class="number">78</td><td>&#160;</td></tr><tr><td class="number">79</td><td>  <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>SwordPlayTitle, <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>, SwordPlayTitle-&gt;w, SwordPlayTitle-&gt;h<span class="k2">)</span><span class="k2">;</span> <span class="c">// puts the title screen picture on the screen</span></td></tr><tr><td class="number">80</td><td>  <a href="http://www.allegro.cc/manual/textprintf_centre_ex" target="_blank"><span class="a">textprintf_centre_ex</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>, <a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>, <a href="http://www.allegro.cc/manual/SCREEN_W" target="_blank"><span class="a">SCREEN_W</span></a> <span class="k3">/</span> <span class="n">2</span>, <span class="n">460</span>, <a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</span></a><span class="k2">(</span><span class="n">255</span>, <span class="n">255</span>, <span class="n">255</span><span class="k2">)</span>, <span class="k3">-</span><span class="n">1</span>, <span class="s">"Press Any Key to Continue..."</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">81</td><td>  <a href="http://www.allegro.cc/manual/destroy_bitmap" target="_blank"><span class="a">destroy_bitmap</span></a><span class="k2">(</span>SwordPlayTitle<span class="k2">)</span><span class="k2">;</span> <span class="c">// frees up memory by destroying a now unneeded title screen</span></td></tr><tr><td class="number">82</td><td>  <a href="http://www.allegro.cc/manual/readkey" target="_blank"><span class="a">readkey</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// waits for input to proceed</span></td></tr><tr><td class="number">83</td><td>&#160;</td></tr><tr><td class="number">84</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">50</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// brief pause between input and loading the actual game</span></td></tr><tr><td class="number">85</td><td>&#160;</td></tr><tr><td class="number">86</td><td>  <span class="c">// loads frames for the fighting stance animation</span></td></tr><tr><td class="number">87</td><td>  pic <span class="k3">=</span> <a href="http://www.allegro.cc/manual/load_bitmap" target="_blank"><span class="a">load_bitmap</span></a><span class="k2">(</span><span class="s">"FightStanceSpriteSheet.bmp"</span>, NULL<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">88</td><td>  <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> x <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> x <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">3</span><span class="k2">;</span> x<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">89</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">90</td><td>    fightStances<span class="k2">[</span>x<span class="k2">]</span> <span class="k3">=</span> grabframe<span class="k2">(</span>pic, <span class="n">240</span>, <span class="n">240</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">4</span>, x<span class="k2">)</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>&#160;</td></tr><tr><td class="number">93</td><td>  <span class="c">// loads frames for the running forward animation</span></td></tr><tr><td class="number">94</td><td>  pic <span class="k3">=</span> <a href="http://www.allegro.cc/manual/load_bitmap" target="_blank"><span class="a">load_bitmap</span></a><span class="k2">(</span><span class="s">"RunForwardSheet.bmp"</span>, NULL<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">95</td><td>  <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> x <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> x <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">8</span><span class="k2">;</span> x<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">96</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">97</td><td>    runForwards<span class="k2">[</span>x<span class="k2">]</span> <span class="k3">=</span> grabframe<span class="k2">(</span>pic, <span class="n">240</span>, <span class="n">240</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">4</span>, x<span class="k2">)</span><span class="k2">;</span></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>  <span class="c">// loads frames for the running backward animation</span></td></tr><tr><td class="number">101</td><td>  pic <span class="k3">=</span> <a href="http://www.allegro.cc/manual/load_bitmap" target="_blank"><span class="a">load_bitmap</span></a><span class="k2">(</span><span class="s">"RunBackwardSheet.bmp"</span>, NULL<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">102</td><td>  <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> x <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> x <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">3</span><span class="k2">;</span> x<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">103</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">104</td><td>    runBackwards<span class="k2">[</span>x<span class="k2">]</span> <span class="k3">=</span> grabframe<span class="k2">(</span>pic, <span class="n">240</span>, <span class="n">240</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">4</span>, x<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">105</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">106</td><td>  </td></tr><tr><td class="number">107</td><td>  <a href="http://www.allegro.cc/manual/destroy_bitmap" target="_blank"><span class="a">destroy_bitmap</span></a><span class="k2">(</span>pic<span class="k2">)</span><span class="k2">;</span> <span class="c">// frees up memory by destroying a now unneeded temporary variable</span></td></tr><tr><td class="number">108</td><td>  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><a href="http://www.allegro.cc/manual/SCREEN_W" target="_blank"><span class="a">SCREEN_W</span></a>, <a href="http://www.allegro.cc/manual/SCREEN_H" target="_blank"><span class="a">SCREEN_H</span></a><span class="k2">)</span><span class="k2">;</span> <span class="c">// makes the buffer</span></td></tr><tr><td class="number">109</td><td>  buffer2 <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><a href="http://www.allegro.cc/manual/SCREEN_W" target="_blank"><span class="a">SCREEN_W</span></a>, <a href="http://www.allegro.cc/manual/SCREEN_H" target="_blank"><span class="a">SCREEN_H</span></a><span class="k2">)</span><span class="k2">;</span> <span class="c">// makes the buffer's buffer</span></td></tr><tr><td class="number">110</td><td>  <a href="http://www.allegro.cc/manual/install_int_ex" target="_blank"><span class="a">install_int_ex</span></a><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a>, BPS_TO_TIMER<span class="k2">(</span><span class="n">100</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// calls the timer function 100 times every second</span></td></tr><tr><td class="number">111</td><td>  <a href="http://www.allegro.cc/manual/install_int_ex" target="_blank"><span class="a">install_int_ex</span></a><span class="k2">(</span>increaseStamina, BPS_TO_TIMER<span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// increases the stamina bars for both players by 1 every second</span></td></tr><tr><td class="number">112</td><td>&#160;</td></tr><tr><td class="number">113</td><td>  <span class="c">// main game loop</span></td></tr><tr><td class="number">114</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">115</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">116</td><td>    <a href="http://www.allegro.cc/manual/clear_to_color" target="_blank"><span class="a">clear_to_color</span></a><span class="k2">(</span>buffer, WHITE<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">117</td><td>    <span class="c">/*// attack commands for player 1</span></td></tr><tr><td class="number">118</td><td><span class="c">    if(key[KEY_W] &amp;&amp; key[KEY_SPACE])</span></td></tr><tr><td class="number">119</td><td><span class="c">      attackHead(1);</span></td></tr><tr><td class="number">120</td><td><span class="c">    else if(key[KEY_SPACE])</span></td></tr><tr><td class="number">121</td><td><span class="c">      attackHand(1);</span></td></tr><tr><td class="number">122</td><td><span class="c">    else if(key[KEY_S] &amp;&amp; key[KEY_SPACE])</span></td></tr><tr><td class="number">123</td><td><span class="c">      attackFoot(1);</span></td></tr><tr><td class="number">124</td><td><span class="c"></span></td></tr><tr><td class="number">125</td><td><span class="c">    // defend commands for player 1</span></td></tr><tr><td class="number">126</td><td><span class="c">    else if(key[KEY_W] &amp;&amp; key[KEY_LSHIFT])</span></td></tr><tr><td class="number">127</td><td><span class="c">      defendHead(1);</span></td></tr><tr><td class="number">128</td><td><span class="c">    else if(key[KEY_LSHIFT])</span></td></tr><tr><td class="number">129</td><td><span class="c">      defendHand(1);</span></td></tr><tr><td class="number">130</td><td><span class="c">    else if(key[KEY_S] &amp;&amp; key[KEY_LSHIFT])</span></td></tr><tr><td class="number">131</td><td><span class="c">      defendFoot(1);*/</span></td></tr><tr><td class="number">132</td><td>&#160;</td></tr><tr><td class="number">133</td><td>    <span class="c">// movement commands for player 1</span></td></tr><tr><td class="number">134</td><td>    <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_D<span class="k2">]</span><span class="k2">)</span></td></tr><tr><td class="number">135</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">136</td><td>      runForward<span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">137</td><td>      <a href="http://www.allegro.cc/manual/masked_blit" target="_blank"><span class="a">masked_blit</span></a><span class="k2">(</span>runForwards<span class="k2">[</span>frame1<span class="k2">]</span>, buffer, <span class="n">0</span>, <span class="n">0</span>, p1, staticy, runForwards<span class="k2">[</span>frame1<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>w, runForwards<span class="k2">[</span>frame1<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>h<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">138</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">139</td><td>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_A<span class="k2">]</span><span class="k2">)</span></td></tr><tr><td class="number">140</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">141</td><td>      runBackward<span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">142</td><td>      <a href="http://www.allegro.cc/manual/masked_blit" target="_blank"><span class="a">masked_blit</span></a><span class="k2">(</span>runBackwards<span class="k2">[</span>frame1<span class="k2">]</span>, buffer, <span class="n">0</span>, <span class="n">0</span>, p1, staticy, runBackwards<span class="k2">[</span>frame1<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>w, runBackwards<span class="k2">[</span>frame1<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>h<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">143</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">144</td><td>    <span class="k1">else</span></td></tr><tr><td class="number">145</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">146</td><td>      frame1Function<span class="k2">(</span><span class="n">3</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">147</td><td>      <a href="http://www.allegro.cc/manual/masked_blit" target="_blank"><span class="a">masked_blit</span></a><span class="k2">(</span>fightStances<span class="k2">[</span>frame1<span class="k2">]</span>, buffer, <span class="n">0</span>, <span class="n">0</span>, p1, staticy, fightStances<span class="k2">[</span>frame1<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>w, fightStances<span class="k2">[</span>frame1<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>h<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">148</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">149</td><td>    stamina<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// displays the stamina bars on the screen</span></td></tr><tr><td class="number">150</td><td>    <a href="http://www.allegro.cc/manual/masked_blit" target="_blank"><span class="a">masked_blit</span></a><span class="k2">(</span>buffer, buffer2, <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> <span class="c">// puts everything that just happened in the last split-second on the second buffer</span></td></tr><tr><td class="number">151</td><td>    <a href="http://www.allegro.cc/manual/masked_blit" target="_blank"><span class="a">masked_blit</span></a><span class="k2">(</span>buffer2, <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>, buffer2-&gt;w, buffer2-&gt;h<span class="k2">)</span><span class="k2">;</span> <span class="c">// puts that buffer on the screen</span></td></tr><tr><td class="number">152</td><td>    <a href="http://www.allegro.cc/manual/clear_bitmap" target="_blank"><span class="a">clear_bitmap</span></a><span class="k2">(</span>buffer<span class="k2">)</span><span class="k2">;</span> <span class="c">// erases the buffer so that it can be changed again</span></td></tr><tr><td class="number">153</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">154</td><td>  <a href="http://www.allegro.cc/manual/remove_int" target="_blank"><span class="a">remove_int</span></a><span class="k2">(</span>increaseStamina<span class="k2">)</span><span class="k2">;</span> <span class="c">// frees up the memory used to call this function over and over again</span></td></tr><tr><td class="number">155</td><td>&#160;</td></tr><tr><td class="number">156</td><td>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span> <span class="c">// makes this code compatible with non-MS compilers</span></td></tr><tr><td class="number">157</td><td><span class="k2">}</span><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></td></tr><tr><td class="number">158</td><td>&#160;</td></tr><tr><td class="number">159</td><td><span class="k1">void</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a><span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">160</td><td><span class="k2">{</span></td></tr><tr><td class="number">161</td><td>  ticks<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">162</td><td>  </td></tr><tr><td class="number">163</td><td>  <span class="k1">if</span><span class="k2">(</span>ticks <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">100</span><span class="k2">)</span></td></tr><tr><td class="number">164</td><td>    ticks <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">165</td><td><span class="k2">}</span></td></tr><tr><td class="number">166</td><td>&#160;</td></tr><tr><td class="number">167</td><td><span class="k1">void</span> frame1Function<span class="k2">(</span><span class="k1">int</span> maxframes<span class="k2">)</span></td></tr><tr><td class="number">168</td><td><span class="k2">{</span></td></tr><tr><td class="number">169</td><td>  <span class="k1">if</span><span class="k2">(</span>frame1 <span class="k3">&gt;</span><span class="k3">=</span> maxframes<span class="k2">)</span></td></tr><tr><td class="number">170</td><td>    frame1 <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">171</td><td>&#160;</td></tr><tr><td class="number">172</td><td>  <span class="k1">float</span> comparisonVariable <span class="k3">=</span> <span class="n">100</span> <span class="k3">/</span> frameRate<span class="k2">;</span></td></tr><tr><td class="number">173</td><td>  </td></tr><tr><td class="number">174</td><td>  <span class="k1">if</span><span class="k2">(</span>ticks <span class="k3">&gt;</span><span class="k3">=</span> comparisonVariable<span class="k2">)</span></td></tr><tr><td class="number">175</td><td>  <span class="k2">{</span>    </td></tr><tr><td class="number">176</td><td>    ticks <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">177</td><td>&#160;</td></tr><tr><td class="number">178</td><td>    <span class="k1">if</span><span class="k2">(</span>frame1 <span class="k3">&gt;</span><span class="k3">=</span> maxframes<span class="k2">)</span></td></tr><tr><td class="number">179</td><td>      frame1 <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">180</td><td>    <span class="k1">else</span></td></tr><tr><td class="number">181</td><td>      frame1<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">182</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">183</td><td><span class="k2">}</span></td></tr><tr><td class="number">184</td><td>&#160;</td></tr><tr><td class="number">185</td><td><span class="k1">void</span> runForward<span class="k2">(</span><span class="k1">int</span> player<span class="k2">)</span></td></tr><tr><td class="number">186</td><td><span class="k2">{</span></td></tr><tr><td class="number">187</td><td>  <span class="k1">if</span><span class="k2">(</span>player <span class="k3">=</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span></td></tr><tr><td class="number">188</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">189</td><td>    frame1Function<span class="k2">(</span><span class="n">8</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">190</td><td>    </td></tr><tr><td class="number">191</td><td>    <span class="k1">if</span><span class="k2">(</span>p1 <span class="k3">&lt;</span><span class="k3">=</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/SCREEN_W" target="_blank"><span class="a">SCREEN_W</span></a> <span class="k3">-</span> <span class="n">240</span><span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">192</td><td>      p1<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">193</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">194</td><td><span class="k2">}</span></td></tr><tr><td class="number">195</td><td>&#160;</td></tr><tr><td class="number">196</td><td><span class="k1">void</span> runBackward<span class="k2">(</span><span class="k1">int</span> player<span class="k2">)</span></td></tr><tr><td class="number">197</td><td><span class="k2">{</span></td></tr><tr><td class="number">198</td><td>  <span class="k1">if</span><span class="k2">(</span>player <span class="k3">=</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span></td></tr><tr><td class="number">199</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">200</td><td>    frame1Function<span class="k2">(</span><span class="n">4</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">201</td><td>&#160;</td></tr><tr><td class="number">202</td><td>    <span class="k1">if</span><span class="k2">(</span>p1 <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">203</td><td>      p1--<span class="k2">;</span></td></tr><tr><td class="number">204</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">205</td><td><span class="k2">}</span></td></tr><tr><td class="number">206</td><td>&#160;</td></tr><tr><td class="number">207</td><td><span class="k1">void</span> stamina<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">208</td><td><span class="k2">{</span></td></tr><tr><td class="number">209</td><td>  <a href="http://www.allegro.cc/manual/textprintf_ex" target="_blank"><span class="a">textprintf_ex</span></a><span class="k2">(</span>buffer, <a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>, <span class="n">5</span>, <span class="n">15</span>, BLACK, <span class="k3">-</span><span class="n">1</span>, <span class="s">"Player 1"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">210</td><td>  <a href="http://www.allegro.cc/manual/textprintf_right_ex" target="_blank"><span class="a">textprintf_right_ex</span></a><span class="k2">(</span>buffer, <a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>, <a href="http://www.allegro.cc/manual/SCREEN_W" target="_blank"><span class="a">SCREEN_W</span></a> <span class="k3">-</span> <span class="n">5</span>, <span class="n">15</span>, BLACK, <span class="k3">-</span><span class="n">1</span>, <span class="s">"Player 2"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">211</td><td>  <a href="http://www.allegro.cc/manual/rectfill" target="_blank"><span class="a">rectfill</span></a><span class="k2">(</span>buffer, <span class="n">5</span>, <span class="n">5</span>, <span class="n">5</span> <span class="k3">+</span> stamina1, <span class="n">10</span>, GREEN<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">212</td><td>  <a href="http://www.allegro.cc/manual/rectfill" target="_blank"><span class="a">rectfill</span></a><span class="k2">(</span>buffer, <a href="http://www.allegro.cc/manual/SCREEN_W" target="_blank"><span class="a">SCREEN_W</span></a> <span class="k3">-</span> <span class="n">105</span>, <span class="n">5</span>, <a href="http://www.allegro.cc/manual/SCREEN_W" target="_blank"><span class="a">SCREEN_W</span></a> <span class="k3">-</span> <span class="n">105</span> <span class="k3">+</span> stamina2, <span class="n">10</span>, GREEN<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">213</td><td><span class="k2">}</span></td></tr><tr><td class="number">214</td><td>&#160;</td></tr><tr><td class="number">215</td><td><span class="k1">void</span> increaseStamina<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">216</td><td><span class="k2">{</span></td></tr><tr><td class="number">217</td><td>  stamina1<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">218</td><td>  <span class="k1">if</span><span class="k2">(</span>stamina1 <span class="k3">&gt;</span> <span class="n">100</span><span class="k2">)</span></td></tr><tr><td class="number">219</td><td>    stamina1 <span class="k3">=</span> <span class="n">100</span><span class="k2">;</span></td></tr><tr><td class="number">220</td><td>  stamina2<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">221</td><td>  <span class="k1">if</span><span class="k2">(</span>stamina2 <span class="k3">&gt;</span> <span class="n">100</span><span class="k2">)</span></td></tr><tr><td class="number">222</td><td>    stamina2 <span class="k3">=</span> <span class="n">100</span><span class="k2">;</span></td></tr><tr><td class="number">223</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (gamelord12)</author>
		<pubDate>Mon, 11 Jun 2007 06:49:30 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Your frame1Function(...) logic is faulty - if frame1 is 3, then you can reach the frame1++ line, setting frame1 to 4, which exceeds your array dimension, before dropping out of the function. Do a check of frame1 before the function exits.</p><p>Alternatively, since you&#39;re passing the value 8 (one less than the array size) in runForward(...), you should be passing 3 runBackward(...).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (HardTranceFan)</author>
		<pubDate>Mon, 11 Jun 2007 07:24:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I said that when I pass in the correct value, it skips the last frame.  Also, it checks for when it is greater than or equal to, not just greater than, so it will only increase it when it is supposed to.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (gamelord12)</author>
		<pubDate>Mon, 11 Jun 2007 19:50:02 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Sigh. Your function is wrong. You&#39;re thinking along the right lines, but it&#39;s not implemented correctly. I&#39;ll explain why by stepping through your frame1Function. Below I&#39;ve put line numbers in function, and have a couple of scenarios to show you where the function falls over.</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">void</span> frame1Function<span class="k2">(</span><span class="k1">int</span> maxframes<span class="k2">)</span>
<span class="k2">{</span>
<span class="n">1</span>  <span class="k1">if</span><span class="k2">(</span>frame1 <span class="k3">&gt;</span><span class="k3">=</span> maxframes<span class="k2">)</span>
<span class="n">2</span>    frame1 <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="n">3</span>  <span class="k1">float</span> comparisonVariable <span class="k3">=</span> <span class="n">100</span> <span class="k3">/</span> frameRate<span class="k2">;</span>
<span class="n">4</span>  <span class="k1">if</span><span class="k2">(</span>ticks <span class="k3">&gt;</span><span class="k3">=</span> comparisonVariable<span class="k2">)</span>
  <span class="k2">{</span>    
<span class="n">5</span>    ticks <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="n">6</span>    <span class="k1">if</span><span class="k2">(</span>frame1 <span class="k3">&gt;</span><span class="k3">=</span> maxframes<span class="k2">)</span>
<span class="n">7</span>      frame1 <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="n">8</span>    <span class="k1">else</span>
<span class="n">9</span>      frame1<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
  <span class="k2">}</span>
<span class="k2">}</span>
</pre></div></div><p>

We&#39;ll set frame1 = 3 &amp; call frame1Function(3):</p><p>The condition in line 1 frame1 &gt;= maxframes is true so line 2 is executed<br />  &gt; frame1 is now 0</p><p>If line 4 evaluates to true,  then lines 5-9 are executed<br />  &gt; Line 6 evaluates to false, so line 9 is executed<br />    &gt; frame++ sets frame to 1</p><p>Hey, guess what, you&#39;ve skipped a frame. frame1 went from 3 to 1, and missed out 0.</p><p>Ok, let&#39;s try out frame1 = 3 &amp; call frame1Function(4):</p><p>Line 1 evaluates to false, so line 2 is not executed<br />  &gt; frame1 is still 3</p><p>If line 4 evaluates to true,  then lines 5-9 are executed<br />  &gt; Line 6 evaluates to false, so line 9 is executed<br />    &gt; frame++ sets frame to 4</p><p>Hey, guess what, you&#39;ve gone past the array boundary. frame1 went from 3 to 4.</p><p>To correct this behaviour, use the <a href="http://www.cprogramming.com/tutorial/modulus.html">modulus operator (&#39;%&#39;)</a>, as in the following code:</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">void</span> frame1Function<span class="k2">(</span><span class="k1">int</span> maxframes<span class="k2">)</span>
<span class="k2">{</span>
  <span class="k1">if</span><span class="k2">(</span>ticks <span class="k3">&gt;</span><span class="k3">=</span> <span class="k2">(</span><span class="n">100</span> <span class="k3">/</span> frameRate<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>
    frame1<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
  <span class="k2">}</span>

  frame1 <span class="k3">=</span> frame1 % maxframes<span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (HardTranceFan)</author>
		<pubDate>Tue, 12 Jun 2007 04:44:20 +0000</pubDate>
	</item>
</rss>
