<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Collision Detection crashes SOMETIMES</title>
		<link>http://www.allegro.cc/forums/view/612988</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sat, 27 Jul 2013 04:25:37 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ve deleted my old thread on the same topic because it had 0 replies and I&#39;ve been doing a lot of testing with my program to get the problem to arise again, so I think it will be easier to help me this time. Here&#39;s what I&#39;ve found out:</p><p><span class="remote-thumbnail"><span class="json">{"name":"trHMr8i.jpg","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/9\/6\/96bff340e81e0945d979ba811d43d910.jpg","w":1975,"h":1358,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/9\/6\/96bff340e81e0945d979ba811d43d910"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/9/6/96bff340e81e0945d979ba811d43d910-240.jpg" alt="trHMr8i.jpg" width="240" height="165" /></span><br /><sup>Since it&#39;s kind of small on these forums, here are what the captions read from left to right, top to bottom:</sup><br /><sup>&quot;What&#39;s supposed to happen: Other plane explodes, you lose health&quot; | &quot;Bad: Tail bounding boxes do not recognize eachother&quot; | &quot;Bad: rear side of wings do not recognize eachother&quot;</sup><br /><sup>&quot;Moving left wing-to-wing causes crash&quot; | &quot;Moving up left wing to right wing causes crash, right side does not do this&quot; | &quot;Moving left with a NEAR collision (enemy plane is not moving) causes crash&quot;</sup></p><p>Alternatively you can just <a href="http://i.imgur.com/trHMr8i.jpg">view the image at imgur.</a></p><p>This is a screenshot of the bounding boxes drawn around the objects. It seems to only be Character left side to Enemy right side that causes problems. It was harder to get the error to occur in debug mode for some reason (and also explosion animations don&#39;t work in debug mode - weird) but I finally got it while driving left straight against an enemy, wing-to-wing.</p><p>Just before the error occurs, the error flags on line 42 of object.cpp. The call stack looks like this:
</p><div class="source-code snippet"><div class="inner"><pre><span class="n">0</span> <span class="n">00404070</span> OBJECT::get_x<span class="k2">(</span><span class="k1">this</span><span class="k3">=</span><span class="n">0xfeeefeee</span><span class="k2">)</span> <span class="k3">|</span> object.cpp ln <span class="n">42</span>
<span class="n">1</span> <span class="n">00404AA4</span> ROOM::step<span class="k2">(</span><span class="k1">this</span><span class="k3">=</span><span class="n">0x5ea370</span><span class="k2">)</span> <span class="k3">|</span> room.cpp ln <span class="n">81</span>
<span class="n">2</span> <span class="n">00403BFA</span> game_loop<span class="k2">(</span><span class="k2">)</span> <span class="k3">|</span> main.cpp ln <span class="n">129</span>
<span class="n">3</span> <span class="n">00403D6F</span> main<span class="k2">(</span>argc<span class="k3">=</span><span class="n">1</span>, argv<span class="k3">=</span><span class="n">0x3015d0</span><span class="k2">)</span> <span class="k3">|</span> main.cpp ln <span class="n">204</span>
</pre></div></div><p>

Those pieces of code are as follows:<br /><b>object.cpp</b>
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">int</span> OBJECT::get_x<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span>
    <span class="k1">return</span> x<span class="k2">;</span> <span class="c">//LINE 42!!!</span>
