<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Weird Sprite Handler</title>
		<link>http://www.allegro.cc/forums/view/587014</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Mon, 14 Aug 2006 00:20:17 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I wanted to make a program to load sprites from a  sprite strip and a simple sprite engine.<br />The proble is that I get a black screen only. The application doesn&#39;t crash, just that you get to see nothing.<br />If anything from the code is not clear to you, please don&#39;t hesitate to ask, it&#39;s really important.<br />The code:
</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">/*Advanced Sprite Animation with RLE Sprites*/</span></td></tr><tr><td class="number">2</td><td><span class="p">#include &lt;allegro.h&gt;</span></td></tr><tr><td class="number">3</td><td>&#160;</td></tr><tr><td class="number">4</td><td><span class="k1">struct</span> Sprites</td></tr><tr><td class="number">5</td><td><span class="k2">{</span></td></tr><tr><td class="number">6</td><td> <span class="k1">int</span> x, y<span class="k2">;</span></td></tr><tr><td class="number">7</td><td> <span class="k1">int</span> xSpeed, ySpeed<span class="k2">;</span></td></tr><tr><td class="number">8</td><td> <span class="k1">int</span> xDir, yDir<span class="k2">;</span></td></tr><tr><td class="number">9</td><td> <span class="k1">bool</span> isAlive<span class="k2">;</span></td></tr><tr><td class="number">10</td><td> <span class="k1">int</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_128.html" target="_blank">delay</a><span class="k2">;</span></td></tr><tr><td class="number">11</td><td> <span class="k1">int</span> curFrame, maxFrame<span class="k2">;</span></td></tr><tr><td class="number">12</td><td><span class="k2">}</span>monster<span class="k2">;</span></td></tr><tr><td class="number">13</td><td>&#160;</td></tr><tr><td class="number">14</td><td>&#160;</td></tr><tr><td class="number">15</td><td><span class="k1">void</span> setup_sprites<span class="k2">(</span>Sprites <span class="k3">*</span>Sprite<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> Sprite-&gt;x <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span>%<span class="n">100</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td> Sprite-&gt;y <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span>%<span class="n">100</span><span class="k2">;</span></td></tr><tr><td class="number">19</td><td> Sprite-&gt;xSpeed <span class="k3">=</span> <span class="n">2</span><span class="k2">;</span> <span class="c">//--Move 2 pixels per keystroke</span></td></tr><tr><td class="number">20</td><td> Sprite-&gt;ySpeed <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> <span class="c">//--Vertical movement</span></td></tr><tr><td class="number">21</td><td> Sprite-&gt;xDir <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span> <span class="c">//Default = +ve</span></td></tr><tr><td class="number">22</td><td> Sprite-&gt;yDir <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> <span class="c">//No movement in Y direction</span></td></tr><tr><td class="number">23</td><td> Sprite-&gt;isAlive <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td> Sprite-&gt;delay <span class="k3">=</span> <span class="n">20</span><span class="k2">;</span></td></tr><tr><td class="number">25</td><td> Sprite-&gt;curFrame <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td> Sprite-&gt;maxFrame <span class="k3">=</span> <span class="n">3</span><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> </td></tr><tr><td class="number">29</td><td><span class="k1">void</span> update_sprite<span class="k2">(</span>Sprites <span class="k3">*</span>Sprite<span class="k2">)</span></td></tr><tr><td class="number">30</td><td><span class="k2">{</span></td></tr><tr><td class="number">31</td><td> <span class="k1">if</span><span class="k2">(</span>Sprite-&gt;xDir <span class="k3">=</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span>    </td></tr><tr><td class="number">32</td><td>  Sprite-&gt;x <span class="k3">+</span><span class="k3">=</span> Sprite-&gt;xSpeed<span class="k2">;</span></td></tr><tr><td class="number">33</td><td> <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>Sprite-&gt;xDir <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">34</td><td>  Sprite-&gt;x <span class="k3">-</span><span class="k3">=</span> Sprite-&gt;xSpeed<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>  Sprite-&gt;x <span class="k3">+</span><span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> </td></tr><tr><td class="number">37</td><td> </td></tr><tr><td class="number">38</td><td> <span class="k1">if</span><span class="k2">(</span>Sprite-&gt;yDir <span class="k3">=</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span>    </td></tr><tr><td class="number">39</td><td>  Sprite-&gt;y <span class="k3">+</span><span class="k3">=</span> Sprite-&gt;ySpeed<span class="k2">;</span></td></tr><tr><td class="number">40</td><td> <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>Sprite-&gt;yDir <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">41</td><td>  Sprite-&gt;y <span class="k3">-</span><span class="k3">=</span> Sprite-&gt;ySpeed<span class="k2">;</span></td></tr><tr><td class="number">42</td><td> <span class="k1">else</span></td></tr><tr><td class="number">43</td><td>  Sprite-&gt;y <span class="k3">+</span><span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">44</td><td>  </td></tr><tr><td class="number">45</td><td>  Sprite-&gt;curFrame<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">46</td><td>  </td></tr><tr><td class="number">47</td><td>  <span class="k1">if</span><span class="k2">(</span>Sprite-&gt;curFrame&gt;3<span class="k2">)</span></td></tr><tr><td class="number">48</td><td>   Sprite-&gt;curFrame <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">49</td><td><span class="k2">}</span></td></tr><tr><td class="number">50</td><td>&#160;</td></tr><tr><td class="number">51</td><td>    </td></tr><tr><td class="number">52</td><td><span class="k1">int</span> main<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> <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></td></tr><tr><td class="number">55</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><a href="http://www.allegro.cc/manual/desktop_color_depth" target="_blank"><span class="a">desktop_color_depth</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">56</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></td></tr><tr><td class="number">57</td><td> </td></tr><tr><td class="number">58</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></td></tr><tr><td class="number">59</td><td> </td></tr><tr><td class="number">60</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="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">61</td><td> <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>image <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">"monster.bmp"</span>, NULL<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">62</td><td> </td></tr><tr><td class="number">63</td><td> <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>buffer<span class="k2">)</span></td></tr><tr><td class="number">64</td><td> <span class="k2">{</span></td></tr><tr><td class="number">65</td><td>  <a href="http://www.allegro.cc/manual/allegro_message" target="_blank"><span class="a">allegro_message</span></a><span class="k2">(</span><span class="s">"Double Buffering Failed, outta here..."</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">66</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">67</td><td>  <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><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> <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>image<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>  <a href="http://www.allegro.cc/manual/allegro_message" target="_blank"><span class="a">allegro_message</span></a><span class="k2">(</span><span class="s">"Sprite loading failed... outta here"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">72</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">73</td><td>  <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><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> </td></tr><tr><td class="number">76</td><td> Sprites <span class="k3">*</span>Sprite <span class="k3">=</span> <span class="k3">&amp;</span>monster<span class="k2">;</span>  </td></tr><tr><td class="number">77</td><td> <span class="c">//--Lock Screen</span></td></tr><tr><td class="number">78</td><td> <a href="http://www.allegro.cc/manual/acquire_screen" target="_blank"><span class="a">acquire_screen</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">79</td><td> </td></tr><tr><td class="number">80</td><td> <span class="c">//--Set up initial behaviour of sprites</span></td></tr><tr><td class="number">81</td><td> setup_sprites<span class="k2">(</span>Sprite<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">82</td><td> </td></tr><tr><td class="number">83</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">84</td><td> <span class="k2">{</span></td></tr><tr><td class="number">85</td><td>  <span class="k1">int</span> x <span class="k3">=</span> image-&gt;w<span class="k3">/</span><span class="k2">(</span>Sprite-&gt;maxFrame<span class="k3">+</span><span class="n">1</span><span class="k2">)</span><span class="k3">*</span>Sprite-&gt;curFrame<span class="k2">;</span></td></tr><tr><td class="number">86</td><td>  <span class="k1">int</span> y <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">87</td><td>                       </td></tr><tr><td class="number">88</td><td>  update_sprite<span class="k2">(</span>Sprite<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">89</td><td>  <a href="http://www.allegro.cc/manual/rest" target="_blank"><span class="a">rest</span></a><span class="k2">(</span>Sprite-&gt;delay<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">90</td><td>  <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>image, buffer, x, y, Sprite-&gt;x, Sprite-&gt;y, </td></tr><tr><td class="number">91</td><td>       <span class="k2">(</span>image-&gt;w<span class="k3">/</span><span class="k2">(</span>Sprite-&gt;maxFrame<span class="k3">+</span><span class="n">1</span><span class="k2">)</span><span class="k2">)</span>, image-&gt;h<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">92</td><td>  </td></tr><tr><td class="number">93</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">94</td><td> <span class="k2">}</span></td></tr><tr><td class="number">95</td><td> <a href="http://www.allegro.cc/manual/release_screen" target="_blank"><span class="a">release_screen</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">96</td><td> </td></tr><tr><td class="number">97</td><td> <a href="http://www.allegro.cc/manual/destroy_bitmap" target="_blank"><span class="a">destroy_bitmap</span></a><span class="k2">(</span>image<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">98</td><td> <a href="http://www.allegro.cc/manual/destroy_bitmap" target="_blank"><span class="a">destroy_bitmap</span></a><span class="k2">(</span>buffer<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">99</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">100</td><td> <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">101</td><td><span class="k2">}</span></td></tr><tr><td class="number">102</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>

