<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Help on a Pixel-Perfect Collision Detection Algorithm</title>
		<link>http://www.allegro.cc/forums/view/589491</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sun, 14 Jan 2007 03:40:22 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m creating a scrolling shooter and I need a pixel-perfect collision detection algorithm for bullet-to-obstacle collisions. I started creating one and tested it and it didn&#39;t work at all. (ouchies) I think I went about it the entirely wrong way. Here&#39;s what I came up with.</p><p>I figured that first, I&#39;d obtain the bounding boxes for the sprites. The bounding boxes are at a 20% decreased size. Next I&#39;d check to see if there is a bounding box collision. If there is, then I&#39;d start testing the non-transparent pixels in the bullet against the non-transparent pixels in the obstacle. If they were in the same spot, then there was a collision. But I&#39;m starting to think I thought wrong haha.</p><p>Here&#39;s the code I came up with. Please scrutinize at will if need be.</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> bullets_norm_collision<span class="k2">(</span>SPRITE <span class="k3">*</span>obstacle<span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">2</td><td>  <span class="c">//variable declarations</span></td></tr><tr><td class="number">3</td><td>  <span class="k1">int</span> left1<span class="k2">;</span></td></tr><tr><td class="number">4</td><td>  <span class="k1">int</span> left2<span class="k2">;</span></td></tr><tr><td class="number">5</td><td>  <span class="k1">int</span> right1<span class="k2">;</span></td></tr><tr><td class="number">6</td><td>  <span class="k1">int</span> right2<span class="k2">;</span></td></tr><tr><td class="number">7</td><td>  <span class="k1">int</span> top1<span class="k2">;</span></td></tr><tr><td class="number">8</td><td>  <span class="k1">int</span> top2<span class="k2">;</span></td></tr><tr><td class="number">9</td><td>  <span class="k1">int</span> bottom1<span class="k2">;</span></td></tr><tr><td class="number">10</td><td>  <span class="k1">int</span> bottom2<span class="k2">;</span></td></tr><tr><td class="number">11</td><td>  </td></tr><tr><td class="number">12</td><td>  <span class="c">//holds the current pixel color in the bullet</span></td></tr><tr><td class="number">13</td><td>  <span class="k1">int</span> current_pixel_color_bullet<span class="k2">;</span></td></tr><tr><td class="number">14</td><td>  <span class="c">//holds the current pixel color in the obstacle</span></td></tr><tr><td class="number">15</td><td>  <span class="k1">int</span> current_pixel_color_obstacle<span class="k2">;</span></td></tr><tr><td class="number">16</td><td>  <span class="c">//counters for the pixel loops</span></td></tr><tr><td class="number">17</td><td>  <span class="k1">int</span> x1, y1, x2, y2<span class="k2">;</span></td></tr><tr><td class="number">18</td><td>  <span class="c">//holders for the pixel colors</span></td></tr><tr><td class="number">19</td><td>  <span class="k1">int</span> br, bg, bb, oor, oog, oob<span class="k2">;</span></td></tr><tr><td class="number">20</td><td>  <span class="c">//flags</span></td></tr><tr><td class="number">21</td><td>  <span class="k1">int</span> bullet_pixel_trans, obstacle_pixel_trans<span class="k2">;</span></td></tr><tr><td class="number">22</td><td>  </td></tr><tr><td class="number">23</td><td>  <span class="c">//store neccessary information for bounding box detection</span></td></tr><tr><td class="number">24</td><td>  left1 <span class="k3">=</span> bullets_norm-&gt;x <span class="k3">+</span> bullets_norm-&gt;col_x_offset<span class="k2">;</span></td></tr><tr><td class="number">25</td><td>  left2 <span class="k3">=</span> obstacle-&gt;x <span class="k3">+</span> obstacle-&gt;col_x_offset<span class="k2">;</span></td></tr><tr><td class="number">26</td><td>  right1 <span class="k3">=</span> left1 <span class="k3">+</span> bullets_norm-&gt;col_width<span class="k2">;</span></td></tr><tr><td class="number">27</td><td>  right2 <span class="k3">=</span> left2 <span class="k3">+</span> obstacle-&gt;col_width<span class="k2">;</span></td></tr><tr><td class="number">28</td><td>  top1 <span class="k3">=</span> bullets_norm-&gt;y <span class="k3">+</span> bullets_norm-&gt;col_y_offset<span class="k2">;</span></td></tr><tr><td class="number">29</td><td>  top2 <span class="k3">=</span> obstacle-&gt;y <span class="k3">+</span> obstacle-&gt;col_y_offset<span class="k2">;</span></td></tr><tr><td class="number">30</td><td>  bottom1 <span class="k3">=</span> top1 <span class="k3">+</span> bullets_norm-&gt;col_height<span class="k2">;</span></td></tr><tr><td class="number">31</td><td>  bottom2 <span class="k3">=</span> top2 <span class="k3">+</span> obstacle-&gt;col_height<span class="k2">;</span></td></tr><tr><td class="number">32</td><td>  </td></tr><tr><td class="number">33</td><td>  <span class="c">//check for bounding box collision</span></td></tr><tr><td class="number">34</td><td>  <span class="k1">if</span><span class="k2">(</span>bottom1 <span class="k3">&lt;</span> top2 <span class="k3">|</span><span class="k3">|</span> top1 <span class="k3">&gt;</span> bottom2 <span class="k3">|</span><span class="k3">|</span> right1 <span class="k3">&lt;</span> left2 <span class="k3">|</span><span class="k3">|</span> left1 <span class="k3">&gt;</span> right2<span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">35</td><td>    <span class="c">//loop through the obstacle</span></td></tr><tr><td class="number">36</td><td>    <span class="k1">for</span><span class="k2">(</span>y2 <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> y2 <span class="k3">&lt;</span> bottom2<span class="k2">;</span> y2<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">37</td><td>      <span class="k1">for</span><span class="k2">(</span>x2 <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> x2 <span class="k3">&lt;</span> right2<span class="k2">;</span> x2<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">38</td><td>        <span class="c">//get the current pixel's color</span></td></tr><tr><td class="number">39</td><td>        current_pixel_color_obstacle <span class="k3">=</span> <a href="http://www.allegro.cc/manual/getpixel" target="_blank"><span class="a">getpixel</span></a><span class="k2">(</span>obstacle-&gt;reference, x2, y2<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">40</td><td>        <span class="c">//debug</span></td></tr><tr><td class="number">41</td><td>        <span class="k1">if</span><span class="k2">(</span>current_pixel_color_obstacle <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">42</td><td>          generic_error<span class="k2">(</span><span class="s">"Failed to read obstacle's current pixel!"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">43</td><td>                                <span class="k1">else</span><span class="k2">{</span></td></tr><tr><td class="number">44</td><td>          <span class="c">//extract the individual hues from the pixel</span></td></tr><tr><td class="number">45</td><td>          oor <span class="k3">=</span> <a href="http://www.allegro.cc/manual/getr" target="_blank"><span class="a">getr</span></a><span class="k2">(</span>current_pixel_color_obstacle<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">46</td><td>          oog <span class="k3">=</span> <a href="http://www.allegro.cc/manual/getg" target="_blank"><span class="a">getg</span></a><span class="k2">(</span>current_pixel_color_obstacle<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">47</td><td>          oob <span class="k3">=</span> <a href="http://www.allegro.cc/manual/getb" target="_blank"><span class="a">getb</span></a><span class="k2">(</span>current_pixel_color_obstacle<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">48</td><td>        <span class="k2">}</span></td></tr><tr><td class="number">49</td><td>      </td></tr><tr><td class="number">50</td><td>        <span class="c">//loop through the bullet</span></td></tr><tr><td class="number">51</td><td>        <span class="k1">for</span><span class="k2">(</span>y1 <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> y1 <span class="k3">&lt;</span> bottom1<span class="k2">;</span> y1<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">52</td><td>          <span class="k1">for</span><span class="k2">(</span>x1 <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> x1 <span class="k3">&lt;</span> right1<span class="k2">;</span> x1<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">53</td><td>            <span class="c">//get the current pixel's color</span></td></tr><tr><td class="number">54</td><td>            current_pixel_color_bullet <span class="k3">=</span> <a href="http://www.allegro.cc/manual/getpixel" target="_blank"><span class="a">getpixel</span></a><span class="k2">(</span>bullets_norm-&gt;reference, x1, y1<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">55</td><td>            <span class="c">//debug</span></td></tr><tr><td class="number">56</td><td>            <span class="k1">if</span><span class="k2">(</span>current_pixel_color_bullet <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">57</td><td>              generic_error<span class="k2">(</span><span class="s">"Failed to read bullet's current pixel!"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">58</td><td>            <span class="k1">else</span><span class="k2">{</span></td></tr><tr><td class="number">59</td><td>              <span class="c">//extract the individual hues from the pixel</span></td></tr><tr><td class="number">60</td><td>              br <span class="k3">=</span> <a href="http://www.allegro.cc/manual/getr" target="_blank"><span class="a">getr</span></a><span class="k2">(</span>current_pixel_color_bullet<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">61</td><td>              bg <span class="k3">=</span> <a href="http://www.allegro.cc/manual/getg" target="_blank"><span class="a">getg</span></a><span class="k2">(</span>current_pixel_color_bullet<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">62</td><td>              bb <span class="k3">=</span> <a href="http://www.allegro.cc/manual/getb" target="_blank"><span class="a">getb</span></a><span class="k2">(</span>current_pixel_color_bullet<span class="k2">)</span><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>          </td></tr><tr><td class="number">65</td><td>            <span class="c">//compare the pixels of the bullet against the obstacle</span></td></tr><tr><td class="number">66</td><td>            <span class="k1">if</span><span class="k2">(</span>oor <span class="k3">=</span><span class="k3">=</span> <span class="n">255</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> oob <span class="k3">=</span><span class="k3">=</span> <span class="n">255</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> oog <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">67</td><td>              obstacle_pixel_trans <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">68</td><td>            <span class="k1">else</span></td></tr><tr><td class="number">69</td><td>              obstacle_pixel_trans <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">70</td><td>            <span class="k1">if</span><span class="k2">(</span>br <span class="k3">=</span><span class="k3">=</span> <span class="n">255</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> bb <span class="k3">=</span><span class="k3">=</span> <span class="n">255</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> bg <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">71</td><td>              bullet_pixel_trans <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">72</td><td>            <span class="k1">else</span></td></tr><tr><td class="number">73</td><td>              bullet_pixel_trans <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">74</td><td>            </td></tr><tr><td class="number">75</td><td>            <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>bullet_pixel_trans <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k3">!</span>obstacle_pixel_trans<span class="k2">)</span></td></tr><tr><td class="number">76</td><td>              <span class="c">//we have a collision folks!</span></td></tr><tr><td class="number">77</td><td>              <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">78</td><td>          <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>      <span class="k2">}</span></td></tr><tr><td class="number">81</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">82</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">83</td><td>  </td></tr><tr><td class="number">84</td><td>  <span class="c">//no collision</span></td></tr><tr><td class="number">85</td><td>  <span class="k1">return</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></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (xmltorrent)</author>
		<pubDate>Tue, 09 Jan 2007 04:01:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Your method, although a nice idea, is way too slow. Instead, have a look at the  <a href="http://people.ifm.liu.se/ulfek/bitmask/">bitmask collision detection library</a>. It works, it&#39;s fast, it&#39;s free, you just add it to your projects and it will let you get on with coding the rest of your game.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (HardTranceFan)</author>
		<pubDate>Tue, 09 Jan 2007 04:41:46 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks. I had a feeling it was going to be way to slow. (all those for loops... ick!!!)</p><p>Onto experimenting with BitMask. After reading and pondering over the very vague usage instructions, I&#39;ve come to terms with this:</p><p>Basically, with BitMask, I create BitMasks for the sprites. Then for collisions, I use the BitMasks (BitMask functions) rather than the sprites themselves. Is that about right?</p><p>Any pointers on how to get started using BitMask would be really helpful because I&#39;ve got this weird feeling that I&#39;m going to have to rewrite a lot of stuff in my code. (actually the more correct term would be re-adapt the code but that&#39;s still a pain)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (xmltorrent)</author>
		<pubDate>Tue, 09 Jan 2007 04:59:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>From memory, there is better much documentation in the download file than there is on the web page.</p><p>Yes, you create a bitmask from the sprite image you have, and you pass the two bitmasks you want to test for a collision, plus the offsets between the two sprites.</p><p>I&#39;ll provide some sample code when I get home later today, along with a small function I wrote for the library which takes an Allegro bitmap and returns the bitmask.</p><p>[edit]<br />I&#39;ve attached my updated version of the bitmask library, which includes the function to create a bitmask from an Allegro bitmap.</p><p>Sample code:
