<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Circle Collision Problems</title>
		<link>http://www.allegro.cc/forums/view/617607</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Fri, 09 Nov 2018 20:48:52 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m having trouble getting circles to bounce off of each other. I&#39;ve made 2 stand alone objects (c1 and c2, the unfilled white circles) that seem to work most of the time. My problem is when I try to make a vector to store them and to keep track of their collisions (b1 and b2 and the collision class) they act differently. You can click the lmb to grab one of the filled circles to make collisions easier. </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">class</span> CVec2D <span class="k2">{</span>
<span class="number">   2</span>public:
<span class="number">   3</span>  CVec2D<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">   4</span>  CVec2D<span class="k2">(</span><span class="k1">float</span>,<span class="k1">float</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">   5</span>  ~CVec2D<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span><span class="k2">}</span>
<span class="number">   6</span>
<span class="number">   7</span>  <span class="k1">float</span> GetX<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="number">   8</span>  <span class="k1">float</span> GetY<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>
<span class="number">   9</span>  <span class="k1">void</span> Set<span class="k2">(</span><span class="k1">float</span> xi,<span class="k1">float</span> yi<span class="k2">)</span><span class="k2">{</span>x<span class="k3">=</span>xi<span class="k2">;</span>y<span class="k3">=</span>yi<span class="k2">;</span>z<span class="k3">=</span><span class="n">1</span><span class="k2">;</span><span class="k2">}</span>
<span class="number">  10</span>  <span class="k1">void</span> SetX<span class="k2">(</span><span class="k1">float</span> xi<span class="k2">)</span><span class="k2">{</span>x<span class="k3">=</span>xi<span class="k2">;</span><span class="k2">}</span>
<span class="number">  11</span>  <span class="k1">void</span> SetY<span class="k2">(</span><span class="k1">float</span> yi<span class="k2">)</span><span class="k2">{</span>y<span class="k3">=</span>yi<span class="k2">;</span><span class="k2">}</span>
<span class="number">  12</span>  <span class="k1">void</span> Clear<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span>x<span class="k3">=</span><span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span>y<span class="k3">=</span><span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span>z<span class="k3">=</span><span class="n">1</span>.<span class="n">0f</span><span class="k2">;</span>w<span class="k3">=</span><span class="n">1</span>.<span class="n">0f</span><span class="k2">;</span><span class="k2">}</span>
<span class="number">  13</span>  <span class="k1">void</span> Add<span class="k2">(</span>CVec2D<span class="k2">)</span><span class="k2">;</span>
<span class="number">  14</span>  <span class="k1">void</span> Add<span class="k2">(</span><span class="k1">float</span> m<span class="k2">)</span><span class="k2">{</span>x<span class="k3">+</span><span class="k3">=</span>m<span class="k2">;</span>y<span class="k3">+</span><span class="k3">=</span>m<span class="k2">;</span><span class="k2">}</span>
<span class="number">  15</span>  <span class="k1">void</span> Add<span class="k2">(</span><span class="k1">float</span> xi,<span class="k1">float</span> yi<span class="k2">)</span><span class="k2">{</span>x<span class="k3">+</span><span class="k3">=</span>xi<span class="k2">;</span>y<span class="k3">+</span><span class="k3">=</span>yi<span class="k2">;</span><span class="k2">}</span>
<span class="number">  16</span>  <span class="k1">void</span> Mul<span class="k2">(</span><span class="k1">float</span> m<span class="k2">)</span><span class="k2">{</span>x<span class="k3">*</span><span class="k3">=</span>m<span class="k2">;</span>y<span class="k3">*</span><span class="k3">=</span>m<span class="k2">;</span><span class="k2">}</span>
<span class="number">  17</span>  <span class="k1">void</span> Mul<span class="k2">(</span><span class="k1">float</span> xi,<span class="k1">float</span> yi<span class="k2">)</span><span class="k2">{</span>x<span class="k3">*</span><span class="k3">=</span>xi<span class="k2">;</span>y<span class="k3">*</span><span class="k3">=</span>yi<span class="k2">;</span><span class="k2">}</span>
<span class="number">  18</span>  <span class="k1">void</span> Sub<span class="k2">(</span><span class="k1">float</span> m<span class="k2">)</span><span class="k2">{</span>x-<span class="k3">=</span>m<span class="k2">;</span>y-<span class="k3">=</span>m<span class="k2">;</span><span class="k2">}</span>
<span class="number">  19</span>  <span class="k1">void</span> Sub<span class="k2">(</span><span class="k1">float</span> xi,<span class="k1">float</span> yi<span class="k2">)</span><span class="k2">{</span>x-<span class="k3">=</span>xi<span class="k2">;</span>y-<span class="k3">=</span>yi<span class="k2">;</span><span class="k2">}</span>
<span class="number">  20</span>
<span class="number">  21</span>  <span class="k1">float</span> Length<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  22</span>  CVec2D Normalize<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  23</span>  <span class="k1">float</span> Dot<span class="k2">(</span>CVec2D<span class="k2">)</span><span class="k2">;</span>
<span class="number">  24</span>
<span class="number">  25</span>  <span class="k1">float</span> x,y,z,w<span class="k2">;</span>
<span class="number">  26</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  27</span>CVec2D::CVec2D<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span>Clear<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span><span class="k2">}</span>
<span class="number">  28</span>CVec2D::CVec2D<span class="k2">(</span><span class="k1">float</span> xi,<span class="k1">float</span> yi<span class="k2">)</span><span class="k2">{</span>Clear<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>Set<span class="k2">(</span>xi,yi<span class="k2">)</span><span class="k2">;</span><span class="k2">}</span>
<span class="number">  29</span>
<span class="number">  30</span><span class="k1">float</span> CVec2D::Length<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span>
<span class="number">  31</span>  <span class="k1">return</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_738.html" target="_blank">sqrt</a><span class="k2">(</span>x<span class="k3">*</span>x<span class="k3">+</span>y<span class="k3">*</span>y<span class="k2">)</span><span class="k2">;</span>
<span class="number">  32</span><span class="k2">}</span>
<span class="number">  33</span>CVec2D CVec2D::Normalize<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span>
<span class="number">  34</span>  CVec2D temp_vec<span class="k2">;</span>
<span class="number">  35</span>  <span class="k1">float</span> l <span class="k3">=</span> this-&gt;Length<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  36</span>  <span class="k1">if</span><span class="k2">(</span>l<span class="k3">!</span><span class="k3">=</span><span class="n">0</span><span class="k2">)</span><span class="k2">{</span>
<span class="number">  37</span>    temp_vec.x <span class="k3">=</span> x<span class="k3">/</span>l<span class="k2">;</span>
<span class="number">  38</span>    temp_vec.y <span class="k3">=</span> y<span class="k3">/</span>l<span class="k2">;</span>
<span class="number">  39</span>  <span class="k2">}</span>
<span class="number">  40</span>  <span class="k1">return</span> temp_vec<span class="k2">;</span>
<span class="number">  41</span><span class="k2">}</span>
<span class="number">  42</span><span class="k1">float</span> CVec2D::Dot<span class="k2">(</span>CVec2D vec<span class="k2">)</span><span class="k2">{</span>
<span class="number">  43</span>  <span class="k1">return</span> <span class="k2">(</span>x<span class="k3">*</span>vec.x <span class="k3">+</span>y<span class="k3">*</span>vec.y<span class="k2">)</span><span class="k2">;</span>
<span class="number">  44</span><span class="k2">}</span>
<span class="number">  45</span><span class="k1">void</span> CVec2D::Add<span class="k2">(</span>CVec2D v<span class="k2">)</span><span class="k2">{</span>
<span class="number">  46</span>  x<span class="k3">+</span><span class="k3">=</span>v.x<span class="k2">;</span>
<span class="number">  47</span>  y<span class="k3">+</span><span class="k3">=</span>v.y<span class="k2">;</span>
<span class="number">  48</span><span class="k2">}</span>
<span class="number">  49</span>
<span class="number">  50</span>
<span class="number">  51</span><span class="k1">class</span> CPenguin_Body <span class="k2">{</span>
<span class="number">  52</span>public:
<span class="number">  53</span>  CPenguin_Body<span class="k2">(</span><span class="k1">float</span>,<span class="k1">float</span>,<span class="k1">float</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  54</span>  ~CPenguin_Body<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span><span class="k2">}</span>
<span class="number">  55</span>
<span class="number">  56</span>  <span class="k1">void</span> Draw<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  57</span>  <span class="k1">void</span> Update<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  58</span>  <span class="k1">void</span> MouseGrab<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  59</span>
<span class="number">  60</span>  CVec2D position<span class="k2">;</span>
<span class="number">  61</span>  CVec2D velocity<span class="k2">;</span>
<span class="number">  62</span>  CVec2D acceleration<span class="k2">;</span>
<span class="number">  63</span>
<span class="number">  64</span>  <span class="k1">void</span> Bound<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  65</span>
<span class="number">  66</span>  <span class="k1">bool</span> CheckCollision<span class="k2">(</span>CPenguin_Body<span class="k3">*</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  67</span>  <span class="k1">bool</span> Check_Collision<span class="k2">(</span>std::vector<span class="k3">&lt;</span>CPenguin_Body<span class="k3">*</span><span class="k3">&gt;</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  68</span>  <span class="k1">bool</span> collision<span class="k2">;</span>
<span class="number">  69</span>  <span class="k1">float</span> radius<span class="k2">;</span>
<span class="number">  70</span>  <span class="k1">float</span> mass<span class="k2">;</span>
<span class="number">  71</span>
<span class="number">  72</span>  <span class="k1">int</span> id<span class="k2">;</span>
<span class="number">  73</span>
<span class="number">  74</span>  <span class="k1">bool</span> draw_full<span class="k2">;</span>
<span class="number">  75</span>
<span class="number">  76</span>  <span class="k1">static</span> <span class="k1">int</span> new_UID<span class="k2">;</span>
<span class="number">  77</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  78</span>CPenguin_Body::CPenguin_Body<span class="k2">(</span><span class="k1">float</span> x,<span class="k1">float</span> y,<span class="k1">float</span> r<span class="k2">)</span><span class="k2">{</span>
<span class="number">  79</span>  position.x <span class="k3">=</span> x<span class="k2">;</span>
<span class="number">  80</span>  position.y <span class="k3">=</span> y<span class="k2">;</span>
<span class="number">  81</span>  velocity.Set<span class="k2">(</span><span class="n">0</span>.<span class="n">0f</span>,<span class="n">0</span>.<span class="n">0f</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  82</span>  acceleration.Set<span class="k2">(</span><span class="n">0</span>.<span class="n">0f</span>,<span class="n">0</span>.<span class="n">0f</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  83</span>  radius <span class="k3">=</span> r<span class="k2">;</span>
<span class="number">  84</span>  id <span class="k3">=</span> <span class="k2">(</span>new_UID<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  85</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"ID : %i\n"</span>,id<span class="k2">)</span><span class="k2">;</span>
<span class="number">  86</span>  collision <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  87</span>
<span class="number">  88</span>  draw_full <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  89</span>
<span class="number">  90</span>  mass <span class="k3">=</span> <span class="n">1</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number">  91</span><span class="k2">}</span>
<span class="number">  92</span><span class="k1">void</span> CPenguin_Body::Draw<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span>
<span class="number">  93</span>  <span class="k1">if</span><span class="k2">(</span>collision<span class="k2">)</span><a href="http://www.allegro.cc/manual/al_draw_circle"><span class="a">al_draw_circle</span></a><span class="k2">(</span>position.x,position.y,radius,<a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">255</span>,<span class="n">0</span>,<span class="n">0</span><span class="k2">)</span>,<span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  94</span>  <span class="k1">else</span> <a href="http://www.allegro.cc/manual/al_draw_circle"><span class="a">al_draw_circle</span></a><span class="k2">(</span>position.x,position.y,radius,<a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">255</span>,<span class="n">255</span>,<span class="n">255</span><span class="k2">)</span>,<span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  95</span>  <span class="c">//al_draw_line(position.x,position.y,position.x+100,position.y,al_map_rgb(255,0,0),1);</span>
<span class="number">  96</span>
<span class="number">  97</span>  <span class="k1">if</span><span class="k2">(</span>draw_full<span class="k2">)</span><span class="k2">{</span>
<span class="number">  98</span>    <a href="http://www.allegro.cc/manual/al_draw_filled_circle"><span class="a">al_draw_filled_circle</span></a><span class="k2">(</span>position.x,position.y,radius,<a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">255</span>,<span class="n">0</span>,<span class="n">255</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  99</span>  <span class="k2">}</span>
<span class="number"> 100</span><span class="k2">}</span>
<span class="number"> 101</span><span class="k1">void</span> CPenguin_Body::Update<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 102</span>
<span class="number"> 103</span>  acceleration.Set<span class="k2">(</span><span class="n">0</span>.<span class="n">0</span>,<span class="n">0</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 104</span>
<span class="number"> 105</span>  velocity.Add<span class="k2">(</span>acceleration<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 106</span>  position.Add<span class="k2">(</span>velocity<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 107</span>  acceleration.Clear<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 108</span><span class="k2">}</span>
<span class="number"> 109</span>
<span class="number"> 110</span><span class="k1">bool</span> CPenguin_Body::CheckCollision<span class="k2">(</span>CPenguin_Body <span class="k3">*</span> other_circle<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 111</span>  <span class="k1">float</span> x1 <span class="k3">=</span> position.x<span class="k2">;</span>
<span class="number"> 112</span>  <span class="k1">float</span> y1 <span class="k3">=</span> position.y<span class="k2">;</span>
<span class="number"> 113</span>  <span class="k1">float</span> r1 <span class="k3">=</span> radius<span class="k2">;</span>
<span class="number"> 114</span>  
<span class="number"> 115</span>  <span class="k1">float</span> x2 <span class="k3">=</span> other_circle-&gt;position.x<span class="k2">;</span>
<span class="number"> 116</span>  <span class="k1">float</span> y2 <span class="k3">=</span> other_circle-&gt;position.y<span class="k2">;</span>
<span class="number"> 117</span>  <span class="k1">float</span> r2 <span class="k3">=</span> other_circle-&gt;radius<span class="k2">;</span>
<span class="number"> 118</span>
<span class="number"> 119</span>  <span class="k1">float</span> distance <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_738.html" target="_blank">sqrt</a><span class="k2">(</span><span class="k2">(</span>x1-x2<span class="k2">)</span><span class="k3">*</span><span class="k2">(</span>x1-x2<span class="k2">)</span> <span class="k3">+</span> <span class="k2">(</span>y1-y2<span class="k2">)</span><span class="k3">*</span><span class="k2">(</span>y1-y2<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 120</span>  <span class="k1">float</span> radii <span class="k3">=</span> r1<span class="k3">+</span>r2<span class="k2">;</span>
<span class="number"> 121</span>
<span class="number"> 122</span>
<span class="number"> 123</span>  <span class="k1">if</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_38.html" target="_blank">abs</a><span class="k2">(</span>distance<span class="k2">)</span><span class="k3">&lt;</span>radii<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 124</span>
<span class="number"> 125</span>    collision <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 126</span>
<span class="number"> 127</span>    <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 128</span>  <span class="k2">}</span> <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 129</span>    collision<span class="k3">=</span><span class="k1">false</span><span class="k2">;</span>
<span class="number"> 130</span>    <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 131</span>  <span class="k2">}</span>
<span class="number"> 132</span>
<span class="number"> 133</span><span class="k2">}</span>
<span class="number"> 134</span>
<span class="number"> 135</span><span class="k1">void</span> CPenguin_Body::MouseGrab<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 136</span>  <span class="k1">if</span><span class="k2">(</span>mouse_lmb<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 137</span>    position.x <span class="k3">=</span> <a href="http://www.allegro.cc/manual/mouse_x"><span class="a">mouse_x</span></a><span class="k2">;</span>
<span class="number"> 138</span>    position.y <span class="k3">=</span> <a href="http://www.allegro.cc/manual/mouse_y"><span class="a">mouse_y</span></a><span class="k2">;</span>
<span class="number"> 139</span>  <span class="k2">}</span>
<span class="number"> 140</span><span class="k2">}</span>
<span class="number"> 141</span>
<span class="number"> 142</span><span class="k1">void</span> CPenguin_Body::Bound<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 143</span>  <span class="k1">if</span><span class="k2">(</span>position.y&gt;<span class="k3">=</span><span class="n">860</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 144</span>    position.SetY<span class="k2">(</span><span class="n">860</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 145</span>    <span class="c">//velocity.Mul(-1.0f);</span>
<span class="number"> 146</span>    velocity.SetY<span class="k2">(</span><span class="k2">(</span>velocity.y<span class="k3">*</span><span class="k3">-</span><span class="n">1</span>.<span class="n">0f</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 147</span>    acceleration.SetY<span class="k2">(</span><span class="n">5</span>.<span class="n">0f</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 148</span>    <span class="c">//drag</span>
<span class="number"> 149</span>  <span class="k2">}</span>
<span class="number"> 150</span>  <span class="k1">if</span><span class="k2">(</span>position.y<span class="k3">&lt;</span><span class="n">0</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 151</span>    position.SetY<span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 152</span>    <span class="c">//velocity.Mul(-1.0f);</span>
<span class="number"> 153</span>    velocity.SetY<span class="k2">(</span><span class="k2">(</span>velocity.y<span class="k3">*</span><span class="k3">-</span><span class="n">1</span>.<span class="n">0f</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 154</span>    acceleration.SetY<span class="k2">(</span><span class="k3">-</span><span class="n">5</span>.<span class="n">0f</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 155</span>  <span class="k2">}</span>
<span class="number"> 156</span>  <span class="k1">if</span><span class="k2">(</span>position.x<span class="k3">&lt;</span><span class="n">0</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 157</span>    position.SetX<span class="k2">(</span><span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 158</span>    <span class="c">//velocity.Mul(-1.0f);</span>
<span class="number"> 159</span>    velocity.SetX<span class="k2">(</span><span class="k2">(</span>velocity.x<span class="k3">*</span><span class="k3">-</span><span class="n">1</span>.<span class="n">0f</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 160</span>  <span class="k2">}</span>
<span class="number"> 161</span>  <span class="k1">if</span><span class="k2">(</span>position.x&gt;1180<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 162</span>    position.SetX<span class="k2">(</span><span class="n">1180</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 163</span>    <span class="c">//velocity.Mul(-1.0f);</span>
<span class="number"> 164</span>    velocity.SetX<span class="k2">(</span><span class="k2">(</span>velocity.x<span class="k3">*</span><span class="k3">-</span><span class="n">1</span>.<span class="n">0f</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 165</span>    <span class="c">//acceleration.SetX(5.0f);</span>
<span class="number"> 166</span>  <span class="k2">}</span>
<span class="number"> 167</span><span class="k2">}</span>
<span class="number"> 168</span><span class="k1">int</span> CPenguin_Body::new_UID <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 169</span>
<span class="number"> 170</span><span class="k1">class</span> CPenguin_Collision <span class="k2">{</span>
<span class="number"> 171</span>public:
<span class="number"> 172</span>  CPenguin_Collision<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 173</span>  ~CPenguin_Collision<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span><span class="k2">}</span>
<span class="number"> 174</span>
<span class="number"> 175</span>  <span class="k1">void</span> Check<span class="k2">(</span>std::vector<span class="k3">&lt;</span>CPenguin_Body<span class="k3">*</span><span class="k3">&gt;</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 176</span>  <span class="k1">void</span> Check<span class="k2">(</span>std::vector<span class="k3">&lt;</span>CPenguin_Body<span class="k3">*</span><span class="k3">&gt;</span>,CPenguin_Body<span class="k3">*</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 177</span>  <span class="k1">void</span> Add<span class="k2">(</span>CPenguin_Body<span class="k3">*</span>,CPenguin_Body<span class="k3">*</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 178</span>  <span class="k1">void</span> Clear<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 179</span>  <span class="k1">void</span> Resolve<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 180</span>
<span class="number"> 181</span>  std::vector<span class="k3">&lt;</span>CPenguin_Body<span class="k3">*</span><span class="k3">&gt;</span>body_a<span class="k2">;</span>
<span class="number"> 182</span>  std::vector<span class="k3">&lt;</span>CPenguin_Body<span class="k3">*</span><span class="k3">&gt;</span>body_b<span class="k2">;</span>
<span class="number"> 183</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 184</span>CPenguin_Collision::CPenguin_Collision<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span><span class="k2">}</span>
<span class="number"> 185</span><span class="k1">void</span> CPenguin_Collision::Check<span class="k2">(</span>std::vector<span class="k3">&lt;</span>CPenguin_Body<span class="k3">*</span><span class="k3">&gt;</span>body<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 186</span>  <span class="k1">for</span><span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">int</span> i<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>i<span class="k3">&lt;</span>body.size<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 187</span>    <span class="k1">for</span><span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">int</span> j<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>j<span class="k3">&lt;</span>body.size<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>j<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 188</span>      <span class="k1">if</span><span class="k2">(</span>body<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>id <span class="k3">!</span><span class="k3">=</span> body<span class="k2">[</span>j<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>id<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 189</span>        <span class="k1">if</span><span class="k2">(</span>body<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>CheckCollision<span class="k2">(</span>body<span class="k2">[</span>j<span class="k2">]</span><span class="k2">)</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 190</span>          Add<span class="k2">(</span>body<span class="k2">[</span>i<span class="k2">]</span>,body<span class="k2">[</span>j<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 191</span>        <span class="k2">}</span>
<span class="number"> 192</span>      <span class="k2">}</span>
<span class="number"> 193</span>    <span class="k2">}</span>
<span class="number"> 194</span>  <span class="k2">}</span>
<span class="number"> 195</span><span class="k2">}</span>
<span class="number"> 196</span><span class="k1">void</span> CPenguin_Collision::Check<span class="k2">(</span>std::vector<span class="k3">&lt;</span>CPenguin_Body<span class="k3">*</span><span class="k3">&gt;</span>body,CPenguin_Body<span class="k3">*</span> p<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 197</span>  <span class="k1">for</span><span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">int</span> i<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>i<span class="k3">&lt;</span>body.size<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 198</span>    <span class="k1">if</span><span class="k2">(</span>p-&gt;id <span class="k3">!</span><span class="k3">=</span> body<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>id<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 199</span>      <span class="k1">if</span><span class="k2">(</span>p-&gt;CheckCollision<span class="k2">(</span>body<span class="k2">[</span>i<span class="k2">]</span><span class="k2">)</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 200</span>        Add<span class="k2">(</span>p,body<span class="k2">[</span>i<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 201</span>      <span class="k2">}</span>
<span class="number"> 202</span>    <span class="k2">}</span>
<span class="number"> 203</span>  <span class="k2">}</span>
<span class="number"> 204</span><span class="k2">}</span>
<span class="number"> 205</span><span class="k1">void</span> CPenguin_Collision::Add<span class="k2">(</span>CPenguin_Body <span class="k3">*</span> a,CPenguin_Body <span class="k3">*</span> b<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 206</span>  body_a.push_back<span class="k2">(</span>a<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 207</span>  body_b.push_back<span class="k2">(</span>b<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 208</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Collision Added\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 209</span><span class="k2">}</span>
<span class="number"> 210</span><span class="k1">void</span> CPenguin_Collision::Clear<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 211</span>  body_a.clear<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 212</span>  body_b.clear<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 213</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"VECTOR CLEARED %i\n"</span>,body_a.size<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 214</span><span class="k2">}</span>
<span class="number"> 215</span><span class="k1">void</span> CPenguin_Collision::Resolve<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 216</span>  <span class="c">//Same function in main for collision resolution</span>
<span class="number"> 217</span>  <span class="k1">for</span><span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">int</span> i<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>i<span class="k3">&lt;</span>body_a.size<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 218</span>    <span class="k1">float</span> x1 <span class="k3">=</span> body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>position.x<span class="k2">;</span>
<span class="number"> 219</span>    <span class="k1">float</span> y1 <span class="k3">=</span> body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>position.y<span class="k2">;</span>
<span class="number"> 220</span>    <span class="k1">float</span> r1 <span class="k3">=</span> body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>radius<span class="k2">;</span>
<span class="number"> 221</span>  
<span class="number"> 222</span>    <span class="k1">float</span> x2 <span class="k3">=</span> body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>position.x<span class="k2">;</span>
<span class="number"> 223</span>    <span class="k1">float</span> y2 <span class="k3">=</span> body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>position.y<span class="k2">;</span>
<span class="number"> 224</span>    <span class="k1">float</span> r2 <span class="k3">=</span> body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>radius<span class="k2">;</span>
<span class="number"> 225</span>    <span class="k1">float</span> distance <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_738.html" target="_blank">sqrt</a><span class="k2">(</span><span class="k2">(</span>x1-x2<span class="k2">)</span><span class="k3">*</span><span class="k2">(</span>x1-x2<span class="k2">)</span> <span class="k3">+</span> <span class="k2">(</span>y1-y2<span class="k2">)</span><span class="k3">*</span><span class="k2">(</span>y1-y2<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 226</span>    <span class="k1">float</span> overlap_distance <span class="k3">=</span> <span class="n">0</span>.<span class="n">5</span> <span class="k3">*</span> <span class="k2">(</span>distance <span class="k3">-</span> r1 <span class="k3">-</span> r2<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 227</span>
<span class="number"> 228</span>    body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>position.x <span class="k3">+</span><span class="k3">=</span> overlap_distance <span class="k3">*</span> <span class="k2">(</span>body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>position.x <span class="k3">-</span> body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>position.x<span class="k2">)</span> <span class="k3">/</span> distance<span class="k2">;</span>
<span class="number"> 229</span>    body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>position.y <span class="k3">+</span><span class="k3">=</span> overlap_distance <span class="k3">*</span> <span class="k2">(</span>body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>position.y <span class="k3">-</span> body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>position.y<span class="k2">)</span> <span class="k3">/</span> distance<span class="k2">;</span>
<span class="number"> 230</span>
<span class="number"> 231</span>    body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>position.x <span class="k3">-</span><span class="k3">=</span> overlap_distance <span class="k3">*</span> <span class="k2">(</span>body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>position.x <span class="k3">-</span> body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>position.x<span class="k2">)</span> <span class="k3">/</span> distance<span class="k2">;</span>
<span class="number"> 232</span>    body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>position.y <span class="k3">-</span><span class="k3">=</span> overlap_distance <span class="k3">*</span> <span class="k2">(</span>body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>position.y <span class="k3">-</span> body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>position.y<span class="k2">)</span> <span class="k3">/</span> distance<span class="k2">;</span>
<span class="number"> 233</span>
<span class="number"> 234</span>    <span class="k1">float</span> nx <span class="k3">=</span> <span class="k2">(</span>x2 <span class="k3">-</span> x1<span class="k2">)</span> <span class="k3">/</span> distance<span class="k2">;</span>
<span class="number"> 235</span>    <span class="k1">float</span> ny <span class="k3">=</span> <span class="k2">(</span>y2 <span class="k3">-</span> y1<span class="k2">)</span> <span class="k3">/</span> distance<span class="k2">;</span>
<span class="number"> 236</span>
<span class="number"> 237</span>    <span class="k1">float</span> tx <span class="k3">=</span> <span class="k3">-</span>ny<span class="k2">;</span>
<span class="number"> 238</span>    <span class="k1">float</span> ty <span class="k3">=</span> nx<span class="k2">;</span>
<span class="number"> 239</span>
<span class="number"> 240</span>    <span class="k1">float</span> dpTan1 <span class="k3">=</span> body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>velocity.x <span class="k3">*</span> tx <span class="k3">+</span> body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>velocity.y <span class="k3">*</span> ty<span class="k2">;</span>
<span class="number"> 241</span>    <span class="k1">float</span> dpTan2 <span class="k3">=</span> body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>velocity.x <span class="k3">*</span> tx <span class="k3">+</span> body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>velocity.y <span class="k3">*</span> ty<span class="k2">;</span>
<span class="number"> 242</span>
<span class="number"> 243</span>    <span class="k1">float</span> dpNorm1 <span class="k3">=</span> body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>velocity.x <span class="k3">*</span> nx <span class="k3">+</span> body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>velocity.y <span class="k3">*</span> ny<span class="k2">;</span>
<span class="number"> 244</span>    <span class="k1">float</span> dpNorm2 <span class="k3">=</span> body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>velocity.x <span class="k3">*</span> nx <span class="k3">+</span> body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>velocity.y <span class="k3">*</span> ny<span class="k2">;</span>
<span class="number"> 245</span>
<span class="number"> 246</span>    <span class="k1">float</span> m1 <span class="k3">=</span> <span class="k2">(</span>dpNorm1 <span class="k3">*</span> <span class="k2">(</span>body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>mass <span class="k3">-</span> body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>mass<span class="k2">)</span> <span class="k3">+</span> <span class="n">2</span>.<span class="n">0f</span> <span class="k3">*</span> body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>mass <span class="k3">*</span> dpNorm2<span class="k2">)</span> <span class="k3">/</span> <span class="k2">(</span>body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>mass <span class="k3">+</span> body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>mass<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 247</span>    <span class="k1">float</span> m2 <span class="k3">=</span> <span class="k2">(</span>dpNorm2 <span class="k3">*</span> <span class="k2">(</span>body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>mass <span class="k3">-</span> body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>mass<span class="k2">)</span> <span class="k3">+</span> <span class="n">2</span>.<span class="n">0f</span> <span class="k3">*</span> body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>mass <span class="k3">*</span> dpNorm1<span class="k2">)</span> <span class="k3">/</span> <span class="k2">(</span>body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>mass <span class="k3">+</span> body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>mass<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 248</span>
<span class="number"> 249</span>    body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>velocity.x <span class="k3">=</span> tx <span class="k3">*</span> dpTan1 <span class="k3">+</span> nx <span class="k3">*</span> m1<span class="k2">;</span>
<span class="number"> 250</span>    body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>velocity.y <span class="k3">=</span> ty <span class="k3">*</span> dpTan1 <span class="k3">+</span> ny <span class="k3">*</span> m1<span class="k2">;</span>
<span class="number"> 251</span>
<span class="number"> 252</span>    body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>velocity.x <span class="k3">=</span> tx <span class="k3">*</span> dpTan2 <span class="k3">+</span> nx <span class="k3">*</span> m2<span class="k2">;</span>
<span class="number"> 253</span>    body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>velocity.y <span class="k3">=</span> ty <span class="k3">*</span> dpTan2 <span class="k3">+</span> ny <span class="k3">*</span> m2<span class="k2">;</span>
<span class="number"> 254</span>
<span class="number"> 255</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Collision Resolved\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 256</span>  <span class="k2">}</span>
<span class="number"> 257</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>body_a.empty<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span>Clear<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 258</span><span class="k2">}</span>
<span class="number"> 259</span>
<span class="number"> 260</span><span class="k1">class</span> CPenguin2D <span class="k2">{</span>
<span class="number"> 261</span>public:
<span class="number"> 262</span>  CPenguin2D<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 263</span>  ~CPenguin2D<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 264</span>
<span class="number"> 265</span>  <span class="k1">void</span> Draw<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 266</span>  <span class="k1">void</span> Update<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 267</span>
<span class="number"> 268</span>  CPenguin_Collision <span class="k3">*</span> penguin_collision<span class="k2">;</span>
<span class="number"> 269</span>  CPenguin_Body <span class="k3">*</span> c1,<span class="k3">*</span>c2<span class="k2">;</span>
<span class="number"> 270</span>
<span class="number"> 271</span>  std::vector<span class="k3">&lt;</span>CPenguin_Body<span class="k3">*</span><span class="k3">&gt;</span>my_body<span class="k2">;</span>
<span class="number"> 272</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 273</span>CPenguin2D::CPenguin2D<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 274</span>  <span class="c">//stand alone body objects are working</span>
<span class="number"> 275</span>  c1 <span class="k3">=</span> <span class="k1">new</span> CPenguin_Body<span class="k2">(</span><span class="n">240</span>,<span class="n">600</span>,<span class="n">10</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 276</span>  c2 <span class="k3">=</span> <span class="k1">new</span> CPenguin_Body<span class="k2">(</span><span class="n">240</span>,<span class="n">200</span>,<span class="n">100</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 277</span>  c1-&gt;velocity.Set<span class="k2">(</span><span class="n">0</span>.<span class="n">1</span>,<span class="k3">-</span><span class="n">20</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 278</span>  c2-&gt;mass <span class="k3">=</span> <span class="n">10</span>.<span class="n">0</span><span class="k2">;</span>
<span class="number"> 279</span>
<span class="number"> 280</span>  <span class="c">//body objects in this vector are not</span>
<span class="number"> 281</span>  CPenguin_Body <span class="k3">*</span> b1 <span class="k3">=</span> <span class="k1">new</span> CPenguin_Body<span class="k2">(</span><span class="n">700</span>,<span class="n">100</span>,<span class="n">100</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 282</span>  my_body.push_back<span class="k2">(</span>b1<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 283</span>  b1-&gt;velocity.x<span class="k3">=</span><span class="n">1</span>.<span class="n">0</span><span class="k2">;</span>
<span class="number"> 284</span>  b1-&gt;draw_full<span class="k3">=</span><span class="k1">true</span><span class="k2">;</span>
<span class="number"> 285</span>  CPenguin_Body <span class="k3">*</span> b2 <span class="k3">=</span> <span class="k1">new</span> CPenguin_Body<span class="k2">(</span><span class="n">300</span>,<span class="n">100</span>,<span class="n">50</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 286</span>  b2-&gt;velocity.x<span class="k3">=</span><span class="n">10</span>.<span class="n">0</span><span class="k2">;</span>
<span class="number"> 287</span>  b2-&gt;velocity.y<span class="k3">=</span><span class="n">10</span><span class="k2">;</span>
<span class="number"> 288</span>  b2-&gt;draw_full<span class="k3">=</span><span class="k1">true</span><span class="k2">;</span>
<span class="number"> 289</span>  my_body.push_back<span class="k2">(</span>b2<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 290</span>
<span class="number"> 291</span>  penguin_collision <span class="k3">=</span> <span class="k1">new</span> CPenguin_Collision<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 292</span><span class="k2">}</span>
<span class="number"> 293</span>CPenguin2D::~CPenguin2D<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span><span class="k2">}</span>
<span class="number"> 294</span>
<span class="number"> 295</span><span class="k1">void</span> CPenguin2D::Draw<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 296</span>  c1-&gt;Draw<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 297</span>  c2-&gt;Draw<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 298</span>
<span class="number"> 299</span>  <span class="k1">for</span><span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">int</span> i<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>i<span class="k3">&lt;</span>my_body.size<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 300</span>    my_body<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>Draw<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 301</span>  <span class="k2">}</span>
<span class="number"> 302</span><span class="k2">}</span>
<span class="number"> 303</span><span class="k1">void</span> CPenguin2D::Update<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 304</span>  c1-&gt;Update<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 305</span>  c2-&gt;Update<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 306</span>  c1-&gt;Bound<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 307</span>  c2-&gt;Bound<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 308</span>
<span class="number"> 309</span>  my_body<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>MouseGrab<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 310</span>
<span class="number"> 311</span>  <span class="k1">for</span><span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">int</span> i<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>i<span class="k3">&lt;</span>my_body.size<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 312</span>    my_body<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>Update<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 313</span>    my_body<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>Bound<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 314</span>    penguin_collision-&gt;Check<span class="k2">(</span>my_body,my_body<span class="k2">[</span>i<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 315</span>  <span class="k2">}</span>
<span class="number"> 316</span>
<span class="number"> 317</span>  <span class="c">//this function should do the same as if(c1-&gt;CheckCollision(c2)){ below, but doesn't</span>
<span class="number"> 318</span>  penguin_collision-&gt;Resolve<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 319</span>
<span class="number"> 320</span>  <span class="c">//this function works (almost) as intended</span>
<span class="number"> 321</span>  <span class="k1">if</span><span class="k2">(</span>c1-&gt;CheckCollision<span class="k2">(</span>c2<span class="k2">)</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 322</span>    <span class="k1">float</span> x1 <span class="k3">=</span> c1-&gt;position.x<span class="k2">;</span>
<span class="number"> 323</span>    <span class="k1">float</span> y1 <span class="k3">=</span> c1-&gt;position.y<span class="k2">;</span>
<span class="number"> 324</span>    <span class="k1">float</span> r1 <span class="k3">=</span> c1-&gt;radius<span class="k2">;</span>
<span class="number"> 325</span>  
<span class="number"> 326</span>    <span class="k1">float</span> x2 <span class="k3">=</span> c2-&gt;position.x<span class="k2">;</span>
<span class="number"> 327</span>    <span class="k1">float</span> y2 <span class="k3">=</span> c2-&gt;position.y<span class="k2">;</span>
<span class="number"> 328</span>    <span class="k1">float</span> r2 <span class="k3">=</span> c2-&gt;radius<span class="k2">;</span>
<span class="number"> 329</span>    <span class="k1">float</span> distance <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_738.html" target="_blank">sqrt</a><span class="k2">(</span><span class="k2">(</span>x1-x2<span class="k2">)</span><span class="k3">*</span><span class="k2">(</span>x1-x2<span class="k2">)</span> <span class="k3">+</span> <span class="k2">(</span>y1-y2<span class="k2">)</span><span class="k3">*</span><span class="k2">(</span>y1-y2<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 330</span>    <span class="k1">float</span> overlap_distance <span class="k3">=</span> <span class="n">0</span>.<span class="n">5</span> <span class="k3">*</span> <span class="k2">(</span>distance <span class="k3">-</span> r1 <span class="k3">-</span> r2<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 331</span>
<span class="number"> 332</span>    c1-&gt;position.x <span class="k3">+</span><span class="k3">=</span> overlap_distance <span class="k3">*</span> <span class="k2">(</span>c1-&gt;position.x <span class="k3">-</span> c2-&gt;position.x<span class="k2">)</span> <span class="k3">/</span> distance<span class="k2">;</span>
<span class="number"> 333</span>    c1-&gt;position.y <span class="k3">+</span><span class="k3">=</span> overlap_distance <span class="k3">*</span> <span class="k2">(</span>c1-&gt;position.y <span class="k3">-</span> c2-&gt;position.y<span class="k2">)</span> <span class="k3">/</span> distance<span class="k2">;</span>
<span class="number"> 334</span>
<span class="number"> 335</span>    c2-&gt;position.x <span class="k3">-</span><span class="k3">=</span> overlap_distance <span class="k3">*</span> <span class="k2">(</span>c2-&gt;position.x <span class="k3">-</span> c1-&gt;position.x<span class="k2">)</span> <span class="k3">/</span> distance<span class="k2">;</span>
<span class="number"> 336</span>    c2-&gt;position.y <span class="k3">-</span><span class="k3">=</span> overlap_distance <span class="k3">*</span> <span class="k2">(</span>c2-&gt;position.y <span class="k3">-</span> c1-&gt;position.y<span class="k2">)</span> <span class="k3">/</span> distance<span class="k2">;</span>
<span class="number"> 337</span>
<span class="number"> 338</span>    <span class="k1">float</span> nx <span class="k3">=</span> <span class="k2">(</span>x2 <span class="k3">-</span> x1<span class="k2">)</span> <span class="k3">/</span> distance<span class="k2">;</span>
<span class="number"> 339</span>    <span class="k1">float</span> ny <span class="k3">=</span> <span class="k2">(</span>y2 <span class="k3">-</span> y1<span class="k2">)</span> <span class="k3">/</span> distance<span class="k2">;</span>
<span class="number"> 340</span>
<span class="number"> 341</span>    <span class="k1">float</span> tx <span class="k3">=</span> <span class="k3">-</span>ny<span class="k2">;</span>
<span class="number"> 342</span>    <span class="k1">float</span> ty <span class="k3">=</span> nx<span class="k2">;</span>
<span class="number"> 343</span>
<span class="number"> 344</span>    <span class="k1">float</span> dpTan1 <span class="k3">=</span> c1-&gt;velocity.x <span class="k3">*</span> tx <span class="k3">+</span> c1-&gt;velocity.y <span class="k3">*</span> ty<span class="k2">;</span>
<span class="number"> 345</span>    <span class="k1">float</span> dpTan2 <span class="k3">=</span> c2-&gt;velocity.x <span class="k3">*</span> tx <span class="k3">+</span> c2-&gt;velocity.y <span class="k3">*</span> ty<span class="k2">;</span>
<span class="number"> 346</span>
<span class="number"> 347</span>    <span class="k1">float</span> dpNorm1 <span class="k3">=</span> c1-&gt;velocity.x <span class="k3">*</span> nx <span class="k3">+</span> c1-&gt;velocity.y <span class="k3">*</span> ny<span class="k2">;</span>
<span class="number"> 348</span>    <span class="k1">float</span> dpNorm2 <span class="k3">=</span> c2-&gt;velocity.x <span class="k3">*</span> nx <span class="k3">+</span> c2-&gt;velocity.y <span class="k3">*</span> ny<span class="k2">;</span>
<span class="number"> 349</span>
<span class="number"> 350</span>    <span class="k1">float</span> m1 <span class="k3">=</span> <span class="k2">(</span>dpNorm1 <span class="k3">*</span> <span class="k2">(</span>c1-&gt;mass <span class="k3">-</span> c2-&gt;mass<span class="k2">)</span> <span class="k3">+</span> <span class="n">2</span>.<span class="n">0f</span> <span class="k3">*</span> c2-&gt;mass <span class="k3">*</span> dpNorm2<span class="k2">)</span> <span class="k3">/</span> <span class="k2">(</span>c1-&gt;mass <span class="k3">+</span> c2-&gt;mass<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 351</span>    <span class="k1">float</span> m2 <span class="k3">=</span> <span class="k2">(</span>dpNorm2 <span class="k3">*</span> <span class="k2">(</span>c2-&gt;mass <span class="k3">-</span> c1-&gt;mass<span class="k2">)</span> <span class="k3">+</span> <span class="n">2</span>.<span class="n">0f</span> <span class="k3">*</span> c1-&gt;mass <span class="k3">*</span> dpNorm1<span class="k2">)</span> <span class="k3">/</span> <span class="k2">(</span>c1-&gt;mass <span class="k3">+</span> c2-&gt;mass<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 352</span>
<span class="number"> 353</span>    c1-&gt;velocity.x <span class="k3">=</span> tx <span class="k3">*</span> dpTan1 <span class="k3">+</span> nx <span class="k3">*</span> m1<span class="k2">;</span>
<span class="number"> 354</span>    c1-&gt;velocity.y <span class="k3">=</span> ty <span class="k3">*</span> dpTan1 <span class="k3">+</span> ny <span class="k3">*</span> m1<span class="k2">;</span>
<span class="number"> 355</span>
<span class="number"> 356</span>    c2-&gt;velocity.x <span class="k3">=</span> tx <span class="k3">*</span> dpTan2 <span class="k3">+</span> nx <span class="k3">*</span> m2<span class="k2">;</span>
<span class="number"> 357</span>    c2-&gt;velocity.y <span class="k3">=</span> ty <span class="k3">*</span> dpTan2 <span class="k3">+</span> ny <span class="k3">*</span> m2<span class="k2">;</span>
<span class="number"> 358</span>
<span class="number"> 359</span>  <span class="k2">}</span>
<span class="number"> 360</span><span class="k2">}</span>
<span class="number"> 361</span>
<span class="number"> 362</span>CPenguin2D <span class="k3">*</span> PENGUIN_2D<span class="k2">;</span>
</div></div><p>  </p><p>If anyone has any ideas I would be eternally grateful, this has been driving me nuts for a while. I&#39;m pretty sure it&#39;s the collision class that&#39;s cocking things up, or maybe where I&#39;m checking for the collisions. I&#39;ve written two collision Check() functions and both do seem to do the same thing. Basically I need a way of storing the body objects in a vector, iterating though, updating and checking for collisions, then adding these collisions to another vector and resolving them. Or put more simply, I need the filled balls to act like the unfilled balls, but more object orientated. Thanks
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (dakatt)</author>
		<pubDate>Sun, 04 Nov 2018 13:49:37 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Looks like you&#39;ve got the right idea; circular collision boils down to:</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="c">// say you're storing positions and their radii:</span>
<span class="number">  2</span><span class="k1">typedef</span> <span class="k1">struct</span> CIRCLE
<span class="number">  3</span><span class="k2">{</span>
<span class="number">  4</span>  <span class="k1">float</span> x, y, r<span class="k2">;</span>
<span class="number">  5</span><span class="k2">}</span> CIRCLE<span class="k2">;</span>
<span class="number">  6</span>
<span class="number">  7</span><span class="k1">bool</span> circular_collision<span class="k2">(</span>CIRCLE<span class="k3">*</span> a, CIRCLE<span class="k3">*</span> b<span class="k2">)</span>
<span class="number">  8</span><span class="k2">{</span>
<span class="number">  9</span>  <span class="c">// calculate distance between the two points</span>
<span class="number"> 10</span>  <span class="k1">float</span> distance <span class="k3">=</span> sqrtf<span class="k2">(</span>powf<span class="k2">(</span>b-&gt;x <span class="k3">-</span> a-&gt;x, <span class="n">2</span><span class="k2">)</span> <span class="k3">+</span> powf<span class="k2">(</span>b-&gt;y <span class="k3">-</span> a-&gt;y, <span class="n">2</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span>  <span class="k1">if</span><span class="k2">(</span>distance <span class="k3">&lt;</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">)</span>
<span class="number"> 12</span>    distance <span class="k3">*</span><span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number"> 13</span>  
<span class="number"> 14</span>  <span class="c">// if the distance is less than the sum of the radii, they're colliding</span>
<span class="number"> 15</span>  <span class="k1">return</span> distance <span class="k3">&lt;</span> <span class="k2">(</span>a-&gt;r <span class="k3">+</span> b-&gt;r<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span><span class="k2">}</span>
</div></div><p>

You&#39;ve posted quite a lot of code; have you tried isolating the problem using some tests?</p><p>The only potential issue I can see at a glance is your usage of <span class="source-code"><a href="http://www.delorie.com/djgpp/doc/libc/libc_38.html" target="_blank">abs</a><span class="k2">(</span><span class="k2">)</span></span> - if this is <span class="source-code">cmath</span>&#39;s function, you&#39;ll lose precision here - though this probably won&#39;t matter if you&#39;re not concerned about subpixel accuracy.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (dthompson)</author>
		<pubDate>Sun, 04 Nov 2018 16:39:14 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><s>Edit</s> I made a short video of the problem. The white circles are c1 and c2 and work for the most part. The pink circles are contained in a vector and use the penguin_collision class. They only interact with their respective colours.</p><p><a href="https://www.youtube.com/watch?v=z0KNHp4H7VM&amp;feature=youtu.be">https://www.youtube.com/watch?v=z0KNHp4H7VM&amp;feature=youtu.be</a> </p><p>Yeah I apologize for the amount of code, I thought I&#39;d post all of it because I think the problem may be in how it&#39;s structured. The collision itself seems to be ok, it&#39;s getting the balls to bounce properly. The objects outside of the vector container do this, but in order to check every collision I would need to individually and manually check each object against every other object. I&#39;ve tried to do this using a collision class which takes a vector of objects that records and &quot;resolves&quot; the collisions but the objects have unpredictable behaviour, most notably they seem to attract each other upon collision (and then all kinds of craziness happens). Since I&#39;m using the same function for resolving the collision I can only assume the problem is with this collision class.</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">class</span> CPenguin_Collision <span class="k2">{</span>
<span class="number">  2</span>public:
<span class="number">  3</span>  CPenguin_Collision<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  4</span>  ~CPenguin_Collision<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span><span class="k2">}</span>
<span class="number">  5</span>
<span class="number">  6</span>  <span class="k1">void</span> Check<span class="k2">(</span>std::vector<span class="k3">&lt;</span>CPenguin_Body<span class="k3">*</span><span class="k3">&gt;</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  7</span>  <span class="k1">void</span> Check<span class="k2">(</span>std::vector<span class="k3">&lt;</span>CPenguin_Body<span class="k3">*</span><span class="k3">&gt;</span>,CPenguin_Body<span class="k3">*</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  8</span>  <span class="k1">void</span> Add<span class="k2">(</span>CPenguin_Body<span class="k3">*</span>,CPenguin_Body<span class="k3">*</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  9</span>  <span class="k1">void</span> Clear<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 10</span>  <span class="k1">void</span> Resolve<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span>
<span class="number"> 12</span>  std::vector<span class="k3">&lt;</span>CPenguin_Body<span class="k3">*</span><span class="k3">&gt;</span>body_a<span class="k2">;</span>
<span class="number"> 13</span>  std::vector<span class="k3">&lt;</span>CPenguin_Body<span class="k3">*</span><span class="k3">&gt;</span>body_b<span class="k2">;</span>
<span class="number"> 14</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 15</span>CPenguin_Collision::CPenguin_Collision<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span><span class="k2">}</span>
<span class="number"> 16</span><span class="k1">void</span> CPenguin_Collision::Check<span class="k2">(</span>std::vector<span class="k3">&lt;</span>CPenguin_Body<span class="k3">*</span><span class="k3">&gt;</span>body<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 17</span>  <span class="k1">for</span><span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">int</span> i<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>i<span class="k3">&lt;</span>body.size<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 18</span>    <span class="k1">for</span><span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">int</span> j<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>j<span class="k3">&lt;</span>body.size<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>j<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 19</span>      <span class="k1">if</span><span class="k2">(</span>body<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>id <span class="k3">!</span><span class="k3">=</span> body<span class="k2">[</span>j<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>id<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 20</span>        <span class="k1">if</span><span class="k2">(</span>body<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>CheckCollision<span class="k2">(</span>body<span class="k2">[</span>j<span class="k2">]</span><span class="k2">)</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 21</span>          Add<span class="k2">(</span>body<span class="k2">[</span>i<span class="k2">]</span>,body<span class="k2">[</span>j<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 22</span>        <span class="k2">}</span>
<span class="number"> 23</span>      <span class="k2">}</span>
<span class="number"> 24</span>    <span class="k2">}</span>
<span class="number"> 25</span>  <span class="k2">}</span>
<span class="number"> 26</span><span class="k2">}</span>
<span class="number"> 27</span><span class="k1">void</span> CPenguin_Collision::Check<span class="k2">(</span>std::vector<span class="k3">&lt;</span>CPenguin_Body<span class="k3">*</span><span class="k3">&gt;</span>body,CPenguin_Body<span class="k3">*</span> p<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 28</span>  <span class="k1">for</span><span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">int</span> i<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>i<span class="k3">&lt;</span>body.size<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 29</span>    <span class="k1">if</span><span class="k2">(</span>p-&gt;id <span class="k3">!</span><span class="k3">=</span> body<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>id<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 30</span>      <span class="k1">if</span><span class="k2">(</span>p-&gt;CheckCollision<span class="k2">(</span>body<span class="k2">[</span>i<span class="k2">]</span><span class="k2">)</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 31</span>        Add<span class="k2">(</span>p,body<span class="k2">[</span>i<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 32</span>      <span class="k2">}</span>
<span class="number"> 33</span>    <span class="k2">}</span>
<span class="number"> 34</span>  <span class="k2">}</span>
<span class="number"> 35</span><span class="k2">}</span>
<span class="number"> 36</span><span class="k1">void</span> CPenguin_Collision::Add<span class="k2">(</span>CPenguin_Body <span class="k3">*</span> a,CPenguin_Body <span class="k3">*</span> b<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 37</span>  body_a.push_back<span class="k2">(</span>a<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 38</span>  body_b.push_back<span class="k2">(</span>b<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 39</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Collision Added\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 40</span><span class="k2">}</span>
<span class="number"> 41</span><span class="k1">void</span> CPenguin_Collision::Clear<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 42</span>  body_a.clear<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 43</span>  body_b.clear<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 44</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"VECTOR CLEARED %i\n"</span>,body_a.size<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 45</span><span class="k2">}</span>
<span class="number"> 46</span><span class="k1">void</span> CPenguin_Collision::Resolve<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 47</span>  <span class="c">//Same function in main for collision resolution</span>
<span class="number"> 48</span>  <span class="k1">for</span><span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">int</span> i<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>i<span class="k3">&lt;</span>body_a.size<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 49</span>    <span class="k1">float</span> x1 <span class="k3">=</span> body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>position.x<span class="k2">;</span>
<span class="number"> 50</span>    <span class="k1">float</span> y1 <span class="k3">=</span> body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>position.y<span class="k2">;</span>
<span class="number"> 51</span>    <span class="k1">float</span> r1 <span class="k3">=</span> body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>radius<span class="k2">;</span>
<span class="number"> 52</span>  
<span class="number"> 53</span>    <span class="k1">float</span> x2 <span class="k3">=</span> body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>position.x<span class="k2">;</span>
<span class="number"> 54</span>    <span class="k1">float</span> y2 <span class="k3">=</span> body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>position.y<span class="k2">;</span>
<span class="number"> 55</span>    <span class="k1">float</span> r2 <span class="k3">=</span> body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>radius<span class="k2">;</span>
<span class="number"> 56</span>    <span class="k1">float</span> distance <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_738.html" target="_blank">sqrt</a><span class="k2">(</span><span class="k2">(</span>x1-x2<span class="k2">)</span><span class="k3">*</span><span class="k2">(</span>x1-x2<span class="k2">)</span> <span class="k3">+</span> <span class="k2">(</span>y1-y2<span class="k2">)</span><span class="k3">*</span><span class="k2">(</span>y1-y2<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 57</span>    <span class="k1">float</span> overlap_distance <span class="k3">=</span> <span class="n">0</span>.<span class="n">5</span> <span class="k3">*</span> <span class="k2">(</span>distance <span class="k3">-</span> r1 <span class="k3">-</span> r2<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 58</span>
<span class="number"> 59</span>    body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>position.x <span class="k3">+</span><span class="k3">=</span> overlap_distance <span class="k3">*</span> <span class="k2">(</span>body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>position.x <span class="k3">-</span> body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>position.x<span class="k2">)</span> <span class="k3">/</span> distance<span class="k2">;</span>
<span class="number"> 60</span>    body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>position.y <span class="k3">+</span><span class="k3">=</span> overlap_distance <span class="k3">*</span> <span class="k2">(</span>body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>position.y <span class="k3">-</span> body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>position.y<span class="k2">)</span> <span class="k3">/</span> distance<span class="k2">;</span>
<span class="number"> 61</span>
<span class="number"> 62</span>    body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>position.x <span class="k3">-</span><span class="k3">=</span> overlap_distance <span class="k3">*</span> <span class="k2">(</span>body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>position.x <span class="k3">-</span> body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>position.x<span class="k2">)</span> <span class="k3">/</span> distance<span class="k2">;</span>
<span class="number"> 63</span>    body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>position.y <span class="k3">-</span><span class="k3">=</span> overlap_distance <span class="k3">*</span> <span class="k2">(</span>body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>position.y <span class="k3">-</span> body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>position.y<span class="k2">)</span> <span class="k3">/</span> distance<span class="k2">;</span>
<span class="number"> 64</span>
<span class="number"> 65</span>    <span class="k1">float</span> nx <span class="k3">=</span> <span class="k2">(</span>x2 <span class="k3">-</span> x1<span class="k2">)</span> <span class="k3">/</span> distance<span class="k2">;</span>
<span class="number"> 66</span>    <span class="k1">float</span> ny <span class="k3">=</span> <span class="k2">(</span>y2 <span class="k3">-</span> y1<span class="k2">)</span> <span class="k3">/</span> distance<span class="k2">;</span>
<span class="number"> 67</span>
<span class="number"> 68</span>    <span class="k1">float</span> tx <span class="k3">=</span> <span class="k3">-</span>ny<span class="k2">;</span>
<span class="number"> 69</span>    <span class="k1">float</span> ty <span class="k3">=</span> nx<span class="k2">;</span>
<span class="number"> 70</span>
<span class="number"> 71</span>    <span class="k1">float</span> dpTan1 <span class="k3">=</span> body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>velocity.x <span class="k3">*</span> tx <span class="k3">+</span> body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>velocity.y <span class="k3">*</span> ty<span class="k2">;</span>
<span class="number"> 72</span>    <span class="k1">float</span> dpTan2 <span class="k3">=</span> body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>velocity.x <span class="k3">*</span> tx <span class="k3">+</span> body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>velocity.y <span class="k3">*</span> ty<span class="k2">;</span>
<span class="number"> 73</span>
<span class="number"> 74</span>    <span class="k1">float</span> dpNorm1 <span class="k3">=</span> body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>velocity.x <span class="k3">*</span> nx <span class="k3">+</span> body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>velocity.y <span class="k3">*</span> ny<span class="k2">;</span>
<span class="number"> 75</span>    <span class="k1">float</span> dpNorm2 <span class="k3">=</span> body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>velocity.x <span class="k3">*</span> nx <span class="k3">+</span> body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>velocity.y <span class="k3">*</span> ny<span class="k2">;</span>
<span class="number"> 76</span>
<span class="number"> 77</span>    <span class="k1">float</span> m1 <span class="k3">=</span> <span class="k2">(</span>dpNorm1 <span class="k3">*</span> <span class="k2">(</span>body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>mass <span class="k3">-</span> body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>mass<span class="k2">)</span> <span class="k3">+</span> <span class="n">2</span>.<span class="n">0f</span> <span class="k3">*</span> body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>mass <span class="k3">*</span> dpNorm2<span class="k2">)</span> <span class="k3">/</span> <span class="k2">(</span>body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>mass <span class="k3">+</span> body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>mass<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 78</span>    <span class="k1">float</span> m2 <span class="k3">=</span> <span class="k2">(</span>dpNorm2 <span class="k3">*</span> <span class="k2">(</span>body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>mass <span class="k3">-</span> body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>mass<span class="k2">)</span> <span class="k3">+</span> <span class="n">2</span>.<span class="n">0f</span> <span class="k3">*</span> body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>mass <span class="k3">*</span> dpNorm1<span class="k2">)</span> <span class="k3">/</span> <span class="k2">(</span>body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>mass <span class="k3">+</span> body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>mass<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 79</span>
<span class="number"> 80</span>    body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>velocity.x <span class="k3">=</span> tx <span class="k3">*</span> dpTan1 <span class="k3">+</span> nx <span class="k3">*</span> m1<span class="k2">;</span>
<span class="number"> 81</span>    body_a<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>velocity.y <span class="k3">=</span> ty <span class="k3">*</span> dpTan1 <span class="k3">+</span> ny <span class="k3">*</span> m1<span class="k2">;</span>
<span class="number"> 82</span>
<span class="number"> 83</span>    body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>velocity.x <span class="k3">=</span> tx <span class="k3">*</span> dpTan2 <span class="k3">+</span> nx <span class="k3">*</span> m2<span class="k2">;</span>
<span class="number"> 84</span>    body_b<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>velocity.y <span class="k3">=</span> ty <span class="k3">*</span> dpTan2 <span class="k3">+</span> ny <span class="k3">*</span> m2<span class="k2">;</span>
<span class="number"> 85</span>
<span class="number"> 86</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Collision Resolved\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 87</span>  <span class="k2">}</span>
<span class="number"> 88</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>body_a.empty<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span>Clear<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 89</span><span class="k2">}</span>
</div></div><p>   </p><p>So this class takes a vector of body objects, Check()&#39;s to see if any objects are colliding, if they are it Add()&#39;s the two objects in to the vector body_a[] and body_b[], and (in theory) Resolve()&#39;s the collisions by running through the vectors in pairs before finally Clear()&#39;ing body_a[] and body_b[] ready for the next loop. Essentially I&#39;m trying to do this - </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>main_loop<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span>
<span class="number">  2</span>  c1-&gt;Update<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="c">//just position updates</span>
<span class="number">  3</span>  c2-&gt;Update<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> 
<span class="number">  4</span>  c1-&gt;Bound<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="c">//keeps objects on screen</span>
<span class="number">  5</span>  c2-&gt;Bound<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  6</span>
<span class="number">  7</span>  <span class="k1">if</span><span class="k2">(</span>c1-&gt;CheckCollision<span class="k2">(</span>c2<span class="k2">)</span><span class="k2">)</span><span class="k2">{</span> <span class="c">//checks collision between 2 objects</span>
<span class="number">  8</span>    <span class="k1">float</span> x1 <span class="k3">=</span> c1-&gt;position.x<span class="k2">;</span>
<span class="number">  9</span>    <span class="k1">float</span> y1 <span class="k3">=</span> c1-&gt;position.y<span class="k2">;</span>
<span class="number"> 10</span>    <span class="k1">float</span> r1 <span class="k3">=</span> c1-&gt;radius<span class="k2">;</span>
<span class="number"> 11</span>  
<span class="number"> 12</span>    <span class="k1">float</span> x2 <span class="k3">=</span> c2-&gt;position.x<span class="k2">;</span>
<span class="number"> 13</span>    <span class="k1">float</span> y2 <span class="k3">=</span> c2-&gt;position.y<span class="k2">;</span>
<span class="number"> 14</span>    <span class="k1">float</span> r2 <span class="k3">=</span> c2-&gt;radius<span class="k2">;</span>
<span class="number"> 15</span>    <span class="k1">float</span> distance <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_738.html" target="_blank">sqrt</a><span class="k2">(</span><span class="k2">(</span>x1-x2<span class="k2">)</span><span class="k3">*</span><span class="k2">(</span>x1-x2<span class="k2">)</span> <span class="k3">+</span> <span class="k2">(</span>y1-y2<span class="k2">)</span><span class="k3">*</span><span class="k2">(</span>y1-y2<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span>    <span class="k1">float</span> overlap_distance <span class="k3">=</span> <span class="n">0</span>.<span class="n">5</span> <span class="k3">*</span> <span class="k2">(</span>distance <span class="k3">-</span> r1 <span class="k3">-</span> r2<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 17</span>
<span class="number"> 18</span>    c1-&gt;position.x <span class="k3">+</span><span class="k3">=</span> overlap_distance <span class="k3">*</span> <span class="k2">(</span>c1-&gt;position.x <span class="k3">-</span> c2-&gt;position.x<span class="k2">)</span> <span class="k3">/</span> distance<span class="k2">;</span>
<span class="number"> 19</span>    c1-&gt;position.y <span class="k3">+</span><span class="k3">=</span> overlap_distance <span class="k3">*</span> <span class="k2">(</span>c1-&gt;position.y <span class="k3">-</span> c2-&gt;position.y<span class="k2">)</span> <span class="k3">/</span> distance<span class="k2">;</span>
<span class="number"> 20</span>
<span class="number"> 21</span>    c2-&gt;position.x <span class="k3">-</span><span class="k3">=</span> overlap_distance <span class="k3">*</span> <span class="k2">(</span>c2-&gt;position.x <span class="k3">-</span> c1-&gt;position.x<span class="k2">)</span> <span class="k3">/</span> distance<span class="k2">;</span>
<span class="number"> 22</span>    c2-&gt;position.y <span class="k3">-</span><span class="k3">=</span> overlap_distance <span class="k3">*</span> <span class="k2">(</span>c2-&gt;position.y <span class="k3">-</span> c1-&gt;position.y<span class="k2">)</span> <span class="k3">/</span> distance<span class="k2">;</span>
<span class="number"> 23</span>
<span class="number"> 24</span>    <span class="k1">float</span> nx <span class="k3">=</span> <span class="k2">(</span>x2 <span class="k3">-</span> x1<span class="k2">)</span> <span class="k3">/</span> distance<span class="k2">;</span>
<span class="number"> 25</span>    <span class="k1">float</span> ny <span class="k3">=</span> <span class="k2">(</span>y2 <span class="k3">-</span> y1<span class="k2">)</span> <span class="k3">/</span> distance<span class="k2">;</span>
<span class="number"> 26</span>
<span class="number"> 27</span>    <span class="k1">float</span> tx <span class="k3">=</span> <span class="k3">-</span>ny<span class="k2">;</span>
<span class="number"> 28</span>    <span class="k1">float</span> ty <span class="k3">=</span> nx<span class="k2">;</span>
<span class="number"> 29</span>
<span class="number"> 30</span>    <span class="k1">float</span> dpTan1 <span class="k3">=</span> c1-&gt;velocity.x <span class="k3">*</span> tx <span class="k3">+</span> c1-&gt;velocity.y <span class="k3">*</span> ty<span class="k2">;</span>
<span class="number"> 31</span>    <span class="k1">float</span> dpTan2 <span class="k3">=</span> c2-&gt;velocity.x <span class="k3">*</span> tx <span class="k3">+</span> c2-&gt;velocity.y <span class="k3">*</span> ty<span class="k2">;</span>
<span class="number"> 32</span>
<span class="number"> 33</span>    <span class="k1">float</span> dpNorm1 <span class="k3">=</span> c1-&gt;velocity.x <span class="k3">*</span> nx <span class="k3">+</span> c1-&gt;velocity.y <span class="k3">*</span> ny<span class="k2">;</span>
<span class="number"> 34</span>    <span class="k1">float</span> dpNorm2 <span class="k3">=</span> c2-&gt;velocity.x <span class="k3">*</span> nx <span class="k3">+</span> c2-&gt;velocity.y <span class="k3">*</span> ny<span class="k2">;</span>
<span class="number"> 35</span>
<span class="number"> 36</span>    <span class="k1">float</span> m1 <span class="k3">=</span> <span class="k2">(</span>dpNorm1 <span class="k3">*</span> <span class="k2">(</span>c1-&gt;mass <span class="k3">-</span> c2-&gt;mass<span class="k2">)</span> <span class="k3">+</span> <span class="n">2</span>.<span class="n">0f</span> <span class="k3">*</span> c2-&gt;mass <span class="k3">*</span> dpNorm2<span class="k2">)</span> <span class="k3">/</span> <span class="k2">(</span>c1-&gt;mass <span class="k3">+</span> c2-&gt;mass<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 37</span>    <span class="k1">float</span> m2 <span class="k3">=</span> <span class="k2">(</span>dpNorm2 <span class="k3">*</span> <span class="k2">(</span>c2-&gt;mass <span class="k3">-</span> c1-&gt;mass<span class="k2">)</span> <span class="k3">+</span> <span class="n">2</span>.<span class="n">0f</span> <span class="k3">*</span> c1-&gt;mass <span class="k3">*</span> dpNorm1<span class="k2">)</span> <span class="k3">/</span> <span class="k2">(</span>c1-&gt;mass <span class="k3">+</span> c2-&gt;mass<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 38</span>
<span class="number"> 39</span>    c1-&gt;velocity.x <span class="k3">=</span> tx <span class="k3">*</span> dpTan1 <span class="k3">+</span> nx <span class="k3">*</span> m1<span class="k2">;</span>
<span class="number"> 40</span>    c1-&gt;velocity.y <span class="k3">=</span> ty <span class="k3">*</span> dpTan1 <span class="k3">+</span> ny <span class="k3">*</span> m1<span class="k2">;</span>
<span class="number"> 41</span>
<span class="number"> 42</span>    c2-&gt;velocity.x <span class="k3">=</span> tx <span class="k3">*</span> dpTan2 <span class="k3">+</span> nx <span class="k3">*</span> m2<span class="k2">;</span>
<span class="number"> 43</span>    c2-&gt;velocity.y <span class="k3">=</span> ty <span class="k3">*</span> dpTan2 <span class="k3">+</span> ny <span class="k3">*</span> m2<span class="k2">;</span>
<span class="number"> 44</span>
<span class="number"> 45</span>  <span class="k2">}</span>
<span class="number"> 46</span><span class="k2">}</span>
</div></div><p> </p><p>But object orientated. I don&#39;t think individually checking each objects collision against every other object is &quot;sustainable&quot;.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (dakatt)</author>
		<pubDate>Sun, 04 Nov 2018 19:39:24 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I can think of one problem. Every time you move an object you have to check it for collision with every other object again, otherwise you can end up with overlaps. Same goes for moving objects on the edge of the screen. You might have moved them onto another object.</p><p>When I did a circle collision demo, I used intercept times based on relative velocity. To scale it up, you need to build a collision table, of (N^2 + N)/2 size. Then you store the intercept times in the table, and react to them in order. To make things easier, don&#39;t move an object if it&#39;s way is obstructed. Having to move objects back out of another object sucks. Just don&#39;t let them overlap in the first place.</p><p>Some simple geometry and you can figure out whether a collision is even possible by using 2 line vs circle collisions. Or compute angular bounds of collision. Whatever.</p><p>I can maybe help you more with this if you&#39;re interested. I can&#39;t quite follow all the code you posted, but I didn&#39;t look that closely.</p><p>If you&#39;re interested in me actually checking out the code, post a compilable zip file with all the resources necessary and I will try it and maybe debug it a little bit if I get bored.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Sun, 04 Nov 2018 21:28:35 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>This is quite a tricky problem and if I remember correctly, in the general case, you need to split each time step - calculate the &#39;sub-step time&#39; to the first collision, separate the colliding bodies, re-compute velocities and repeat. Do some googling for &#39;Erin Catto&#39; he did some good lectures on this.<br />For your case you are double-counting your collisions, body A on B and B on A.<br />I changed your code (line 185 in your first listing) to
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">void</span> CPenguin_Collision::Check<span class="k2">(</span>std::vector<span class="k3">&lt;</span>CPenguin_Body<span class="k3">*</span><span class="k3">&gt;</span>body<span class="k2">)</span><span class="k2">{</span>
  <span class="k1">for</span><span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">int</span> i<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>i<span class="k3">&lt;</span>body.size<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span><span class="k2">{</span>
    <span class="k1">for</span><span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">int</span> j<span class="k3">=</span><span class="n">0</span><span class="k2">;</span> j<span class="k3">&lt;</span>i<span class="k2">;</span> j<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span><span class="k2">{</span>
      <span class="k1">if</span><span class="k2">(</span>body<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>id <span class="k3">!</span><span class="k3">=</span> body<span class="k2">[</span>j<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>id<span class="k2">)</span><span class="k2">{</span>
        <span class="k1">if</span><span class="k2">(</span>body<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>CheckCollision<span class="k2">(</span>body<span class="k2">[</span>j<span class="k2">]</span><span class="k2">)</span><span class="k2">)</span><span class="k2">{</span>
          Add<span class="k2">(</span>body<span class="k2">[</span>i<span class="k2">]</span>,body<span class="k2">[</span>j<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
        <span class="k2">}</span>
      <span class="k2">}</span>
    <span class="k2">}</span>
  <span class="k2">}</span>
<span class="k2">}</span>
</pre></div></div><p>
and (lines 311-315)
</p><div class="source-code snippet"><div class="inner"><pre>  <span class="k1">for</span><span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">int</span> i<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>i<span class="k3">&lt;</span>my_body.size<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span><span class="k2">{</span>
    my_body<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>Update<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
    my_body<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>Bound<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
  <span class="k2">}</span>
  penguin_collision-&gt;Check<span class="k2">(</span>my_body<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
and it looked &#39;better&#39; to me on a first glance.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Hull)</author>
		<pubDate>Sun, 04 Nov 2018 23:28:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I made a small guide to using intercept times or overlap checks for circle vs circle collisions on the wiki here :</p><p><a href="https://github.com/liballeg/allegro_wiki/wiki/Circle-V-Circle-collision">https://github.com/liballeg/allegro_wiki/wiki/Circle-V-Circle-collision</a></p><p>I&#39;ll add more to it later, like a collision table, but it fully explains circle vs circle intercept calculation of collision time.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Mon, 05 Nov 2018 01:18:38 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I changed the abs to fabs dbthompson. It may just be me but the circles don&#39;t seem to stick to each other as much. It happens maybe every 20 collisions now. </p><p>I can see that problem with overlaps Edgar, tbh I can barely understand the code I have at the moment but I will check out those guides. Is it that much more coding in general or more about understanding the concepts? I&#39;m not sure whether the circles are getting stuck because of overlap but it seems to happen at random. I was hoping it was where my collision or overlap detection was a bit off or missing some calculation. Would the overlap happen with just two objects?</p><p>That&#39;s was exactly the problem Peter, I realised this morning I was doubling up one of the position updates although I still had no idea how to fix it. Your edit seems to have done the trick. </p><p>Also one last question, are there any small changes I can make to improve the code any more or anything I can do to improve my coding in general? I&#39;m probably breaking a million and one conventions and rules but I&#39;d like to get better. </p><p>Thank you again for all your help guys
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (dakatt)</author>
		<pubDate>Mon, 05 Nov 2018 13:05:49 +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/617607/1039902#target">dakatt</a> said:</div><div class="quote"><p> Also one last question, are there any small changes I can make to improve the code any more
</p></div></div><p>Two things I noticed:
</p><ul><li><p>I would recommend avoiding passing a <span class="source-code">vector</span> (or any container) by value (line 67) because that makes a copy every time. This is inefficient and also loses any changes you might make to the container in the body of the function. A reference or constant reference is better, unless a copy is what you really want.
</p></li><li><p>The result of <span class="source-code"><a href="http://www.delorie.com/djgpp/doc/libc/libc_738.html" target="_blank">sqrt</a></span> is always positive so you don&#39;t need <span class="source-code"><a href="http://www.delorie.com/djgpp/doc/libc/libc_38.html" target="_blank">abs</a></span> in line 123
</p></li></ul></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Hull)</author>
		<pubDate>Mon, 05 Nov 2018 16:11:59 +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/617607/1039888#target">Peter Hull</a> said:</div><div class="quote"><p>
This is quite a tricky problem and if I remember correctly, in the general case, you need to split each time step - calculate the &#39;sub-step time&#39; to the first collision, separate the colliding bodies, re-compute velocities and repeat. Do some googling for &#39;Erin Catto&#39; he did some good lectures on this.
</p></div></div><p>
Basically, you&#39;re doing a binary search over time to find the first collision time.</p><p>Something you can do to make objects stop &#39;sticking&#39; to each other is to allow overlap. If c1.Future(0.0).Overlaps(c2.Future(0.0)), no collision.</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/617607/1039902#target">dakatt</a> said:</div><div class="quote"><p>
I can see that problem with overlaps Edgar, tbh I can barely understand the code I have at the moment but I will check out those guides. Is it that much more coding in general or more about understanding the concepts? I&#39;m not sure whether the circles are getting stuck because of overlap but it seems to happen at random. I was hoping it was where my collision or overlap detection was a bit off or missing some calculation. Would the overlap happen with just two objects?
</p></div></div><p>
Given that you have &#39;boundaries&#39; that move objects, overlap can happen anytime two objects follow each other toward the edge. The collision with the edge is still a collision.</p><p>Basically, overlap can happen any time you move an object. The solution then is to never move your object by a delta time greater than the first possible collision solution. A collision should never change the position of an object, only it&#39;s velocity or momentum or impulse. Because a collision is instantaneous transferral of energy. The objects don&#39;t have time to move, and they wouldn&#39;t move until the energy transfer is complete.</p><p>This is why intercept tables save you all this trouble.</p><p>Read the guides I put up, they&#39;re very simple, and self explanatory, with heavy description.</p><p><a href="https://github.com/liballeg/allegro_wiki/wiki/Circle-V-Circle-collision">https://github.com/liballeg/allegro_wiki/wiki/Circle-V-Circle-collision</a></p><p>I&#39;m currently working on a demo program and a collision table that will save you many many headaches.</p><p>As for code advice, I would recommend you work on your vector class and your circle class. The vector class could really use operator overloading, look into it, and the circle class needs methods for things like future position, and Update(double dt).</p><p><b>UPDATE</b></p><p>I finished a small demo you can try. src and win32 binary are included.</p><p><a href="https://www.allegro.cc/files/attachment/611750">CVC.zip</a></p><p><span class="remote-thumbnail"><span class="json">{"name":"611751","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/f\/c\/fcf0cd94f1968d5d6580b01040a57fc9.png","w":1026,"h":801,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/f\/c\/fcf0cd94f1968d5d6580b01040a57fc9"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/f/c/fcf0cd94f1968d5d6580b01040a57fc9-240.jpg" alt="611751" width="240" height="187" /></span>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Fri, 09 Nov 2018 17:04:15 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Tested, works fine.<br />I&#39;m not used to friction-less physics, but it does seem to be more or less of a natural movement.<br />One surprising behavior is in small-large collision : a slow-moving large ball hitting a slow-moving small ball will hurl the latter at a surprising velocity. The energy sum is probably unchanged, but I feel the amount transferred is more than expected.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Audric)</author>
		<pubDate>Fri, 09 Nov 2018 19:09:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I forgot to say the controls are LMB to launch a small ball, RMB to launch a large ball, and R to toggle screen clearing (that way you can see the trails).</p><p>Balls that overlap are shown in red.</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/617607/1039978#target">Audric</a> said:</div><div class="quote"><p>
One surprising behavior is in small-large collision : a slow-moving large ball hitting a slow-moving small ball will hurl the latter at a surprising velocity. The energy sum is probably unchanged, but I feel the amount transferred is more than expected.
</p></div></div><p>
Yeah, I don&#39;t know actual physics. All I did was transfer the normal momentum to the other ball. A larger ball has more mass, so more energy is injected into the smaller ball, which results in higher velocities.</p><p>What would be more natural? Did you have some equations in mind?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Fri, 09 Nov 2018 20:48:52 +0000</pubDate>
	</item>
</rss>