Thanks in advance!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (horizon981)</author>
		<pubDate>Sun, 13 Aug 2006 13:18:52 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
struct Sprites<br />{<br /> int x, y;<br /> int xSpeed, ySpeed;<br /> int xDir, yDir;<br /> bool isAlive;<br /> int delay;<br /> int curFrame, maxFrame;<br />}monster;</p><p>void setup_sprites(Sprites *Sprite)
</p></div></div><p>That&#39;s wrong. Do</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">struct</span> Sprites
<span class="k2">{</span>
 <span class="k1">int</span> x, y<span class="k2">;</span>
 <span class="k1">int</span> xSpeed, ySpeed<span class="k2">;</span>
 <span class="k1">int</span> xDir, yDir<span class="k2">;</span>
 <span class="k1">bool</span> isAlive<span class="k2">;</span>
 <span class="k1">int</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_128.html" target="_blank">delay</a><span class="k2">;</span>
 <span class="k1">int</span> curFrame, maxFrame<span class="k2">;</span>
<span class="k2">}</span>Sprites<span class="k2">;</span>
</pre></div></div><p>

Edit: For clarification, right now you have a struct called monster, but use a struct called Sprites. Also, again, drop the ; at <tt>END_OF_MAIN()</tt> <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kauhiz)</author>
		<pubDate>Sun, 13 Aug 2006 13:27:23 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>In case you didn&#39;t notice, Sprite is a <b>pointer</b> to struct monster.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (horizon981)</author>
		<pubDate>Sun, 13 Aug 2006 14:13:09 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Sprite is declared as Sprites *Sprite. So, what is Sprites?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kauhiz)</author>
		<pubDate>Sun, 13 Aug 2006 14:21:41 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You&#39;re doing more than drawing to the screen between the acquire/release_screen pairs. You don&#39;t need to call them at all when you only draw to the screen once per loop.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kitty Cat)</author>
		<pubDate>Sun, 13 Aug 2006 15:04:20 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Sprites is a structure that holds all the data about a sprite. monster is an instance of this structure. Sprite is a pointer to monster. Does that help?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (horizon981)</author>
		<pubDate>Sun, 13 Aug 2006 15:28:26 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Wait, I think you&#39;re right, what was I looking at... Well, Kitty Cat is right anyway, the acquire/release bitmap calls are placed horribly, either get rid of them all together or just put them around the blitting (right now they&#39;re both outside the main loop <img src="http://www.allegro.cc/forums/smileys/shocked.gif" alt=":o" />)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kauhiz)</author>
		<pubDate>Sun, 13 Aug 2006 15:56:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks a lot!!<br />What was wrong with the screen acquire cammands?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (horizon981)</author>
		<pubDate>Sun, 13 Aug 2006 17:36:44 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>If I remember correctly, you can only do drawing operations between acquire/release_screen() calls. And they are only beneficial when you draw to the screen multiple times in a row, which you aren&#39;t doing.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Jonny Cook)</author>
		<pubDate>Sun, 13 Aug 2006 17:43:46 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You should throw the book you&#39;re reading out the window. It&#39;s no good.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (miran)</author>
		<pubDate>Sun, 13 Aug 2006 18:58:00 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The screen needs to be acquired before it&#39;s drawn to. After that, it needs to be released. Blit does this automatically, unless you do it manually. The reason you may want to do it manually, is that if you draw a lot of stuff to the screen, it&#39;s better to acquire the screen then draw everything and release the screen than acquire before and release after every blit. The way you had it would release the screen after the user presses ESC, which just terrible.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kauhiz)</author>
		<pubDate>Sun, 13 Aug 2006 19:27:14 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>So, is double buffering as good as manually acquiring the screen?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (horizon981)</author>
		<pubDate>Sun, 13 Aug 2006 20:02:18 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You should be double buffering anyway. And its like comparing apples to oranges, double buffering has nothing to do with acquiring the screen.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (BAF)</author>
		<pubDate>Sun, 13 Aug 2006 20:05:45 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>From my limited experience, double buffering eliminates flickering, really helps when using a custom mouse pointer. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /></p><p>Also, I&#39;ve never used acquire_screen() - release_screen() functions, and all my games have run pretty well.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kikaru)</author>
		<pubDate>Mon, 14 Aug 2006 00:20:17 +0000</pubDate>
	</item>
</rss>