</p><div class="source-code snippet"><div class="inner"><pre><span class="c">// Just some 'position' variables for the example</span>
<span class="k1">int</span> x1 <span class="k3">=</span> <span class="n">100</span>, , y1 <span class="k3">=</span> <span class="n">100</span>, x2 <span class="k3">=</span> <span class="n">120</span>, y2 <span class="k3">=</span> <span class="n">101</span><span class="k2">;</span>

<span class="c">// to create the bitmasks from a bitmaps</span>
<a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span> bmp1 <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">"image1.bmp"</span>, NULL<span class="k2">)</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> bmp2 <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">"image2.bmp"</span>, NULL<span class="k2">)</span><span class="k2">;</span>
bitmaks_t<span class="k3">*</span> mask1 <span class="k3">=</span> bitmask_new<span class="k2">(</span>bmp1<span class="k2">)</span><span class="k2">;</span>
bitmaks_t<span class="k3">*</span> mask2 <span class="k3">=</span> bitmask_new<span class="k2">(</span>bmp2<span class="k2">)</span><span class="k2">;</span>

<span class="c">// and for collision detection</span>
bitmask_overlap<span class="k2">(</span>mask1, mask2, x1-x2, y1-y2<span class="k2">)</span>
</pre></div></div><p>

Oh, and my memory failed me. The documentation within the orignal code wasn&#39;t much better than the web site.<br />[/edit]
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (HardTranceFan)</author>
		<pubDate>Tue, 09 Jan 2007 05:26:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">xmltorrent said:</div><div class="quote"><p>