<span class="k2">}</span>
</pre></div></div><p>
<b>room.cpp</b>
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number"> 57</span><span class="k1">void</span> ROOM::step<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 58</span>    <span class="k1">for</span><span class="k2">(</span> OBJECT<span class="k3">*</span> i <span class="k2">:</span> activeInstances<span class="k2">)</span><span class="k2">{</span> <span class="c">//Let each object perform step operation</span>
<span class="number"> 59</span>                i-&gt;step<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 60</span>    <span class="k2">}</span>
<span class="number"> 61</span>    <span class="k1">for</span><span class="k2">(</span> <span class="k1">auto</span> it <span class="k3">=</span> activeInstances.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> it <span class="k3">!</span><span class="k3">=</span> activeInstances.end<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k2">)</span><span class="k2">{</span> <span class="c">//Delete dead instances</span>
<span class="number"> 62</span>        <span class="k1">if</span><span class="k2">(</span> <span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>is_dead<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 63</span>            <span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>on_death<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="c">//NEW LINE</span>
<span class="number"> 64</span>            it <span class="k3">=</span> activeInstances.erase<span class="k2">(</span>it<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 65</span>        <span class="k2">}</span><span class="k1">else</span><span class="k2">{</span>
<span class="number"> 66</span>            it<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 67</span>        <span class="k2">}</span>
<span class="number"> 68</span>    <span class="k2">}</span>
<span class="number"> 69</span>
<span class="number"> 70</span>    <span class="c">//Create enemies</span>
<span class="number"> 71</span>    <span class="k1">if</span><span class="k2">(</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">90</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 72</span>        instance_create<span class="k2">(</span> <span class="s">"objEnemyOlive"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 73</span>    <span class="k2">}</span>
<span class="number"> 74</span>
<span class="number"> 75</span>    <span class="c">//Collision detect</span>
<span class="number"> 76</span>    <span class="k1">float</span> obj1x, obj1y, obj2x, obj2y<span class="k2">;</span>
<span class="number"> 77</span>    <span class="k1">for</span><span class="k2">(</span> <span class="k1">auto</span> it1 <span class="k3">=</span> activeInstances.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> it1 <span class="k3">!</span><span class="k3">=</span> activeInstances.end<span class="k2">(</span><span class="k2">)</span> <span class="k3">-</span> <span class="n">1</span><span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>it1<span class="k2">)</span><span class="k2">{</span> <span class="c">//Iterator for object 1</span>
<span class="number"> 78</span>        obj1x <span class="k3">=</span> <span class="k2">(</span><span class="k3">*</span>it1<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>get_x<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 79</span>        obj1y <span class="k3">=</span> <span class="k2">(</span><span class="k3">*</span>it1<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>get_y<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 80</span>        <span class="k1">for</span><span class="k2">(</span> <span class="k1">auto</span> it2 <span class="k3">=</span> it1 <span class="k3">+</span> <span class="n">1</span><span class="k2">;</span> it2 <span class="k3">!</span><span class="k3">=</span> activeInstances.end<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>it2<span class="k2">)</span><span class="k2">{</span> <span class="c">//Iterator for object 2</span>
<span class="number"> 81</span>            obj2x <span class="k3">=</span> <span class="k2">(</span><span class="k3">*</span>it2<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>get_x<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="c">//LINE 81!!!</span>
<span class="number"> 82</span>            obj2y <span class="k3">=</span> <span class="k2">(</span><span class="k3">*</span>it2<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>get_y<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 83</span>            <span class="k1">for</span><span class="k2">(</span> RECTANGLE <span class="k3">&amp;</span>obj1bb <span class="k2">:</span> <span class="k2">(</span><span class="k3">*</span>it1<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>bb<span class="k2">)</span><span class="k2">{</span> <span class="c">//Reference to object 1's bounding box</span>
<span class="number"> 84</span>                <span class="k1">for</span><span class="k2">(</span> RECTANGLE <span class="k3">&amp;</span>obj2bb <span class="k2">:</span> <span class="k2">(</span><span class="k3">*</span>it2<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>bb<span class="k2">)</span><span class="k2">{</span> <span class="c">//Reference to object 2's bounding box</span>
<span class="number"> 85</span>                    <span class="k1">if</span><span class="k2">(</span> obj1x <span class="k3">+</span> obj1bb.x1 <span class="k3">&lt;</span> obj2x <span class="k3">+</span> obj2bb.x2 <span class="k3">&amp;</span><span class="k3">&amp;</span> obj1x <span class="k3">+</span> obj1bb.x2 <span class="k3">&gt;</span> obj2x <span class="k3">+</span> obj2bb.x1 <span class="k3">&amp;</span><span class="k3">&amp;</span>
<span class="number"> 86</span>                       obj1y <span class="k3">+</span> obj1bb.y1 <span class="k3">&lt;</span> obj2y <span class="k3">+</span> obj2bb.y2 <span class="k3">&amp;</span><span class="k3">&amp;</span> obj1y <span class="k3">+</span> obj1bb.y2 <span class="k3">&gt;</span> obj2y <span class="k3">+</span> obj2bb.y2<span class="k2">)</span><span class="k2">{</span> <span class="c">//DOES COLLIDE</span>
<span class="number"> 87</span>                        <span class="k2">(</span><span class="k3">*</span>it1<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>collide<span class="k2">(</span> <span class="k3">*</span>it2<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 88</span>                    <span class="k2">}</span>
<span class="number"> 89</span>                <span class="k2">}</span>
<span class="number"> 90</span>            <span class="k2">}</span>
<span class="number"> 91</span>        <span class="k2">}</span>
<span class="number"> 92</span>    <span class="k2">}</span>
<span class="number"> 93</span><span class="k2">}</span>
</div></div><p>
<b>main.cpp game_loop()</b>
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">if</span><span class="k2">(</span>event.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_TIMER<span class="k2">)</span><span class="k2">{</span>
    redraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
    roomLib.allRooms<span class="k2">[</span>currentLevel<span class="k2">]</span>.step<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="c">//LINE 129!!!</span>
<span class="k2">}</span>
</pre></div></div><p>

The portion of code in ROOM::step that is causing the error is the collision detection portion. For some reason, the second instance that is called for collision testing is throwing the error when its x value is trying to return but this only happens DURING a collision which seems strange because these values are called every single step but only during a collision the object does not want to give up its x value (it doesn&#39;t want to die!).</p><p><s>It&#39;s not an issue with the array activeInstances changing sizes and accidentally accessing an element out of bounds because in that case it would happen for every collision and, additionally, no elements are deleted from the array during this phase, they are only flagged for deletion by setting their boolean variable &lt;code&gt;dead&lt;/code&gt; to true.</s></p><p><b>Edit:</b> I didn&#39;t realize I was changing the size of the vector by creating the explosion object. I&#39;ve altered the code so that all OBJECTs now have a <span class="source-code"><span class="k1">void</span> OBJECT::on_death<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></span> function that creates the explosion. I&#39;ve updated the ROOM function above and commented it with <span class="source-code"><span class="c">//NEW LINE</span></span>. Unfortunately, this has not eliminated the error.</p><p>For reference, here are the functions called by the collision checking:
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">int</span> OBJECT::get_x<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span>
    <span class="k1">return</span> x<span class="k2">;</span>
<span class="k2">}</span>

<span class="k1">int</span> OBJECT::get_y<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span>
    <span class="k1">return</span> y<span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="k1">void</span> CHARACTER::collide<span class="k2">(</span> OBJECT<span class="k3">*</span> objOther<span class="k2">)</span><span class="k2">{</span>
<span class="number">  2</span>    <span class="k1">switch</span><span class="k2">(</span> objOther-&gt;get_object_id<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">{</span>
<span class="number">  3</span>        <span class="k1">case</span> idEnemyOlive:
<span class="number">  4</span>            score <span class="k3">+</span><span class="k3">=</span> <span class="n">5</span><span class="k2">;</span>
<span class="number">  5</span>            roomLib.allRooms<span class="k2">[</span>currentLevel<span class="k2">]</span>.instance_create
<span class="number">  6</span>            <span class="k2">(</span>
<span class="number">  7</span>                <span class="s">"objExplosionSm"</span>, objOther-&gt;get_x<span class="k2">(</span><span class="k2">)</span>, objOther-&gt;get_y<span class="k2">(</span><span class="k2">)</span>
<span class="number">  8</span>             <span class="k2">)</span><span class="k2">;</span>
<span class="number">  9</span>            objOther-&gt;kill<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 10</span>            hp <span class="k3">-</span><span class="k3">=</span> <span class="n">20</span><span class="k2">;</span>
<span class="number"> 11</span>            <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 12</span>    <span class="k2">}</span>
<span class="number"> 13</span><span class="k2">}</span>
<span class="number"> 14</span>
<span class="number"> 15</span><span class="k1">void</span> BULLET::collide<span class="k2">(</span> OBJECT<span class="k3">*</span> objOther<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 16</span>    <span class="k1">switch</span><span class="k2">(</span> objOther-&gt;get_object_id<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 17</span>        <span class="k1">case</span> idEnemyOlive:
<span class="number"> 18</span>            score <span class="k3">+</span><span class="k3">=</span> <span class="n">10</span><span class="k2">;</span>
<span class="number"> 19</span>            roomLib.allRooms<span class="k2">[</span>currentLevel<span class="k2">]</span>.instance_create
<span class="number"> 20</span>            <span class="k2">(</span>
<span class="number"> 21</span>                <span class="s">"objExplosionSm"</span>, objOther-&gt;get_x<span class="k2">(</span><span class="k2">)</span>, objOther-&gt;get_y<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 22</span>             <span class="k2">)</span><span class="k2">;</span>
<span class="number"> 23</span>            objOther-&gt;kill<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 24</span>            <a href="http://www.delorie.com/djgpp/doc/libc/libc_519.html" target="_blank">kill</a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 25</span>            <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span> <span class="s">"%i\n"</span>, score<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 26</span>            <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 27</span>    <span class="k2">}</span>
<span class="number"> 28</span><span class="k2">}</span>
<span class="number"> 29</span>
<span class="number"> 30</span><span class="k1">void</span> ENEMY_OLIVE::collide<span class="k2">(</span> OBJECT<span class="k3">*</span> objOther<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 31</span>    <span class="k1">switch</span><span class="k2">(</span> objOther-&gt;get_object_id<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 32</span>        <span class="k1">case</span> idBullet:
<span class="number"> 33</span>            score <span class="k3">+</span><span class="k3">=</span> <span class="n">10</span><span class="k2">;</span>
<span class="number"> 34</span>            objOther-&gt;kill<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 35</span>            roomLib.allRooms<span class="k2">[</span>currentLevel<span class="k2">]</span>.instance_create<span class="k2">(</span> <span class="s">"objExplosionSm"</span>, x, y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 36</span>            <a href="http://www.delorie.com/djgpp/doc/libc/libc_519.html" target="_blank">kill</a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 37</span>            <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 38</span>        <span class="k1">case</span> idCharacter:
<span class="number"> 39</span>            score <span class="k3">+</span><span class="k3">=</span> <span class="n">5</span><span class="k2">;</span>
<span class="number"> 40</span>            hp <span class="k3">-</span><span class="k3">=</span> <span class="n">20</span><span class="k2">;</span>
<span class="number"> 41</span>            <a href="http://www.delorie.com/djgpp/doc/libc/libc_519.html" target="_blank">kill</a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 42</span>            <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 43</span>    <span class="k2">}</span>
<span class="number"> 44</span><span class="k2">}</span>
</div></div><p>
Code called by the collide functions:
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">int</span> OBJECT::get_object_id<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span>
    <span class="k1">return</span> objectId<span class="k2">;</span>
<span class="k2">}</span>

<span class="k1">void</span> OBJECT::kill<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span>
    dead <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>
And last but not least:<br /><b>globals.h</b>
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">enum</span> OBJECT_IDS<span class="k2">{</span>
    idObject, idCharacter, idIsland, idExplosionSm, idExplosionLg,
    idBullet, idEnemy, idEnemyOlive
<span class="k2">}</span><span class="k2">;</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (AmnesiA)</author>
		<pubDate>Thu, 18 Jul 2013 02:44:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Dang there&#39;s a lot of code there. BUT, the first thing I saw is this :
</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/612988/987428#target">AmnesiA</a> said:</div><div class="quote"><p>
</p><div class="source-code snippet"><div class="inner"><pre><span class="n">0</span> <span class="n">00404070</span> OBJECT::get_x<span class="k2">(</span><span class="k1">this</span><span class="k3">=</span><span class="n">0xfeeefeee</span><span class="k2">)</span> <span class="k3">|</span> object.cpp ln <span class="n">42</span>
</pre></div></div><p>
</p></div></div><p>

Make special notice of the address 0xfeeefeee. It&#39;s one of the magic addresses compilers use in debugging mode to mark uninitialized memory. Another is 0xdeadbeef. You probably have an uninitialized pointer somewhere that you added to your vector of OBJECT*.</p><p>And I&#39;m curious how you deleted your old thread. I love it when people say that, when only the Supreme Loser and his minions have the power to do that. <img src="http://www.allegro.cc/forums/smileys/cheesy.gif" alt=":D" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Thu, 18 Jul 2013 02:56:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yeah, I actually had PLANNED to delete my old thread after posting the new one only to find out that I can&#39;t actually delete it, so I just edited it to point to this thread. Sorry!</p><p>As for my issue, I edited my above post to reflect that I realized that I was ADDING an OBJECT* to the activeInstances vector but fixing THAT issue did not solve my problem.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (AmnesiA)</author>
		<pubDate>Thu, 18 Jul 2013 03:14:17 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The backtrace is still the same? Then you are still adding an uninitialized pointer to your vector or accessing it somewhere else.</p><p>I can&#39;t tell where it is in ROOM::step() because you don&#39;t have the line numbers lined up properly. Use a start=&quot;#&quot; attribute inside your code tag to change the starting line number of the displayed code.</p><p>So, what is line 80 of room.cpp?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Thu, 18 Jul 2013 03:23:23 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ve added the start=# i didn&#39;t know about that, instead I just commented the line <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /> The error now occurs on line 81 because of the line I added in ROOM::step() (<span class="source-code"><span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>on_death<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></span>)</p><p>It may also be worth noting that I can also get a crash when a bullet collides with an enemy plane if the bullet registers its collision after it reaches the back of the left side of the wing bounding box.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (AmnesiA)</author>
		<pubDate>Thu, 18 Jul 2013 04:17:40 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m not sure why, but on line 81, it2 has to be an invalid iterator, or else it points to an uninitialized pointer.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Thu, 18 Jul 2013 04:28:56 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>That&#39;s what I was thinking too but the only place in the code that things are added to the vector is:
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number"> 10</span>OBJECT<span class="k3">*</span> ROOM::instance_create<span class="k2">(</span> <span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span> object_type,             <span class="c">//TO DO: rearrange vector so</span>
<span class="number"> 11</span>                              <span class="k1">float</span> arg1, <span class="k1">float</span> arg2, <span class="k1">float</span> arg3,   <span class="c">//objects draw correctly, lower objects</span>
<span class="number"> 12</span>                              <span class="k1">float</span> arg4, <span class="k1">float</span> arg5, <span class="k1">float</span> arg6<span class="k2">)</span><span class="k2">{</span>  <span class="c">//at the beginning of the vector</span>
<span class="number"> 13</span>    <span class="k1">if</span><span class="k2">(</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_754.html" target="_blank">strcmp</a><span class="k2">(</span> object_type, <span class="s">"objCharacter"</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 14</span>        newObject <span class="k3">=</span> <span class="k1">new</span> CHARACTER<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span>    <span class="k2">}</span><span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_754.html" target="_blank">strcmp</a><span class="k2">(</span> object_type, <span class="s">"objIsland"</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 16</span>        newObject <span class="k3">=</span> <span class="k1">new</span> ISLAND<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 17</span>    <span class="k2">}</span><span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_754.html" target="_blank">strcmp</a><span class="k2">(</span> object_type, <span class="s">"objBullet"</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 18</span>        newObject <span class="k3">=</span> <span class="k1">new</span> BULLET<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span>    <span class="k2">}</span><span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_754.html" target="_blank">strcmp</a><span class="k2">(</span> object_type, <span class="s">"objExplosionSm"</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 20</span>        newObject <span class="k3">=</span> <span class="k1">new</span> SM_EXPLOSION<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 21</span>    <span class="k2">}</span><span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_754.html" target="_blank">strcmp</a><span class="k2">(</span> object_type, <span class="s">"objExplosionLg"</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 22</span>        newObject <span class="k3">=</span> <span class="k1">new</span> LG_EXPLOSION<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 23</span>    <span class="k2">}</span><span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_754.html" target="_blank">strcmp</a><span class="k2">(</span> object_type, <span class="s">"objEnemyOlive"</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 24</span>        newObject <span class="k3">=</span> <span class="k1">new</span> ENEMY_OLIVE<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 25</span>    <span class="k2">}</span><span class="k1">else</span><span class="k2">{</span>
<span class="number"> 26</span>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_298.html" target="_blank">exit</a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 27</span>    <span class="k2">}</span>
<span class="number"> 28</span>    newObject-&gt;init<span class="k2">(</span> arg1, arg2, arg3, arg4, arg5, arg6<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 29</span>
<span class="number"> 30</span>    <span class="c">//Time to find out where this fits in according to depth</span>
<span class="number"> 31</span>    <span class="k1">if</span><span class="k2">(</span> activeInstances.size<span class="k2">(</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span><span class="k2">{</span> <span class="c">//If no instances exist, use push_back</span>
<span class="number"> 32</span>        activeInstances.push_back<span class="k2">(</span> newObject<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 33</span>    <span class="k2">}</span><span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span> newObject-&gt;get_depth<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">=</span> activeInstances.back<span class="k2">(</span><span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>get_depth<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">{</span> <span class="c">//If the new element is the closest already</span>
<span class="number"> 34</span>        activeInstances.push_back<span class="k2">(</span> newObject<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 35</span>    <span class="k2">}</span><span class="k1">else</span><span class="k2">{</span>
<span class="number"> 36</span>        <span class="k1">for</span><span class="k2">(</span> <span class="k1">auto</span> it <span class="k3">=</span> activeInstances.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> it <span class="k3">!</span><span class="k3">=</span> activeInstances.end<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>it<span class="k2">)</span><span class="k2">{</span> <span class="c">//Find the first element that is further back</span>
<span class="number"> 37</span>            <span class="k1">if</span><span class="k2">(</span> newObject-&gt;get_depth<span class="k2">(</span><span class="k2">)</span> <span class="k3">&gt;</span><span class="k3">=</span> <span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>get_depth<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 38</span>                activeInstances.insert<span class="k2">(</span> it, newObject<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 39</span>                <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 40</span>            <span class="k2">}</span>
<span class="number"> 41</span>        <span class="k2">}</span>
<span class="number"> 42</span>    <span class="k2">}</span>
<span class="number"> 43</span>
<span class="number"> 44</span>    <span class="k1">return</span> newObject<span class="k2">;</span>
<span class="number"> 45</span><span class="k2">}</span>
</div></div><p>

So I don&#39;t think it&#39;s an uninitialized pointer. I haven&#39;t been able to find information with my usual resource, google, on whether or not I can change the size of a vector inside a range based for using that vector. I suppose it comes down to whether or not the vector&#39;s size is checked on each iteration or if it&#39;s just checked at the beginning.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (AmnesiA)</author>
		<pubDate>Thu, 18 Jul 2013 05:35:15 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Maybe in this case it sometimes doesn&#39;t insert into the vector?</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">for</span><span class="k2">(</span> <span class="k1">auto</span> it <span class="k3">=</span> activeInstances.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> it <span class="k3">!</span><span class="k3">=</span> activeInstances.end<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>it<span class="k2">)</span><span class="k2">{</span> <span class="c">//Find the first element that is further back</span>
    <span class="k1">if</span><span class="k2">(</span> newObject-&gt;get_depth<span class="k2">(</span><span class="k2">)</span> <span class="k3">&gt;</span><span class="k3">=</span> <span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>get_depth<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">{</span>
        activeInstances.insert<span class="k2">(</span> it, newObject<span class="k2">)</span><span class="k2">;</span>
        <span class="k1">break</span><span class="k2">;</span>
    <span class="k2">}</span>
<span class="k2">}</span>
</pre></div></div><p>

perhaps try this and see if it prints:</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">bool</span> inserted <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="k1">for</span><span class="k2">(</span> <span class="k1">auto</span> it <span class="k3">=</span> activeInstances.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> it <span class="k3">!</span><span class="k3">=</span> activeInstances.end<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>it<span class="k2">)</span><span class="k2">{</span> <span class="c">//Find the first element that is further back</span>
    <span class="k1">if</span><span class="k2">(</span> newObject-&gt;get_depth<span class="k2">(</span><span class="k2">)</span> <span class="k3">&gt;</span><span class="k3">=</span> <span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>get_depth<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">{</span>
        activeInstances.insert<span class="k2">(</span> it, newObject<span class="k2">)</span><span class="k2">;</span>
        inserted <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
        <span class="k1">break</span><span class="k2">;</span>
    <span class="k2">}</span>
<span class="k2">}</span>
<span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>inserted<span class="k2">)</span> cout<span class="k3">&lt;</span><span class="k3">&lt;</span><span class="s">"ERROR\n"</span><span class="k2">;</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ph03nix)</author>
		<pubDate>Thu, 18 Jul 2013 05:48:09 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I don&#39;t think that&#39;s possible unless it&#39;s due to some error that it doesn&#39;t get inserted because the loop before it checks if the depth is &lt;= the last object in the vector and if it&#39;s not then it goes into the for loop to find out where it belongs.</p><p>Even if for some bizarre reason the object isn&#39;t inserted like it should be, I just wouldn&#39;t have any way to access that object, it wouldn&#39;t cause an error. I&#39;ll add a catch just to be safe when I&#39;m back at my computer though.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (AmnesiA)</author>
		<pubDate>Thu, 18 Jul 2013 07:21:34 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>why don&#39;t you print the memory addresses of activeInstances or look at them through your debugger to see if any of them are invalid</p><p>also, are the explosions added to activeInstances?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ph03nix)</author>
		<pubDate>Thu, 18 Jul 2013 07:58:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yes the explosions are added to activeInstances and deleted once their animation completes.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (AmnesiA)</author>
		<pubDate>Thu, 18 Jul 2013 09:00:46 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I still can&#39;t see why there is an uninitialized pointer in your vector, but you have a memory leak here :
</p><div class="source-code"><div class="toolbar"><span class="name">room.cpp</span><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number"> 61</span>    <span class="k1">for</span><span class="k2">(</span> <span class="k1">auto</span> it <span class="k3">=</span> activeInstances.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> it <span class="k3">!</span><span class="k3">=</span> activeInstances.end<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k2">)</span><span class="k2">{</span> <span class="c">//Delete dead instances</span>
<span class="number"> 62</span>        <span class="k1">if</span><span class="k2">(</span> <span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>is_dead<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 63</span>            <span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>on_death<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="c">//NEW LINE</span>
<span class="number"> 64</span>            it <span class="k3">=</span> activeInstances.erase<span class="k2">(</span>it<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 65</span>        <span class="k2">}</span><span class="k1">else</span><span class="k2">{</span>
<span class="number"> 66</span>            it<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 67</span>        <span class="k2">}</span>
<span class="number"> 68</span>    <span class="k2">}</span>
</div></div><p>
You need to call <span class="source-code"><span class="k1">delete</span> <span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k2">;</span></span> before you remove it from the vector or else your handle disappears and you can never free it.</p><p>instance_create is really the only place you add OBJECT* to your activeInstances vector?</p><p>Okay - I think I&#39;m getting closer. When two objects collide, you call instance_create to create an explosion. This changes the contents of the vector and invalidates any iterators currently pointing to it. So then when it returns into the doubly nested for loop in ROOM::step, it accesses an invalidated iterator pointing to memory that is no longer in use by the vector.</p><p>To solve this problem, use another vector to store all the objects you will add to the activeInstances vector, say addInstances. Then when you&#39;re done with collision checking, merge the addInstances vector with the activeInstances vector, and then clear the addInstances vector.</p><p>I <b>think</b> that should solve your problem, or at least get you closer to a functioning program.</p><p>And by the way, when the vector&#39;s size is 0, vec.end() - 1 does not equal vec.end(), nor will you ever reach it by incrementing your iterator from begin().
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Thu, 18 Jul 2013 11:38:47 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ahhh, I forgot that adding elements to a vector invalidates iterators. I&#39;ll fix that first thing tomorrow. Any idea why those overlapping bounding boxes aren&#39;t registering a collision though?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (AmnesiA)</author>
		<pubDate>Thu, 18 Jul 2013 16:05:13 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It looks like a bug here :<br /><span class="source-code"><span class="k3">&amp;</span><span class="k3">&amp;</span> obj1y <span class="k3">+</span> obj1bb.y2 <span class="k3">&gt;</span> obj2y <span class="k3">+</span> obj2bb.y2<span class="k2">)</span><span class="k2">{</span> <span class="c">//DOES COLLIDE</span></span><br />You&#39;re checking if the bottom of 1 is greater than the bottom of 2 but you should be checking against the top of 2.</p><p>Edit<br /><a href="https://www.allegro.cc/forums/thread/612994">Little tidbit of wisdom regarding 0xfeeefeee</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Fri, 19 Jul 2013 02:42:54 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/612988/987494#target">Edgar Reynaldo</a> said:</div><div class="quote"><p>It looks like a bug here :<br />&amp;&amp; obj1y + obj1bb.y2 &gt; obj2y + obj2bb.y2){ //DOES COLLIDE<br />You&#39;re checking if the bottom of 1 is greater than the bottom of 2 but you should be checking against the top of 2.</p><p>Edit<br />Little tidbit of wisdom regarding 0xfeeefeee</p></div></div><p>

Wow most helpful post of all time. I can&#39;t believe I missed that obj2bb.y2 was supposed to be y1... so dumb and so easy. That page with all the memory bit patterns is also SUPER helpful. I didn&#39;t realize memory addresses could be helpful to me for anything other than comparison. Thank you!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (AmnesiA)</author>
		<pubDate>Sat, 20 Jul 2013 13:55:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>So everything is working now?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Sat, 20 Jul 2013 20:40:11 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yes everything is working great now. I was adding to the vector inside a loop trying to iterate through the vector so sometimes an object would take 2 steps where it was supposed to take 1 and on rare occasions it would even crash the game. I just created a separate vector called instancesToCreate which holds all of the instances created that step and then at the end of the step I call void ROOM::activateInstances() and that moves all of the contents of instancesToCreate into activeInstances and everything works perfectly.</p><p>That collision detection thing was big too <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /> Thank you again!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (AmnesiA)</author>
		<pubDate>Sat, 27 Jul 2013 04:25:37 +0000</pubDate>
	</item>
</rss>
