<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>collision</title>
		<link>http://www.allegro.cc/forums/view/587702</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sun, 24 Sep 2006 09:43:03 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hello all-</p><p>I&#39;m looking for a good collision detection library.  I tried compiling pmask (under linux) but got the following errors:</p><div class="source-code snippet"><div class="inner"><pre>pmask.c: In function ‘install_pmask’<span class="k2">:</span>
pmask.c:34: error: size of array ‘_compile_time_assert__’ is negative
pmask.c: In function ‘init_pmask’<span class="k2">:</span>
pmask.c:40: warning: unused variable ‘error’
pmask.c: In function ‘get_serialized_pmask_size’<span class="k2">:</span>
pmask.c:105: warning: unused variable ‘words’
</pre></div></div><p>

The other library that is available is ppcol, but that doesn&#39;t appear to be available anymore.</p><p>Anyone able to provide any help or suggest a different collision library?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (spork222)</author>
		<pubDate>Sat, 23 Sep 2006 21:59:44 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m quite sure this is ppcol, happened to have it among my other &quot;good to have&quot; snippets =)</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="p">#include "collide.h"</span></td></tr><tr><td class="number">2</td><td>&#160;</td></tr><tr><td class="number">3</td><td><span class="c">/* collide_detect(x1, y1, sprite1, x2, y2, sprite2)</span></td></tr><tr><td class="number">4</td><td><span class="c">   checks on a per-pixel basis whether two sprites collided</span></td></tr><tr><td class="number">5</td><td><span class="c">   called 'pixel-perfect' collision detection</span></td></tr><tr><td class="number">6</td><td><span class="c">   the sprite coordinates are given from the upper-left.</span></td></tr><tr><td class="number">7</td><td><span class="c"></span></td></tr><tr><td class="number">8</td><td><span class="c">   The basic idea is to calculate the overlapping area of the two sprite</span></td></tr><tr><td class="number">9</td><td><span class="c">   rectangles.  If there is no overlap, return that the objects did not</span></td></tr><tr><td class="number">10</td><td><span class="c">   collide.  Otherwise, look at the pixels inside that area for both sprites.</span></td></tr><tr><td class="number">11</td><td><span class="c">   If, for a given pixel, both sprites have solid colors (i.e. not the masked</span></td></tr><tr><td class="number">12</td><td><span class="c">   color), then the sprites collided. */</span></td></tr><tr><td class="number">13</td><td>&#160;</td></tr><tr><td class="number">14</td><td><span class="k1">int</span> collide_detect<span class="k2">(</span><span class="k1">int</span> xmin1, <span class="k1">int</span> ymin1, <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>sprite1, <span class="k1">int</span> xmin2, <span class="k1">int</span> ymin2, <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>sprite2<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">15</td><td>  <span class="k1">int</span> xmax1 <span class="k3">=</span> xmin1 <span class="k3">+</span> sprite1-&gt;w, ymax1 <span class="k3">=</span> ymin1 <span class="k3">+</span> sprite1-&gt;h<span class="k2">;</span></td></tr><tr><td class="number">16</td><td>  <span class="k1">int</span> xmax2 <span class="k3">=</span> xmin2 <span class="k3">+</span> sprite2-&gt;w, ymax2 <span class="k3">=</span> ymin2 <span class="k3">+</span> sprite2-&gt;h<span class="k2">;</span></td></tr><tr><td class="number">17</td><td>  <span class="k1">int</span> xmin <span class="k3">=</span> max<span class="k2">(</span>xmin1, xmin2<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td>  <span class="k1">int</span> ymin <span class="k3">=</span> max<span class="k2">(</span>ymin1, ymin2<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">19</td><td>  <span class="k1">int</span> xmax <span class="k3">=</span> min<span class="k2">(</span>xmax1, xmax2<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td>  <span class="k1">int</span> ymax <span class="k3">=</span> min<span class="k2">(</span>ymax1, ymax2<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">21</td><td>  <span class="k1">if</span> <span class="k2">(</span>xmax <span class="k3">&lt;</span><span class="k3">=</span> xmin <span class="k3">|</span><span class="k3">|</span> ymax <span class="k3">&lt;</span><span class="k3">=</span> ymin<span class="k2">)</span> <span class="k2">{</span> <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span> <span class="k2">}</span></td></tr><tr><td class="number">22</td><td>  <span class="k1">int</span> mask1 <span class="k3">=</span> <a href="http://www.allegro.cc/manual/bitmap_mask_color" target="_blank"><span class="a">bitmap_mask_color</span></a><span class="k2">(</span>sprite1<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td>  <span class="k1">int</span> mask2 <span class="k3">=</span> <a href="http://www.allegro.cc/manual/bitmap_mask_color" target="_blank"><span class="a">bitmap_mask_color</span></a><span class="k2">(</span>sprite2<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td>  <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> y <span class="k3">=</span> ymin<span class="k2">;</span> y <span class="k3">&lt;</span> ymax<span class="k2">;</span> y<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">25</td><td>    <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> x <span class="k3">=</span> xmin<span class="k2">;</span> x <span class="k3">&lt;</span> xmax<span class="k2">;</span> x<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">26</td><td>      <span class="k1">int</span> x1 <span class="k3">=</span> x <span class="k3">-</span> xmin1, y1 <span class="k3">=</span> y <span class="k3">-</span> ymin1<span class="k2">;</span></td></tr><tr><td class="number">27</td><td>      <span class="k1">int</span> x2 <span class="k3">=</span> x <span class="k3">-</span> xmin2, y2 <span class="k3">=</span> y <span class="k3">-</span> ymin2<span class="k2">;</span></td></tr><tr><td class="number">28</td><td>      <span class="k1">int</span> color1 <span class="k3">=</span> <a href="http://www.allegro.cc/manual/getpixel" target="_blank"><span class="a">getpixel</span></a><span class="k2">(</span>sprite1, x1, y1<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">29</td><td>      <span class="k1">int</span> color2 <span class="k3">=</span> <a href="http://www.allegro.cc/manual/getpixel" target="_blank"><span class="a">getpixel</span></a><span class="k2">(</span>sprite2, x2, y2<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">30</td><td>      <span class="k1">if</span> <span class="k2">(</span>color1 <span class="k3">!</span><span class="k3">=</span> mask1 <span class="k3">&amp;</span><span class="k3">&amp;</span> color2 <span class="k3">!</span><span class="k3">=</span> mask2<span class="k2">)</span> <span class="k2">{</span> <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span> <span class="k2">}</span></td></tr><tr><td class="number">31</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">32</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">33</td><td>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">34</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