(all those for loops... ick!!!)
</p></div></div><p>
Here&#39;s a hint. As well as getting the collision-detection to work as fast as possible, try working on ways to reduce the number of collisons that need to take place. One way of doing it is to divide the world into sectors and only test for collisions of objects in the same sector (in two dimensions, if the minimum sector-size is no smaller than the largest object you want to test for collisions, an object can be in a maximum of four sectors).</p><p>AE.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Andrei Ellman)</author>
		<pubDate>Wed, 10 Jan 2007 20:58:00 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hes already doing a bounding box test first, which will be more effective then using sector divisions.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ImLeftFooted)</author>
		<pubDate>Thu, 11 Jan 2007 00:03:54 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Hes already doing a bounding box test first, which will be more effective then using sector divisions.
</p></div></div><p>
Andrei Ellman is referring to higher level collision detection, i.e. the algorithm for figuring out which objects get checked at all.  It can be (if the number of objects is large enough) far faster than a simple bounding box implementation that checks all bounding boxes against all other bounding boxes.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (orz)</author>
		<pubDate>Thu, 11 Jan 2007 00:17:34 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Bounding box is so fast anyway...</p><p>If you wanted to get faster I would just convert to circles.  Its probably faster anyway (pointer lookups and list management can be sloooow).  And keeping everything sorted would be a bigger drain.</p><p>Sectoring is good for stuff like MMORPGs and crap.  Or if you just have an unbelievable amount of units or infinite terrain.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ImLeftFooted)</author>
		<pubDate>Thu, 11 Jan 2007 00:19:26 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
If you wanted to get faster I would just convert to circles.
</p></div></div><p>

You know something, that sounds interesting and I&#39;ve never thought of using those at all. And considering the fact that I&#39;m still in expiremental stages with the game, I don&#39;t see the harm in going back and using a bounding circle rather than a bounding rectangle.</p><p>Plus I&#39;m having some trouble getting used to using BitMask. I&#39;m not sure if I&#39;m supposed to compile the BitMask files and link an object file or what because just including the header file, it doesn&#39;t solve the linker errors.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (xmltorrent)</author>
		<pubDate>Thu, 11 Jan 2007 04:33:41 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>xmltorrent, I don&#39;t understand the problem you have with the bitmask functions. I&#39;ve added the two files (the ones I attached in an earlier post) to my projects, and included the header file in every class that uses a bitmask type or function. No problems.</p><p>What errors are you getting, and are you including the bitmask files in your project (attach your file(s) if it need be)?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (HardTranceFan)</author>
		<pubDate>Thu, 11 Jan 2007 04:54:59 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Optimisation isn&#39;t just about creating the fastest collision-detection algorithm possible, but also about deciding on whether or not the collision-detections need to take place in the first place.</p><p>AE.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Andrei Ellman)</author>
		<pubDate>Thu, 11 Jan 2007 06:23:41 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>How very <i>profound</i> <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Jonatan Hedborg)</author>
		<pubDate>Thu, 11 Jan 2007 06:25:41 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