And the header ... </p><div class="source-code snippet"><div class="inner"><pre><span class="p">#ifndef COLLIDEH</span>
<span class="p">#define COLLIDEH</span>
<span class="p">#include &lt;allegro.h&gt;</span>
<span class="p">#include &lt;math.h&gt;</span>
<span class="p">#define max(a, b) (((a) &gt; (b)) ? (a): (b))</span>
<span class="p">#define min(a, b) (((a) &lt; (b)) ? (a): (b))</span>

<span class="k1">int</span> collide_detect<span class="k2">(</span><span class="k1">int</span> xmin1, <span class="k1">int</span> ymin1, <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>sprite1, <span class="k1">int</span> xmin2, <span class="k1">int</span> ymin2, <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>sprite2<span class="k2">)</span><span class="k2">;</span>
<span class="p">#endif</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ixilom)</author>
		<pubDate>Sun, 24 Sep 2006 00:04:43 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks <img src="http://www.allegro.cc/forums/smileys/grin.gif" alt=";D" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (spork222)</author>
		<pubDate>Sun, 24 Sep 2006 00:40:07 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The <u>compile_time_assert</u>_ error message with PMASK there is because you compiled in an environment where &quot;unsigned long int&quot; is 64 bits, and pmask defaults to assuming that it&#39;s 32 bits.  The third paragraph of the &quot;PORTABILITY &amp; PLATFORMS&quot; section of the docs describes how to compile it in such an environment.  </p><p>PPCOL will, I believe, in such an environment, will silently use twice as much memory, with half of it being never-modified zeroes.  </p><p>edit: when writting my initial post I glanced at ixilioms, saw the &quot;ppcol&quot;, and didn&#39;t read the quoted code.  Now I notice that he didn&#39;t actually link to PPCOL, but instead quoted PPCOLs allegro-sprite-collision-checker.  That code will probably work fine anywhere that Allegro works, though many people prefer the bitmask based functions offered by PMASK and PPCOL because they can be dramatically faster for medium-to-large sprites.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (orz)</author>
		<pubDate>Sun, 24 Sep 2006 01:31:38 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Oh yeah... kinda forget about 64bit problems like that sometimes.  Thanks, I will look at the docs more closely this time:-[
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (spork222)</author>
		<pubDate>Sun, 24 Sep 2006 03:02:30 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>This is kind of off the topic but one hint I can give you is to make all of your character move only by an interval of 4 and see if any of the tiles 4x4 are touching. Characters can vary their speeds by timing how often they move. The result is perfect collision detection with minimal effort. As of libraries that deal with collision detection I haven&#39;t heard of any, sorry.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Francois Lamini)</author>
		<pubDate>Sun, 24 Sep 2006 09:43:03 +0000</pubDate>
	</item>
</rss>