What errors are you getting, and are you including the bitmask files in your project (attach your file(s) if it need be)?
</p></div></div><p>

The linker says there&#39;s an undefined reference to bitmask_new, the function you posted in your sample block above.</p><p>EDIT:<br />Which I know what that means but I can&#39;t seem to come up with where that function came from or it&#39;s equivalent. It&#39;s not listed anywhere in the header or source file for BitMask.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
... but also about deciding on whether or not the collision-detections need to take place in the first place.
</p></div></div><p>

Hence the reason I&#39;m trying to get as fast as I can with the collision-detections because they kinda HAVE to happen. ^_^
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (xmltorrent)</author>
		<pubDate>Fri, 12 Jan 2007 01:49:58 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
The linker says there&#39;s an undefined reference to bitmask_new, the function you posted in your sample block above.</p><p>EDIT:<br />Which I know what that means but I can&#39;t seem to come up with where that function came from or it&#39;s equivalent. It&#39;s not listed anywhere in the header or source file for BitMask.
</p></div></div><p>
Are you sure you know what it means? <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /><img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /></p><p>It means you&#39;re using the bitmask header and source files from the web-site, and not those attached to my second post <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" />.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (HardTranceFan)</author>
		<pubDate>Fri, 12 Jan 2007 02:42:13 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Haha Whoops. I just noticed that attachment icon at the top of the post haha. My bad.</p><p>ummmm I can&#39;t download the attachment. I click on the icon and it&#39;s not doing anything at all.</p><p>EDIT:<br />Nevermind, I got it to work. I think I just need to go back to bed today. <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (xmltorrent)</author>
		<pubDate>Fri, 12 Jan 2007 02:48:42 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>n00b:P;D
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (HardTranceFan)</author>
		<pubDate>Fri, 12 Jan 2007 02:53:11 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Haha <img src="http://www.allegro.cc/forums/smileys/cry.gif" alt=":&#39;(" /></p><p>EDIT:</p><p>I had to make a slight modification to your function. The for loops in bitmask_new function were picked up as being declared outside C99. I just declared the counter variables as local variables in the function and went from there. Just thought you might want to know that. ^_^</p><p>EDIT 2:</p><p>Haha Another problem has arisen. I think it might just be my brain not working right today or what but I&#39;ll explain.</p><p>The sprites that I&#39;m using BitMask for are all animated. Now my first plan of attack was to create a BitMask for each frame of animation then when I perform my collision detection, I loop through all the BitMasks for each frame and perform checking on the other sprites BitMasks. However, while the program runs perfectly fine, it always says that there is a collision with an enemy plane when I know that the player plane isn&#39;t anywhere near the enemy plane when the program starts. So I&#39;m guessing that another method is needed. Pondering.....
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (xmltorrent)</author>
		<pubDate>Fri, 12 Jan 2007 03:33:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ta. I probably won&#39;t change my code, as I&#39;m developing in C++, which doesn&#39;t kick up about it.</p><p>Heh, I just spotted some redundent code in the function (&quot;temp-&gt;w = w;&quot; and &quot;temp-&gt;h = h&quot;).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (HardTranceFan)</author>
		<pubDate>Fri, 12 Jan 2007 04:01:20 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>argh!!!</p><p>What values should I use for the xoffset and yoffset for bitmask? I have a xoffset and yoffset value for my sprite struct but they don&#39;t seem to work.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (xmltorrent)</author>
		<pubDate>Sat, 13 Jan 2007 03:29:41 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
... but also about deciding on whether or not the collision-detections need to take place in the first place.
</p></div></div><p>Hence the reason I&#39;m trying to get as fast as I can with the collision-detections because they kinda HAVE to happen. ^_^
</p></div></div><p>What he meant by that was that when you have thousands of objects for the level then having a fast collision function is not much use. Much more useful would be to find out those few things you have to collide with and only check those. </p><p>E.g using a quadtree could tell you what other objects are near the object you need to collide with. Using the same way you can also find out the objects you have on screen. Without any kind of space partitioning you will have to ton N^2 tests whereas with finding only objects on screen you will most likely cut that down to a fraction of it. </p><p>When you also use quadtree to find objects near the one you are colliding with instead of colliding all the objects on screen it can very easily be that you only have to make only a few collision tests per frame. Finding those few collision detections will save a lot more time than making your collision code 10x faster. I bet even your own ugly version would be good enough with decent partitionig scheme.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (HoHo)</author>
		<pubDate>Sat, 13 Jan 2007 03:59:46 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
What values should I use for the xoffset and yoffset for bitmask? I have a xoffset and yoffset value for my sprite struct but they don&#39;t seem to work.
</p></div></div><p>
The xOffset and yOffset are just the x and y differences between the two sprites of the bitmasks you are passing (as per my sample code).</p><p>If you still have trouble, post the code.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (HardTranceFan)</author>
		<pubDate>Sat, 13 Jan 2007 16:16:43 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>bllawrgle....</p><p>Okay. Here&#39;s what I have for the player initialization function: (displays the xoffset and yoffset values)</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> init_player<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">2</td><td>    <span class="c">//variable declarations</span></td></tr><tr><td class="number">3</td><td>    <span class="k1">int</span> frame_counter<span class="k2">;</span></td></tr><tr><td class="number">4</td><td>    </td></tr><tr><td class="number">5</td><td>    <span class="c">//load the master bitmap into memory</span></td></tr><tr><td class="number">6</td><td>    master_holder <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">"player_plane_master.bmp"</span>, <span class="s">'\0'</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">7</td><td>    <span class="c">//debug</span></td></tr><tr><td class="number">8</td><td>    <span class="k1">if</span><span class="k2">(</span>master_holder <span class="k3">=</span><span class="k3">=</span> <span class="s">'\0'</span><span class="k2">)</span></td></tr><tr><td class="number">9</td><td>        generic_error<span class="k2">(</span><span class="s">"can't find player sprite master sheet"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">10</td><td>    <span class="k1">else</span><span class="k2">{</span></td></tr><tr><td class="number">11</td><td>        <span class="c">//extract the frames to the frame array</span></td></tr><tr><td class="number">12</td><td>        <span class="k1">for</span><span class="k2">(</span>frame_counter <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> frame_counter <span class="k3">&lt;</span> <span class="n">3</span><span class="k2">;</span> frame_counter<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">13</td><td>            player_images<span class="k2">[</span>frame_counter<span class="k2">]</span> <span class="k3">=</span> grab_frame<span class="k2">(</span>master_holder, <span class="n">65</span>, <span class="n">65</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">3</span>, frame_counter<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">14</td><td>      player_mask<span class="k2">[</span>frame_counter<span class="k2">]</span> <span class="k3">=</span> bitmask_new<span class="k2">(</span>player_images<span class="k2">[</span>frame_counter<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">15</td><td>      <span class="c">//debug</span></td></tr><tr><td class="number">16</td><td>      <span class="k1">if</span><span class="k2">(</span>player_images<span class="k2">[</span>frame_counter<span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> <span class="s">'\0'</span><span class="k2">)</span></td></tr><tr><td class="number">17</td><td>          generic_error<span class="k2">(</span><span class="s">"failed to load the frame into player_images frame array"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td>      <span class="c">//debug</span></td></tr><tr><td class="number">19</td><td>      <span class="k1">if</span><span class="k2">(</span>player_mask<span class="k2">[</span>frame_counter<span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> <span class="s">'\0'</span><span class="k2">)</span></td></tr><tr><td class="number">20</td><td>          generic_error<span class="k2">(</span><span class="s">"failed to make bitmask of player sprite frame"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">21</td><td>  <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>&#160;</td></tr><tr><td class="number">24</td><td>    <span class="c">//remove the master bitmap</span></td></tr><tr><td class="number">25</td><td>    <a href="http://www.allegro.cc/manual/destroy_bitmap" target="_blank"><span class="a">destroy_bitmap</span></a><span class="k2">(</span>master_holder<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td>  </td></tr><tr><td class="number">27</td><td>    <span class="c">//allocate memory for the player sprite</span></td></tr><tr><td class="number">28</td><td>    player <span class="k3">=</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>SPRITE<span class="k2">)</span><span class="k2">)</span><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="c">//define the player sprite</span></td></tr><tr><td class="number">31</td><td>    player-&gt;width <span class="k3">=</span> player_images<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>w<span class="k2">;</span></td></tr><tr><td class="number">32</td><td>    player-&gt;height <span class="k3">=</span> player_images<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>h<span class="k2">;</span></td></tr><tr><td class="number">33</td><td>    player-&gt;x <span class="k3">=</span> <span class="k2">(</span>WIN_WIDTH <span class="k3">/</span> <span class="n">2</span><span class="k2">)</span> <span class="k3">+</span> <span class="k2">(</span>player-&gt;width <span class="k3">/</span> <span class="n">2</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">34</td><td>    player-&gt;y <span class="k3">=</span> <span class="n">50</span><span class="k2">;</span></td></tr><tr><td class="number">35</td><td>    player-&gt;dir <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">36</td><td>    player-&gt;alive <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">37</td><td>    player-&gt;xspeed <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">38</td><td>    player-&gt;yspeed <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">39</td><td>    player-&gt;xcount <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">40</td><td>    player-&gt;ycount <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">41</td><td>    player-&gt;xdelay <span class="k3">=</span> <span class="n">10</span><span class="k2">;</span></td></tr><tr><td class="number">42</td><td>    player-&gt;ydelay <span class="k3">=</span> <span class="n">10</span><span class="k2">;</span></td></tr><tr><td class="number">43</td><td>    player-&gt;framecount <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">44</td><td>    player-&gt;framedelay <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">45</td><td>    player-&gt;curframe <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">46</td><td>    player-&gt;maxframe <span class="k3">=</span> <span class="n">2</span><span class="k2">;</span></td></tr><tr><td class="number">47</td><td>    player-&gt;animdir <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">48</td><td>    player-&gt;bbwidth <span class="k3">=</span> player-&gt;width <span class="k3">*</span> <span class="n">0</span>.<span class="n">80</span><span class="k2">;</span></td></tr><tr><td class="number">49</td><td>    player-&gt;bbheight <span class="k3">=</span> player-&gt;height <span class="k3">*</span> <span class="n">0</span>.<span class="n">80</span><span class="k2">;</span></td></tr><tr><td class="number">50</td><td>    player-&gt;xoffset <span class="k3">=</span> <span class="k2">(</span>player-&gt;width <span class="k3">-</span> player-&gt;bbwidth<span class="k2">)</span> <span class="k3">/</span> <span class="n">2</span><span class="k2">;</span></td></tr><tr><td class="number">51</td><td>    player-&gt;yoffset <span class="k3">=</span> <span class="k2">(</span>player-&gt;height <span class="k3">-</span> player-&gt;bbheight<span class="k2">)</span> <span class="k3">/</span> <span class="n">2</span><span class="k2">;</span></td></tr><tr><td class="number">52</td><td>    player-&gt;reference <span class="k3">=</span> player_images<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">53</td><td>    player-&gt;bullet_mode <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">54</td><td>    player-&gt;bullet_timeout <span class="k3">=</span> <span class="n">20</span><span class="k2">;</span></td></tr><tr><td class="number">55</td><td>    player-&gt;allowed_to_shoot <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">56</td><td><span class="k2">}</span><a href="http://www.allegro.cc/manual/END_OF_FUNCTION" target="_blank"><span class="a">END_OF_FUNCTION</span></a><span class="k2">(</span>init_player<span class="k2">)</span><span class="k2">;</span></td></tr></tbody></table></div></div><p>

This is where I&#39;m totally lost at. Like I used those values for bounding box collisions but now I&#39;m not sure how to accomidate those values to BitMask.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (xmltorrent)</author>
		<pubDate>Sun, 14 Jan 2007 03:40:22 +0000</pubDate>
	</item>
</rss>
