<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>A Simple Particle Explosion</title>
		<link>http://www.allegro.cc/forums/view/597234</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Wed, 06 Aug 2008 00:58:56 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ve been searching like a bloodhound through forum archives for some working source code of a particle explosion. Does anyone think they could point me towards a tutorial or just provide some code directly? I&#39;ll keep searching but I think human&#39;s understand what I&#39;m looking for better than the search algorithm does. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (yohosuff)</author>
		<pubDate>Fri, 01 Aug 2008 20:57:25 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><i>
Create a particle struct or class containing x, y, vel, dir, color.
Array or vector containing the amount of particles you want in the explosion.\
When explosion happens
     For each particle
          give particle random dir
          give particle a vel
After explosion happens
     For each particle 
          update particles position (calculate xS and yS from vel and dir)
</i>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (blargmob)</author>
		<pubDate>Fri, 01 Aug 2008 21:08:36 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Blargmob&#39;s basic approach is good, though I&#39;d recommend that you dispense with the array and just simply maintain a big list of &quot;graphical objects&quot; in your program, all of which can have individual velocity, acceleration, lifetimes, and so on. </p><p>In my recent projects, having every sprite/etc. on the screen be considered a &quot;Particle&quot; and treated the same has simplified rendering and updating significantly, at the expense of slightly more memory and CPU usage (that is not an issue at all on a PC built this century).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (amber)</author>
		<pubDate>Fri, 01 Aug 2008 23:59:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>If you use the hardware accelerated approach, blargmob&#39;s method is better, since you don&#39;t have to switch textures between each particle, leading to enormous speed benefits.</p><p>You could look at the sources of <a href="http://pixwiki.bafsoft.com/mags/3/comp/results.htm">these</a> demos I guess.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (SiegeLord)</author>
		<pubDate>Sat, 02 Aug 2008 00:18:11 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>That&#39;s assuming all of your particles in the system are the same texture, and your &quot;big list&quot; isn&#39;t optimized to provide similar benefits.</p><p>In my case, neither of those assumptions are true, but I agree, mileage may vary. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (amber)</author>
		<pubDate>Sat, 02 Aug 2008 00:49:55 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I appreciate your replies, but I have to admit that I don&#39;t know what you are all talking about.</p><p>I tried the sources of the demos you provided a link to, but they are all way to complex for me to understand with my limited knowledge of this particular aspect of programming.</p><p>Is it difficult to write the code for a simple explosion? I learn best from working code. I heard that there are simple examples somewhere, but I haven&#39;t been able to locate them.</p><p>Thanks again for all your help so far. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (yohosuff)</author>
		<pubDate>Sat, 02 Aug 2008 04:55:45 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
I learn best from working code.
</p></div></div><p>
I think you&#39;d learn even better by trying.  Write some thoughts down on how you think it would be done and then try to code it yourself.  When you get stuck at this point, then come here and show your work.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Onewing)</author>
		<pubDate>Sat, 02 Aug 2008 05:15:41 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
I have to admit that I don&#39;t know what you are all talking about.
</p></div></div><p>
First learn what we say. Then try to code it.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (blargmob)</author>
		<pubDate>Sat, 02 Aug 2008 05:28:49 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks for the advice, but I&#39;m still going to go with learning by example.</p><p>I believe the phrase goes something like, &quot;Why reinvent the wheel?&quot; <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /></p><p>I&#39;d really appreciate it if someone would post something that I could learn from. I want to learn. I want to.........LEARN!!! :p
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (yohosuff)</author>
		<pubDate>Sat, 02 Aug 2008 05:55:33 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Try something like this.
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="c">//define a particle structure</span></td></tr><tr><td class="number">2</td><td><span class="k1">typedef</span> <span class="k1">struct</span> particle <span class="k2">{</span></td></tr><tr><td class="number">3</td><td>  <span class="c">//we'll need an x and y position for each particle</span></td></tr><tr><td class="number">4</td><td>  <span class="k1">double</span> x, y<span class="k2">;</span></td></tr><tr><td class="number">5</td><td>  <span class="c">//the particles are going to be moving,</span></td></tr><tr><td class="number">6</td><td>  <span class="c">//so here's x velocity and y velocity</span></td></tr><tr><td class="number">7</td><td>  <span class="k1">double</span> xvel, yvel<span class="k2">;</span></td></tr><tr><td class="number">8</td><td>  <span class="c">//let's also keep track of the old</span></td></tr><tr><td class="number">9</td><td>  <span class="c">//x and y positions so we can draw the</span></td></tr><tr><td class="number">10</td><td>  <span class="c">//particles as lines instead of just points</span></td></tr><tr><td class="number">11</td><td>  <span class="k1">double</span> oldx, oldy<span class="k2">;</span></td></tr><tr><td class="number">12</td><td><span class="k2">}</span><span class="k2">;</span></td></tr><tr><td class="number">13</td><td><span class="c">//create a vector of pointers to particles (kind of like an array)</span></td></tr><tr><td class="number">14</td><td>vector<span class="k3">&lt;</span>particle<span class="k3">*</span><span class="k3">&gt;</span> particles<span class="k2">;</span></td></tr><tr><td class="number">15</td><td><span class="c">/*</span></td></tr><tr><td class="number">16</td><td><span class="c">explode: a function to make a particle explosion</span></td></tr><tr><td class="number">17</td><td><span class="c">parameters:</span></td></tr><tr><td class="number">18</td><td><span class="c">  x: the horizontal position of the explosion's center</span></td></tr><tr><td class="number">19</td><td><span class="c">  y: the vertical position of the explosion's center</span></td></tr><tr><td class="number">20</td><td><span class="c">  num: number of particles in the explosion</span></td></tr><tr><td class="number">21</td><td><span class="c">*/</span></td></tr><tr><td class="number">22</td><td><span class="k1">void</span> explode<span class="k2">(</span><span class="k1">double</span> x, <span class="k1">double</span> y, <span class="k1">int</span> num<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">23</td><td>  <span class="c">//initializes the random number generator with the current time as the seed</span></td></tr><tr><td class="number">24</td><td>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_739.html" target="_blank">srand</a><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a><span class="k2">(</span><span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">25</td><td>  <span class="c">//for loop to create num particles</span></td></tr><tr><td class="number">26</td><td>  <span class="k1">for</span><span class="k2">(</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>num<span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">27</td><td>    <span class="c">//allocates memory for our new particle</span></td></tr><tr><td class="number">28</td><td>    <span class="c">//note that this is a pointer to a particle, not the particle itself</span></td></tr><tr><td class="number">29</td><td>    particle<span class="k3">*</span> p <span class="k3">=</span> <span class="k2">(</span>particle<span class="k3">*</span><span class="k2">)</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_551.html" target="_blank">malloc</a><span class="k2">(</span><span class="k1">sizeof</span><span class="k2">(</span>particle<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">30</td><td>    <span class="c">//set x, y, oldx, and oldy to the center of the explosion</span></td></tr><tr><td class="number">31</td><td>    <span class="k2">(</span><span class="k3">*</span>p<span class="k2">)</span>.x <span class="k3">=</span> <span class="k2">(</span><span class="k3">*</span>p<span class="k2">)</span>.oldx <span class="k3">=</span> x<span class="k2">;</span></td></tr><tr><td class="number">32</td><td>    <span class="k2">(</span><span class="k3">*</span>p<span class="k2">)</span>.y <span class="k3">=</span> <span class="k2">(</span><span class="k3">*</span>p<span class="k2">)</span>.oldy <span class="k3">=</span> y<span class="k2">;</span></td></tr><tr><td class="number">33</td><td>    <span class="c">//set xvel and yvel to random numbers between -4 and 4</span></td></tr><tr><td class="number">34</td><td>    <span class="k2">(</span><span class="k3">*</span>p<span class="k2">)</span>.xvel<span class="k3">=</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span>%<span class="n">4</span><span class="k3">-</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span>%<span class="n">4</span><span class="k2">;</span></td></tr><tr><td class="number">35</td><td>    <span class="k2">(</span><span class="k3">*</span>p<span class="k2">)</span>.yvel<span class="k3">=</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span>%<span class="n">4</span><span class="k3">-</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span>%<span class="n">4</span><span class="k2">;</span></td></tr><tr><td class="number">36</td><td>    <span class="c">//add the particle pointer to our vector</span></td></tr><tr><td class="number">37</td><td>    particles.push_back<span class="k2">(</span>p<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">38</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">39</td><td><span class="k2">}</span></td></tr><tr><td class="number">40</td><td><span class="c">/*</span></td></tr><tr><td class="number">41</td><td><span class="c">stepParticles: a function to step the particles through one frame of movement</span></td></tr><tr><td class="number">42</td><td><span class="c">parameters: none</span></td></tr><tr><td class="number">43</td><td><span class="c">notes:</span></td></tr><tr><td class="number">44</td><td><span class="c">  -call this function every time you go through your game loop.</span></td></tr><tr><td class="number">45</td><td><span class="c">  -remember that particles is a vector of pointers, so you have to dereference them!</span></td></tr><tr><td class="number">46</td><td><span class="c">*/</span></td></tr><tr><td class="number">47</td><td><span class="k1">void</span> stepParticles<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">48</td><td>  <span class="c">//iterate through our vector of particle pointers</span></td></tr><tr><td class="number">49</td><td>  <span class="c">//particles.size() gets the total number of elements in the vector</span></td></tr><tr><td class="number">50</td><td>  <span class="k1">for</span><span class="k2">(</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>particles.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></td></tr><tr><td class="number">51</td><td>    <span class="c">//set oldx and oldy to the current values of x and y</span></td></tr><tr><td class="number">52</td><td>    <span class="k2">(</span><span class="k3">*</span>particles.at<span class="k2">(</span>i<span class="k2">)</span><span class="k2">)</span>.oldx<span class="k3">=</span><span class="k2">(</span><span class="k3">*</span>particles.at<span class="k2">(</span>i<span class="k2">)</span><span class="k2">)</span>.x<span class="k2">;</span></td></tr><tr><td class="number">53</td><td>    <span class="k2">(</span><span class="k3">*</span>particles.at<span class="k2">(</span>i<span class="k2">)</span><span class="k2">)</span>.oldy<span class="k3">=</span><span class="k2">(</span><span class="k3">*</span>particles.at<span class="k2">(</span>i<span class="k2">)</span><span class="k2">)</span>.y<span class="k2">;</span></td></tr><tr><td class="number">54</td><td>    <span class="c">//now we add xvel and yvel to x and y so the particles move</span></td></tr><tr><td class="number">55</td><td>    <span class="k2">(</span><span class="k3">*</span>particles.at<span class="k2">(</span>i<span class="k2">)</span><span class="k2">)</span>.x<span class="k3">+</span><span class="k3">=</span><span class="k2">(</span><span class="k3">*</span>particles.at<span class="k2">(</span>i<span class="k2">)</span><span class="k2">)</span>.xvel<span class="k2">;</span></td></tr><tr><td class="number">56</td><td>    <span class="k2">(</span><span class="k3">*</span>particles.at<span class="k2">(</span>i<span class="k2">)</span><span class="k2">)</span>.y<span class="k3">+</span><span class="k3">=</span><span class="k2">(</span><span class="k3">*</span>particles.at<span class="k2">(</span>i<span class="k2">)</span><span class="k2">)</span>.yvel<span class="k2">;</span></td></tr><tr><td class="number">57</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">58</td><td><span class="k2">}</span></td></tr><tr><td class="number">59</td><td><span class="c">/*</span></td></tr><tr><td class="number">60</td><td><span class="c">drawParticles: a function to draw the particles on the screen</span></td></tr><tr><td class="number">61</td><td><span class="c">parameters: none</span></td></tr><tr><td class="number">62</td><td><span class="c">notes: call this function every time you go through your game loop.</span></td></tr><tr><td class="number">63</td><td><span class="c">*/</span></td></tr><tr><td class="number">64</td><td><span class="k1">void</span> drawParticles<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">65</td><td>  <span class="c">//iterate through the vector like last time</span></td></tr><tr><td class="number">66</td><td>  <span class="k1">for</span><span class="k2">(</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>particles.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></td></tr><tr><td class="number">67</td><td>    <span class="c">//you'll have to have a BITMAP named buffer for this to work,</span></td></tr><tr><td class="number">68</td><td>    <span class="c">//assuming you're double buffering</span></td></tr><tr><td class="number">69</td><td>    <a href="http://www.allegro.cc/manual/line" target="_blank"><span class="a">line</span></a><span class="k2">(</span>buffer,</td></tr><tr><td class="number">70</td><td>      <span class="k2">(</span><span class="k3">*</span>particles.at<span class="k2">(</span>i<span class="k2">)</span><span class="k2">)</span>.x, <span class="k2">(</span><span class="k3">*</span>particles.at<span class="k2">(</span>i<span class="k2">)</span><span class="k2">)</span>.y,</td></tr><tr><td class="number">71</td><td>      <span class="k2">(</span><span class="k3">*</span>particles.at<span class="k2">(</span>i<span class="k2">)</span><span class="k2">)</span>.oldx, <span class="k2">(</span><span class="k3">*</span>particles.at<span class="k2">(</span>i<span class="k2">)</span><span class="k2">)</span>.oldy,</td></tr><tr><td class="number">72</td><td>      <a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</span></a><span class="k2">(</span><span class="n">255</span>,<span class="n">127</span>,<span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">73</td><td>    <span class="c">//it spans many lines to make it easier to read</span></td></tr><tr><td class="number">74</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">75</td><td><span class="k2">}</span></td></tr><tr><td class="number">76</td><td><span class="c">//an example of your game loop</span></td></tr><tr><td class="number">77</td><td><span class="k1">while</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_ESC<span class="k2">]</span><span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">78</td><td>  <a href="http://www.allegro.cc/manual/clear_keybuf" target="_blank"><span class="a">clear_keybuf</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">79</td><td>  <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_SPACE<span class="k2">]</span><span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">80</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_739.html" target="_blank">srand</a><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a><span class="k2">(</span><span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">81</td><td>    <span class="c">//make explosion at random place on the screen</span></td></tr><tr><td class="number">82</td><td>    explode<span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span>%<a href="http://www.allegro.cc/manual/SCREEN_W" target="_blank"><span class="a">SCREEN_W</span></a>, <a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span>%<a href="http://www.allegro.cc/manual/SCREEN_H" target="_blank"><span class="a">SCREEN_H</span></a>, <span class="n">20</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">83</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">84</td><td>  clear<span class="k2">(</span>buffer<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">85</td><td>  stepParticles<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">86</td><td>  drawParticles<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">87</td><td>  <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>buffer,<a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>,<span class="n">0</span>,<span class="n">0</span>,<span class="n">0</span>,<span class="n">0</span>,buffer-&gt;w,buffer-&gt;h<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">88</td><td>  <a href="http://www.allegro.cc/manual/rest" target="_blank"><span class="a">rest</span></a><span class="k2">(</span><span class="n">20</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">89</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

I didn&#39;t test it, but that should get you started. If you want images attached to your particles, you may not need oldx or oldy, they&#39;re just for drawing the line.<br />Correct me if I&#39;m missing anything, but I think this code needs to include allegro.h, ctime, math.h, and vector.<br />Let us know how the learning goes!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Schyfis)</author>
		<pubDate>Sat, 02 Aug 2008 07:43:26 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>And a good way to learn is by doing... Blargmob gave you an algorithm you could implement in your very first reply. Translating it to code shouldn&#39;t be too difficult if you just try. Here&#39;s an example based on his algorithm (untested, uncompiled) :
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="c">//</span></td></tr><tr><td class="number">2</td><td>&#160;</td></tr><tr><td class="number">3</td><td><span class="p">#include &lt;vector&gt;</span></td></tr><tr><td class="number">4</td><td><span class="p">#include &lt;cmath&gt;</span></td></tr><tr><td class="number">5</td><td><span class="p">#include &lt;allegro.h&gt;</span></td></tr><tr><td class="number">6</td><td>&#160;</td></tr><tr><td class="number">7</td><td>&#160;</td></tr><tr><td class="number">8</td><td><span class="k1">class</span> Particle <span class="k2">{</span></td></tr><tr><td class="number">9</td><td>  <span class="k1">public</span> <span class="k2">:</span></td></tr><tr><td class="number">10</td><td>    <span class="k1">int</span> x,y<span class="k2">;</span><span class="c">// display position</span></td></tr><tr><td class="number">11</td><td>    <span class="k1">float</span> fx,fy<span class="k2">;</span><span class="c">// accurate position</span></td></tr><tr><td class="number">12</td><td>    <span class="k1">float</span> fvx,fvy<span class="k2">;</span><span class="c">// component velocities</span></td></tr><tr><td class="number">13</td><td>    <span class="k1">float</span> fspeed<span class="k2">;</span><span class="c">// absolute speed</span></td></tr><tr><td class="number">14</td><td>    <span class="k1">float</span> direction<span class="k2">;</span><span class="c">// angle of travel in radians</span></td></tr><tr><td class="number">15</td><td>    <span class="k1">int</span> color<span class="k2">;</span></td></tr><tr><td class="number">16</td><td>    <span class="k1">unsigned</span> <span class="k1">int</span> num_updates_allowed<span class="k2">;</span></td></tr><tr><td class="number">17</td><td>    <span class="k1">unsigned</span> <span class="k1">int</span> updates_left<span class="k2">;</span></td></tr><tr><td class="number">18</td><td>    </td></tr><tr><td class="number">19</td><td>    Particle<span class="k2">(</span><span class="k2">)</span> <span class="k2">:</span> x<span class="k2">(</span><span class="n">0</span><span class="k2">)</span> , y<span class="k2">(</span><span class="n">0</span><span class="k2">)</span> , fx<span class="k2">(</span><span class="n">0</span>.<span class="n">0f</span><span class="k2">)</span> , fy<span class="k2">(</span><span class="n">0</span>.<span class="n">0f</span><span class="k2">)</span> ,</td></tr><tr><td class="number">20</td><td>                 fspeed<span class="k2">(</span><span class="n">0</span>.<span class="n">0f</span><span class="k2">)</span> , direction<span class="k2">(</span><span class="n">0</span>.<span class="n">0f</span><span class="k2">)</span> , color<span class="k2">(</span><a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</span></a><span class="k2">(</span><span class="n">0</span>,<span class="n">0</span>,<span class="n">0</span><span class="k2">)</span><span class="k2">)</span> , num_updates_allowed<span class="k2">(</span><span class="n">0</span><span class="k2">)</span> <span class="k2">{</span><span class="k2">}</span></td></tr><tr><td class="number">21</td><td>    </td></tr><tr><td class="number">22</td><td>    <span class="k1">void</span> SetPersistence<span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">int</span> num_updates<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">23</td><td>      num_updates_allowed <span class="k3">=</span> num_updates<span class="k2">;</span></td></tr><tr><td class="number">24</td><td>      updates_left <span class="k3">=</span> num_updates_allowed<span class="k2">;</span></td></tr><tr><td class="number">25</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">26</td><td>    </td></tr><tr><td class="number">27</td><td>    <span class="k1">void</span> SetColor<span class="k2">(</span><span class="k1">int</span> newcolor<span class="k2">)</span> <span class="k2">{</span>color <span class="k3">=</span> newcolor<span class="k2">;</span><span class="k2">}</span></td></tr><tr><td class="number">28</td><td>    </td></tr><tr><td class="number">29</td><td>    <span class="k1">void</span> SetPos<span class="k2">(</span><span class="k1">float</span> xpos , <span class="k1">float</span> ypos<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">30</td><td>      fx <span class="k3">=</span> xpos<span class="k2">;</span></td></tr><tr><td class="number">31</td><td>      fy <span class="k3">=</span> ypos<span class="k2">;</span></td></tr><tr><td class="number">32</td><td>      x <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>fx<span class="k2">;</span></td></tr><tr><td class="number">33</td><td>      y <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>fy<span class="k2">;</span></td></tr><tr><td class="number">34</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">35</td><td>    </td></tr><tr><td class="number">36</td><td>    <span class="k1">void</span> SetMovement<span class="k2">(</span><span class="k1">float</span> speed , <span class="k1">float</span> angle_radians<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">37</td><td>      <span class="k1">if</span> <span class="k2">(</span>speed <span class="k3">&lt;</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">)</span> <span class="k2">{</span>speed <span class="k3">=</span> <span class="k3">-</span>speed<span class="k2">;</span><span class="k2">}</span></td></tr><tr><td class="number">38</td><td>      fspeed <span class="k3">=</span> speed<span class="k2">;</span></td></tr><tr><td class="number">39</td><td>      direction <span class="k3">=</span> angle_radians<span class="k2">;</span></td></tr><tr><td class="number">40</td><td>      fvx <span class="k3">=</span> fspeed<span class="k3">*</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_113.html" target="_blank">cos</a><span class="k2">(</span>angle_radians<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">41</td><td>      fvy <span class="k3">=</span> fspeed<span class="k3">*</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_728.html" target="_blank">sin</a><span class="k2">(</span>angle_radians<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">42</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">43</td><td>    </td></tr><tr><td class="number">44</td><td>    <span class="k1">unsigned</span> <span class="k1">int</span> UpdatePos<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">45</td><td>      <span class="k1">if</span> <span class="k2">(</span>updates_left<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">46</td><td>        fx <span class="k3">+</span><span class="k3">=</span> fvx<span class="k2">;</span></td></tr><tr><td class="number">47</td><td>        fy <span class="k3">+</span><span class="k3">=</span> fvy<span class="k2">;</span></td></tr><tr><td class="number">48</td><td>        x <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>fx<span class="k2">;</span></td></tr><tr><td class="number">49</td><td>        y <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>fy<span class="k2">;</span></td></tr><tr><td class="number">50</td><td>        <span class="k3">-</span><span class="k3">-</span>updates_left<span class="k2">;</span></td></tr><tr><td class="number">51</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">52</td><td>      <span class="k1">return</span> updates_left<span class="k2">;</span></td></tr><tr><td class="number">53</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">54</td><td>    </td></tr><tr><td class="number">55</td><td>    <span class="k1">void</span> Draw<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span> bmp<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">56</td><td>      <a href="http://www.allegro.cc/manual/putpixel" target="_blank"><span class="a">putpixel</span></a><span class="k2">(</span>bmp , x , y , color<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">57</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">58</td><td><span class="k2">}</span><span class="k2">;</span></td></tr><tr><td class="number">59</td><td>&#160;</td></tr><tr><td class="number">60</td><td><span class="k1">class</span> Explosion <span class="k2">{</span></td></tr><tr><td class="number">61</td><td>  <span class="k1">public</span> <span class="k2">:</span></td></tr><tr><td class="number">62</td><td>    std::vector<span class="k3">&lt;</span>Particle<span class="k3">*</span><span class="k3">&gt;</span> particles<span class="k2">;</span></td></tr><tr><td class="number">63</td><td>    <span class="k1">unsigned</span> <span class="k1">int</span> particle_count<span class="k2">;</span></td></tr><tr><td class="number">64</td><td>    </td></tr><tr><td class="number">65</td><td>    Explosion<span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">int</span> num_particles , <span class="k1">int</span> ex , <span class="k1">int</span> ey<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">66</td><td>      Particle<span class="k3">*</span> p <span class="k3">=</span> NULL<span class="k2">;</span></td></tr><tr><td class="number">67</td><td>      <span class="k1">float</span> basespeed <span class="k3">=</span> <span class="n">5</span>.<span class="n">0f</span><span class="k2">;</span></td></tr><tr><td class="number">68</td><td>      <span class="k1">float</span> pspeed <span class="k3">=</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span></td></tr><tr><td class="number">69</td><td>      <span class="k1">float</span> angle <span class="k3">=</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span></td></tr><tr><td class="number">70</td><td>      particle_count <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">71</td><td>      <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> num_particles <span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>i<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">72</td><td>        p <span class="k3">=</span> <span class="k1">new</span> Particle<span class="k2">;</span></td></tr><tr><td class="number">73</td><td>        <span class="k1">if</span> <span class="k2">(</span>p<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">74</td><td>          p-&gt;SetPos<span class="k2">(</span><span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>ex <span class="k3">+</span> <span class="n">0</span>.<span class="n">5f</span> , <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>ey <span class="k3">+</span> <span class="n">0</span>.<span class="n">5f</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">75</td><td>          pspeed <span class="k3">=</span> basespeed <span class="k3">+</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span><span class="k2">(</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span> % <span class="n">5</span><span class="k2">)</span> <span class="k3">-</span> <span class="n">2</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">76</td><td>          angle <span class="k3">=</span> <span class="k2">(</span><span class="k2">(</span><span class="k1">float</span><span class="k2">)</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span> % <span class="n">3600</span><span class="k2">)</span><span class="k2">)</span><span class="k3">/</span><span class="n">10</span>.<span class="n">0f</span><span class="k2">;</span></td></tr><tr><td class="number">77</td><td>          angle <span class="k3">=</span> angle<span class="k3">*</span><span class="k2">(</span>M_PI<span class="k3">/</span><span class="n">180</span>.<span class="n">0f</span><span class="k2">)</span></td></tr><tr><td class="number">78</td><td>          p-&gt;SetMovement<span class="k2">(</span>pspeed , angle<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">79</td><td>          </td></tr><tr><td class="number">80</td><td>          p-&gt;SetPersistence<span class="k2">(</span><span class="n">125</span> <span class="k3">+</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span>%<span class="n">50</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">81</td><td>          p-&gt;SetColor<span class="k2">(</span><a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</span></a><span class="k2">(</span><span class="n">128</span> <span class="k3">+</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span>%<span class="n">128</span> , <span class="n">128</span> <span class="k3">+</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span>%<span class="n">128</span> , <span class="n">64</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">82</td><td>          </td></tr><tr><td class="number">83</td><td>          particles.pushback<span class="k2">(</span>p<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">84</td><td>          <span class="k3">+</span><span class="k3">+</span>particle_count<span class="k2">;</span></td></tr><tr><td class="number">85</td><td>        <span class="k2">}</span></td></tr><tr><td class="number">86</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">87</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">88</td><td>    </td></tr><tr><td class="number">89</td><td>    ~Explosion<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">90</td><td>      std::vector<span class="k3">&lt;</span>Particle<span class="k3">*</span><span class="k3">&gt;</span><span class="k2">:</span><span class="k2">:</span>iterator it<span class="k2">;</span></td></tr><tr><td class="number">91</td><td>      <span class="k1">for</span> <span class="k2">(</span>it <span class="k3">=</span> particles.begin<span class="k2">(</span><span class="k2">)</span> <span class="k2">;</span> it <span class="k3">!</span><span class="k3">=</span> particles.end<span class="k2">(</span><span class="k2">)</span> <span class="k2">;</span> <span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">92</td><td>        <span class="k1">if</span> <span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span> <span class="k2">{</span><span class="k1">delete</span> <span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k2">;</span><span class="k2">}</span></td></tr><tr><td class="number">93</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">94</td><td>      particles.clear<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">95</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">96</td><td>    </td></tr><tr><td class="number">97</td><td>    <span class="k1">unsigned</span> <span class="k1">int</span> UpdateExplosion<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">98</td><td>      std::vector<span class="k3">&lt;</span>Particle<span class="k3">*</span><span class="k3">&gt;</span><span class="k2">:</span><span class="k2">:</span>iterator it<span class="k2">;</span></td></tr><tr><td class="number">99</td><td>      <span class="k1">for</span> <span class="k2">(</span>it <span class="k3">=</span> particles.begin<span class="k2">(</span><span class="k2">)</span> <span class="k2">;</span> it <span class="k3">!</span><span class="k3">=</span> particles.end<span class="k2">(</span><span class="k2">)</span> <span class="k2">;</span> <span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">100</td><td>        <span class="k1">if</span> <span class="k2">(</span><span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>UpdatePos<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span><span class="c">// check the return value of Particle::UPdatePos to</span></td></tr><tr><td class="number">101</td><td>                                 <span class="c">//  see if there are any updates left for this particle</span></td></tr><tr><td class="number">102</td><td>          <span class="k3">+</span><span class="k3">+</span>it<span class="k2">;</span></td></tr><tr><td class="number">103</td><td>        <span class="k2">}</span> <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">104</td><td>          <span class="k1">delete</span> <span class="k3">*</span>it<span class="k2">;</span></td></tr><tr><td class="number">105</td><td>          it <span class="k3">=</span> particles.erase<span class="k2">(</span>it<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">106</td><td>          <span class="k3">-</span><span class="k3">-</span>particle_count<span class="k2">;</span></td></tr><tr><td class="number">107</td><td>        <span class="k2">}</span></td></tr><tr><td class="number">108</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">109</td><td>      <span class="k1">return</span> particle_count<span class="k2">;</span></td></tr><tr><td class="number">110</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">111</td><td>    </td></tr><tr><td class="number">112</td><td>    <span class="k1">void</span> Draw<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span> bmp<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">113</td><td>      std::vector<span class="k3">&lt;</span>Particle<span class="k3">*</span><span class="k3">&gt;</span><span class="k2">:</span><span class="k2">:</span>iterator it<span class="k2">;</span></td></tr><tr><td class="number">114</td><td>      <span class="k1">for</span> <span class="k2">(</span>it <span class="k3">=</span> particles.begin<span class="k2">(</span><span class="k2">)</span> <span class="k2">;</span> it <span class="k3">!</span><span class="k3">=</span> particles.end<span class="k2">(</span><span class="k2">)</span> <span class="k2">;</span> <span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">115</td><td>        <span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>Draw<span class="k2">(</span>bmp<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">116</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">117</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">118</td><td>    </td></tr><tr><td class="number">119</td><td>  <span class="k1">private</span> <span class="k2">:</span></td></tr><tr><td class="number">120</td><td>    </td></tr><tr><td class="number">121</td><td><span class="k2">}</span><span class="k2">;</span></td></tr><tr><td class="number">122</td><td>&#160;</td></tr><tr><td class="number">123</td><td>&#160;</td></tr><tr><td class="number">124</td><td><span class="c">//</span></td></tr></tbody></table></div></div><p>

And a quick example of usage :
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">unsigned</span> <span class="k1">int</span> num_particles <span class="k3">=</span> <span class="n">100</span><span class="k2">;</span></td></tr><tr><td class="number">2</td><td>Explosion<span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_299.html" target="_blank">exp</a> <span class="k3">=</span> <span class="k1">new</span> Explosion<span class="k2">(</span>num_particles , <a href="http://www.allegro.cc/manual/SCREEN_W" target="_blank"><span class="a">SCREEN_W</span></a><span class="k3">/</span><span class="n">2</span> , <a href="http://www.allegro.cc/manual/SCREEN_H" target="_blank"><span class="a">SCREEN_H</span></a><span class="k3">/</span><span class="n">2</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">3</td><td><span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_299.html" target="_blank">exp</a><span class="k2">)</span> <span class="k2">{</span><span class="k1">return</span> <span class="n">0</span><span class="k2">;</span><span class="k2">}</span></td></tr><tr><td class="number">4</td><td>&#160;</td></tr><tr><td class="number">5</td><td><a href="http://www.allegro.cc/manual/clear_keybuf" target="_blank"><span class="a">clear_keybuf</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span><a href="http://www.allegro.cc/manual/readkey" target="_blank"><span class="a">readkey</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">6</td><td>&#160;</td></tr><tr><td class="number">7</td><td><span class="k1">bool</span> stop <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">8</td><td><span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span>stop<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">9</td><td>  <a href="http://www.allegro.cc/manual/clear_to_color" target="_blank"><span class="a">clear_to_color</span></a><span class="k2">(</span>buffer , <a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</span></a><span class="k2">(</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="k2">;</span></td></tr><tr><td class="number">10</td><td>  exp-&gt;Draw<span class="k2">(</span>buffer<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">11</td><td>  <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>buffer , <a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a> , <span class="n">0</span> , <span class="n">0</span> , <span class="n">0</span> , <span class="n">0</span> buffer-&gt;w , buffer-&gt;h<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">12</td><td>  <span class="k1">if</span> <span class="k2">(</span>exp-&gt;Update<span class="k2">(</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">13</td><td>    stop <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span></td></tr><tr><td class="number">14</td><td>  <span class="k2">}</span> <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">15</td><td>    <a href="http://www.allegro.cc/manual/rest" target="_blank"><span class="a">rest</span></a><span class="k2">(</span><span class="n">25</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">16</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">17</td><td><span class="k2">}</span></td></tr><tr><td class="number">18</td><td>&#160;</td></tr><tr><td class="number">19</td><td><span class="k1">delete</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_299.html" target="_blank">exp</a><span class="k2">;</span></td></tr><tr><td class="number">20</td><td><a href="http://www.allegro.cc/manual/clear_keybuf" target="_blank"><span class="a">clear_keybuf</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span><a href="http://www.allegro.cc/manual/readkey" target="_blank"><span class="a">readkey</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">21</td><td>&#160;</td></tr><tr><td class="number">22</td><td><span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Sat, 02 Aug 2008 08:05:47 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Schyfis said:</div><div class="quote"><p>

</p><div class="source-code snippet"><div class="inner"><pre><span class="k2">(</span><span class="k3">*</span>p<span class="k2">)</span>.x <span class="k3">=</span> <span class="k2">(</span><span class="k3">*</span>p<span class="k2">)</span>.oldx <span class="k3">=</span> x<span class="k2">;</span>
</pre></div></div><p>
</p></div></div><p>
perhaps going <span class="source-code">p-&gt;x <span class="k3">=</span> p-&gt;oldx <span class="k3">=</span> x<span class="k2">;</span></span> would actually be clearer.</p><p>Edit:<br />Memory allocations are quite expensive, so you could use an array. If the array is full and you need to insert a new particle, you can over-write the oldest. </p><p>Particles lend themselves to C++, with a pixel class, but I did my example in C. You could easily roll this up into a class, but I am in a C mood. (The code, binary and code::blocks project is attached.)</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="p">#include &lt;allegro.h&gt;</span></td></tr><tr><td class="number">2</td><td>&#160;</td></tr><tr><td class="number">3</td><td><span class="k1">typedef</span> <span class="k1">struct</span></td></tr><tr><td class="number">4</td><td><span class="k2">{</span></td></tr><tr><td class="number">5</td><td>    <span class="k1">float</span> x, y<span class="k2">;</span></td></tr><tr><td class="number">6</td><td>    <span class="k1">float</span> dx, dy<span class="k2">;</span></td></tr><tr><td class="number">7</td><td>    <span class="k1">unsigned</span> <span class="k1">int</span> alive<span class="k2">;</span></td></tr><tr><td class="number">8</td><td><span class="k2">}</span>PARTICLE<span class="k2">;</span></td></tr><tr><td class="number">9</td><td>&#160;</td></tr><tr><td class="number">10</td><td><span class="k1">void</span>     particle_init  <span class="k2">(</span>PARTICLE <span class="k3">*</span>p<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">11</td><td>PARTICLE particle_create<span class="k2">(</span><span class="k1">float</span> _x, <span class="k1">float</span> _y<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">12</td><td><span class="k1">void</span>     particle_update<span class="k2">(</span>PARTICLE <span class="k3">*</span>p<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">13</td><td><span class="k1">void</span>     particle_render<span class="k2">(</span>PARTICLE p, <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>buffer<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">14</td><td>&#160;</td></tr><tr><td class="number">15</td><td><span class="k1">void</span>     manager_init  <span class="k2">(</span>PARTICLE <span class="k3">*</span>particle, <span class="k1">int</span> count<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">16</td><td><span class="k1">void</span>     manager_update<span class="k2">(</span>PARTICLE <span class="k3">*</span>particle, <span class="k1">int</span> count<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">17</td><td><span class="k1">void</span>     manager_render<span class="k2">(</span>PARTICLE <span class="k3">*</span>particle, <span class="k1">int</span> count, <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>buffer<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td><span class="k1">void</span>     manager_insert<span class="k2">(</span>PARTICLE <span class="k3">*</span>particle, <span class="k1">int</span> count, PARTICLE p<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">19</td><td>&#160;</td></tr><tr><td class="number">20</td><td>&#160;</td></tr><tr><td class="number">21</td><td><span class="k1">volatile</span> <span class="k1">int</span> logic_counter <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">22</td><td><span class="k1">void</span> logic_counter_handler<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">23</td><td><span class="k2">{</span></td></tr><tr><td class="number">24</td><td>    logic_counter<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">25</td><td><span class="k2">}</span></td></tr><tr><td class="number">26</td><td><a href="http://www.allegro.cc/manual/END_OF_FUNCTION" target="_blank"><span class="a">END_OF_FUNCTION</span></a><span class="k2">(</span>logic_counter_handler<span class="k2">)</span></td></tr><tr><td class="number">27</td><td>&#160;</td></tr><tr><td class="number">28</td><td>&#160;</td></tr><tr><td class="number">29</td><td>&#160;</td></tr><tr><td class="number">30</td><td><span class="p">#define MAX_PARTICLES   256</span></td></tr><tr><td class="number">31</td><td>&#160;</td></tr><tr><td class="number">32</td><td><span class="k1">int</span> main<span class="k2">(</span><span class="k1">int</span> argc, <span class="k1">char</span> <span class="k3">*</span><span class="k3">*</span>argv<span class="k2">)</span></td></tr><tr><td class="number">33</td><td><span class="k2">{</span></td></tr><tr><td class="number">34</td><td>    PARTICLE particle<span class="k2">[</span>MAX_PARTICLES<span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">35</td><td>    PARTICLE p<span class="k2">;</span></td></tr><tr><td class="number">36</td><td>    <span class="k1">int</span> quitting <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">37</td><td>&#160;</td></tr><tr><td class="number">38</td><td>    <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/allegro_init" target="_blank"><span class="a">allegro_init</span></a><span class="k2">(</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">39</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">40</td><td>        <a href="http://www.allegro.cc/manual/allegro_message" target="_blank"><span class="a">allegro_message</span></a><span class="k2">(</span><span class="s">"Unable to initilize allegro. :("</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">41</td><td>        <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">42</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">43</td><td>&#160;</td></tr><tr><td class="number">44</td><td>    <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/install_keyboard" target="_blank"><span class="a">install_keyboard</span></a><span class="k2">(</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">45</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">46</td><td>        <a href="http://www.allegro.cc/manual/allegro_message" target="_blank"><span class="a">allegro_message</span></a><span class="k2">(</span><span class="s">"Unable to install keyboard driver. :("</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">47</td><td>        <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">48</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">49</td><td>&#160;</td></tr><tr><td class="number">50</td><td>    <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/install_mouse" target="_blank"><span class="a">install_mouse</span></a><span class="k2">(</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">)</span></td></tr><tr><td class="number">51</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">52</td><td>        <a href="http://www.allegro.cc/manual/allegro_message" target="_blank"><span class="a">allegro_message</span></a><span class="k2">(</span><span class="s">"Unable to install mouse driver. :("</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">53</td><td>        <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">54</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">55</td><td>&#160;</td></tr><tr><td class="number">56</td><td>    <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/install_timer" target="_blank"><span class="a">install_timer</span></a><span class="k2">(</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">57</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">58</td><td>        <a href="http://www.allegro.cc/manual/allegro_message" target="_blank"><span class="a">allegro_message</span></a><span class="k2">(</span><span class="s">"Unable to install timer driver. :("</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">59</td><td>        <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">60</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">61</td><td>&#160;</td></tr><tr><td class="number">62</td><td>    <a href="http://www.allegro.cc/manual/LOCK_VARIABLE" target="_blank"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>logic_counter<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">63</td><td>    <a href="http://www.allegro.cc/manual/LOCK_FUNCTION" target="_blank"><span class="a">LOCK_FUNCTION</span></a><span class="k2">(</span>logic_counter_handler<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">64</td><td>&#160;</td></tr><tr><td class="number">65</td><td>    <a href="http://www.allegro.cc/manual/set_color_depth" target="_blank"><span class="a">set_color_depth</span></a><span class="k2">(</span><span class="n">32</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">66</td><td>    <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/set_gfx_mode" target="_blank"><span class="a">set_gfx_mode</span></a><span class="k2">(</span>GFX_AUTODETECT_WINDOWED, <span class="n">800</span>, <span class="n">600</span>, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">67</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">68</td><td>        <a href="http://www.allegro.cc/manual/allegro_message" target="_blank"><span class="a">allegro_message</span></a><span class="k2">(</span><span class="s">"Unable to set gfx mode. :(\n(%s)"</span>, <a href="http://www.allegro.cc/manual/allegro_error" target="_blank"><span class="a">allegro_error</span></a><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">69</td><td>        <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">70</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">71</td><td>&#160;</td></tr><tr><td class="number">72</td><td>    <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>buffer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/create_bitmap" target="_blank"><span class="a">create_bitmap</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/SCREEN_W" target="_blank"><span class="a">SCREEN_W</span></a>, <a href="http://www.allegro.cc/manual/SCREEN_H" target="_blank"><span class="a">SCREEN_H</span></a><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">73</td><td>    <span class="k1">if</span> <span class="k2">(</span>buffer <span class="k3">=</span><span class="k3">=</span> NULL<span class="k2">)</span></td></tr><tr><td class="number">74</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">75</td><td>        <a href="http://www.allegro.cc/manual/allegro_message" target="_blank"><span class="a">allegro_message</span></a><span class="k2">(</span><span class="s">"Unable to create back buffer. :("</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">76</td><td>        <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">77</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">78</td><td>&#160;</td></tr><tr><td class="number">79</td><td>    <a href="http://www.allegro.cc/manual/show_mouse" target="_blank"><span class="a">show_mouse</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">80</td><td>&#160;</td></tr><tr><td class="number">81</td><td>    manager_init<span class="k2">(</span>particle, MAX_PARTICLES<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">82</td><td>&#160;</td></tr><tr><td class="number">83</td><td>    <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/install_int" target="_blank"><span class="a">install_int</span></a><span class="k2">(</span>logic_counter_handler, <span class="n">33</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">84</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">85</td><td>        <a href="http://www.allegro.cc/manual/allegro_message" target="_blank"><span class="a">allegro_message</span></a><span class="k2">(</span><span class="s">"Unable to install logic timer. :("</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">86</td><td>        quitting <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">87</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">88</td><td>    logic_counter <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">89</td><td>    <span class="k1">while</span><span class="k2">(</span><span class="k3">!</span>quitting<span class="k2">)</span></td></tr><tr><td class="number">90</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">91</td><td>&#160;</td></tr><tr><td class="number">92</td><td>        <span class="k1">if</span> <span class="k2">(</span>logic_counter <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">93</td><td>        <span class="k2">{</span></td></tr><tr><td class="number">94</td><td>            <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/mouse_b" target="_blank"><span class="a">mouse_b</span></a> <span class="k3">&amp;</span> <span class="n">1</span><span class="k2">)</span></td></tr><tr><td class="number">95</td><td>            <span class="k2">{</span></td></tr><tr><td class="number">96</td><td>                p <span class="k3">=</span> particle_create<span class="k2">(</span><a href="http://www.allegro.cc/manual/mouse_x" target="_blank"><span class="a">mouse_x</span></a>, <a href="http://www.allegro.cc/manual/mouse_y" target="_blank"><span class="a">mouse_y</span></a><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">97</td><td>                manager_insert<span class="k2">(</span>particle, MAX_PARTICLES, p<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">98</td><td>            <span class="k2">}</span></td></tr><tr><td class="number">99</td><td>            manager_update<span class="k2">(</span>particle, MAX_PARTICLES<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">100</td><td>            logic_counter--<span class="k2">;</span></td></tr><tr><td class="number">101</td><td>        <span class="k2">}</span></td></tr><tr><td class="number">102</td><td>&#160;</td></tr><tr><td class="number">103</td><td>&#160;</td></tr><tr><td class="number">104</td><td>        <a href="http://www.allegro.cc/manual/clear_bitmap" target="_blank"><span class="a">clear_bitmap</span></a><span class="k2">(</span>buffer<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">105</td><td>        manager_render<span class="k2">(</span>particle, MAX_PARTICLES, buffer<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">106</td><td>&#160;</td></tr><tr><td class="number">107</td><td>&#160;</td></tr><tr><td class="number">108</td><td>        <a href="http://www.allegro.cc/manual/scare_mouse" target="_blank"><span class="a">scare_mouse</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">109</td><td>        <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>buffer, <a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>,  <a href="http://www.allegro.cc/manual/SCREEN_W" target="_blank"><span class="a">SCREEN_W</span></a>, <a href="http://www.allegro.cc/manual/SCREEN_H" target="_blank"><span class="a">SCREEN_H</span></a><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">110</td><td>        <a href="http://www.allegro.cc/manual/unscare_mouse" target="_blank"><span class="a">unscare_mouse</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">111</td><td>&#160;</td></tr><tr><td class="number">112</td><td>        <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_ESC<span class="k2">]</span><span class="k2">)</span></td></tr><tr><td class="number">113</td><td>        <span class="k2">{</span></td></tr><tr><td class="number">114</td><td>            quitting <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">115</td><td>        <span class="k2">}</span></td></tr><tr><td class="number">116</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">117</td><td>&#160;</td></tr><tr><td class="number">118</td><td>&#160;</td></tr><tr><td class="number">119</td><td>    <a href="http://www.allegro.cc/manual/show_mouse" target="_blank"><span class="a">show_mouse</span></a><span class="k2">(</span>NULL<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">120</td><td>    <a href="http://www.allegro.cc/manual/destroy_bitmap" target="_blank"><span class="a">destroy_bitmap</span></a><span class="k2">(</span>buffer<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">121</td><td>&#160;</td></tr><tr><td class="number">122</td><td>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">123</td><td><span class="k2">}</span></td></tr><tr><td class="number">124</td><td><a href="http://www.allegro.cc/manual/END_OF_MAIN" target="_blank"><span class="a">END_OF_MAIN</span></a><span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">125</td><td>&#160;</td></tr><tr><td class="number">126</td><td><span class="k1">void</span> particle_init<span class="k2">(</span>PARTICLE <span class="k3">*</span>p<span class="k2">)</span></td></tr><tr><td class="number">127</td><td><span class="k2">{</span></td></tr><tr><td class="number">128</td><td>    p-&gt;x <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">129</td><td>    p-&gt;y <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">130</td><td>    p-&gt;dx <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">131</td><td>    p-&gt;dy <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">132</td><td>    p-&gt;alive <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">133</td><td><span class="k2">}</span></td></tr><tr><td class="number">134</td><td>&#160;</td></tr><tr><td class="number">135</td><td>PARTICLE particle_create<span class="k2">(</span><span class="k1">float</span> _x, <span class="k1">float</span> _y<span class="k2">)</span></td></tr><tr><td class="number">136</td><td><span class="k2">{</span></td></tr><tr><td class="number">137</td><td>    PARTICLE p<span class="k2">;</span></td></tr><tr><td class="number">138</td><td>    p.x <span class="k3">=</span> _x<span class="k2">;</span></td></tr><tr><td class="number">139</td><td>    p.y <span class="k3">=</span> _y<span class="k2">;</span></td></tr><tr><td class="number">140</td><td>    p.dx <span class="k3">=</span> <span class="k2">(</span><span class="k2">(</span><span class="k1">float</span><span class="k2">)</span><span class="k2">(</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span> % <span class="n">101</span><span class="k2">)</span> <span class="k3">-</span> <span class="n">50</span><span class="k2">)</span><span class="k2">)</span> <span class="k3">/</span> <span class="n">10</span><span class="k2">;</span></td></tr><tr><td class="number">141</td><td>    p.dy <span class="k3">=</span> <span class="k2">(</span><span class="k2">(</span><span class="k1">float</span><span class="k2">)</span><span class="k2">(</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span> % <span class="n">101</span><span class="k2">)</span> <span class="k3">-</span> <span class="n">50</span><span class="k2">)</span><span class="k2">)</span> <span class="k3">/</span> <span class="n">10</span><span class="k2">;</span></td></tr><tr><td class="number">142</td><td>    p.alive <span class="k3">=</span> <span class="n">255</span><span class="k2">;</span></td></tr><tr><td class="number">143</td><td>    <span class="k1">return</span> p<span class="k2">;</span></td></tr><tr><td class="number">144</td><td><span class="k2">}</span></td></tr><tr><td class="number">145</td><td>&#160;</td></tr><tr><td class="number">146</td><td><span class="k1">void</span> particle_update<span class="k2">(</span>PARTICLE <span class="k3">*</span>p<span class="k2">)</span></td></tr><tr><td class="number">147</td><td><span class="k2">{</span></td></tr><tr><td class="number">148</td><td>    <span class="k1">if</span> <span class="k2">(</span>p-&gt;alive <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">149</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">150</td><td>        p-&gt;dy <span class="k3">+</span><span class="k3">=</span> .<span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">151</td><td>        p-&gt;x <span class="k3">+</span><span class="k3">=</span> p-&gt;dx<span class="k2">;</span></td></tr><tr><td class="number">152</td><td>        p-&gt;y <span class="k3">+</span><span class="k3">=</span> p-&gt;dy<span class="k2">;</span></td></tr><tr><td class="number">153</td><td>        p-&gt;alive--<span class="k2">;</span></td></tr><tr><td class="number">154</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">155</td><td><span class="k2">}</span></td></tr><tr><td class="number">156</td><td>&#160;</td></tr><tr><td class="number">157</td><td><span class="k1">void</span> particle_render<span class="k2">(</span>PARTICLE p, <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>buffer<span class="k2">)</span></td></tr><tr><td class="number">158</td><td><span class="k2">{</span></td></tr><tr><td class="number">159</td><td>    <span class="k1">if</span> <span class="k2">(</span>p.alive <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">160</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">161</td><td>        <a href="http://www.allegro.cc/manual/putpixel" target="_blank"><span class="a">putpixel</span></a><span class="k2">(</span>buffer, p.x, p.y, <a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</span></a><span class="k2">(</span>p.alive, p.alive, p.alive<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">162</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">163</td><td><span class="k2">}</span></td></tr><tr><td class="number">164</td><td>&#160;</td></tr><tr><td class="number">165</td><td><span class="k1">void</span> manager_init<span class="k2">(</span>PARTICLE <span class="k3">*</span>particle, <span class="k1">int</span> count<span class="k2">)</span></td></tr><tr><td class="number">166</td><td><span class="k2">{</span></td></tr><tr><td class="number">167</td><td>    <span class="k1">int</span> c<span class="k2">;</span></td></tr><tr><td class="number">168</td><td>    <span class="k1">for</span> <span class="k2">(</span>c <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> c <span class="k3">&lt;</span> count<span class="k2">;</span> c<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">169</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">170</td><td>        particle_init<span class="k2">(</span><span class="k3">&amp;</span>particle<span class="k2">[</span>c<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">171</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">172</td><td><span class="k2">}</span></td></tr><tr><td class="number">173</td><td>&#160;</td></tr><tr><td class="number">174</td><td><span class="k1">void</span> manager_update<span class="k2">(</span>PARTICLE <span class="k3">*</span>particle, <span class="k1">int</span> count<span class="k2">)</span></td></tr><tr><td class="number">175</td><td><span class="k2">{</span></td></tr><tr><td class="number">176</td><td>    <span class="k1">int</span> c<span class="k2">;</span></td></tr><tr><td class="number">177</td><td>    <span class="k1">for</span> <span class="k2">(</span>c <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> c <span class="k3">&lt;</span> count<span class="k2">;</span> c<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">178</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">179</td><td>        particle_update<span class="k2">(</span><span class="k3">&amp;</span>particle<span class="k2">[</span>c<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">180</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">181</td><td><span class="k2">}</span></td></tr><tr><td class="number">182</td><td>&#160;</td></tr><tr><td class="number">183</td><td><span class="k1">void</span> manager_render<span class="k2">(</span>PARTICLE <span class="k3">*</span>particle, <span class="k1">int</span> count, <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>buffer<span class="k2">)</span></td></tr><tr><td class="number">184</td><td><span class="k2">{</span></td></tr><tr><td class="number">185</td><td>    <span class="k1">int</span> c<span class="k2">;</span></td></tr><tr><td class="number">186</td><td>    <span class="k1">for</span> <span class="k2">(</span>c <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> c <span class="k3">&lt;</span> count<span class="k2">;</span> c<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">187</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">188</td><td>        particle_render<span class="k2">(</span>particle<span class="k2">[</span>c<span class="k2">]</span>, buffer<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">189</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">190</td><td><span class="k2">}</span></td></tr><tr><td class="number">191</td><td>&#160;</td></tr><tr><td class="number">192</td><td><span class="k1">void</span> manager_insert<span class="k2">(</span>PARTICLE <span class="k3">*</span>particle, <span class="k1">int</span> count, PARTICLE p<span class="k2">)</span></td></tr><tr><td class="number">193</td><td><span class="k2">{</span></td></tr><tr><td class="number">194</td><td>    <span class="k1">int</span> c<span class="k2">;</span></td></tr><tr><td class="number">195</td><td>    <span class="k1">int</span> oldest <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">196</td><td>    <span class="k1">for</span> <span class="k2">(</span>c <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> c <span class="k3">&lt;</span> count<span class="k2">;</span> c<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">197</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">198</td><td>        <span class="k1">if</span> <span class="k2">(</span>particle<span class="k2">[</span>c<span class="k2">]</span>.alive <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">199</td><td>        <span class="k2">{</span></td></tr><tr><td class="number">200</td><td>            particle<span class="k2">[</span>c<span class="k2">]</span> <span class="k3">=</span> p<span class="k2">;</span></td></tr><tr><td class="number">201</td><td>            <span class="k1">return</span><span class="k2">;</span></td></tr><tr><td class="number">202</td><td>        <span class="k2">}</span></td></tr><tr><td class="number">203</td><td>        <span class="k1">if</span> <span class="k2">(</span>particle<span class="k2">[</span>c<span class="k2">]</span>.alive <span class="k3">&lt;</span> particle<span class="k2">[</span>oldest<span class="k2">]</span>.alive<span class="k2">)</span></td></tr><tr><td class="number">204</td><td>            oldest <span class="k3">=</span> c<span class="k2">;</span></td></tr><tr><td class="number">205</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">206</td><td>    particle<span class="k2">[</span>oldest<span class="k2">]</span> <span class="k3">=</span> p<span class="k2">;</span></td></tr><tr><td class="number">207</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Timorg)</author>
		<pubDate>Sat, 02 Aug 2008 12:22:23 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Schyfis said:</div><div class="quote"><p>
malloc(sizeof(particle));
</p></div></div><p>Why use malloc when you&#39;re using c++, why use doubles? you don&#39;t seem to have the ability to end the life of a particle, or group particles together as distinct units, or reuse the memory for new particles.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Walker)</author>
		<pubDate>Sat, 02 Aug 2008 18:29:40 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Why use malloc when you&#39;re using c++, why use doubles? you don&#39;t seem to have the ability to end the life of a particle, or group particles together as distinct units, or reuse the memory for new particles.
</p></div></div><p>

Because it&#39;s a simple example, I didn&#39;t include anything for deleting particles, but you could easily give each particle a lifetime and do something like this:
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="c">//a function to remove particles that have died</span></td></tr><tr><td class="number">2</td><td><span class="k1">void</span> removeDeadParticles<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">3</td><td>  <span class="c">//set up a vector of particles that are still alive</span></td></tr><tr><td class="number">4</td><td>  vector<span class="k3">&lt;</span>particle<span class="k3">*</span><span class="k3">&gt;</span> alive<span class="k2">;</span></td></tr><tr><td class="number">5</td><td>  <span class="k1">for</span><span class="k2">(</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>particles.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></td></tr><tr><td class="number">6</td><td>    <span class="c">//decrement each particle's life</span></td></tr><tr><td class="number">7</td><td>    <span class="k2">(</span><span class="k3">*</span>particles.at<span class="k2">(</span>i<span class="k2">)</span><span class="k2">)</span>.life--<span class="k2">;</span></td></tr><tr><td class="number">8</td><td>    <span class="k1">if</span><span class="k2">(</span><span class="k2">(</span><span class="k3">*</span>particles.at<span class="k2">(</span>i<span class="k2">)</span><span class="k2">)</span>.life<span class="k3">&lt;</span><span class="k3">=</span><span class="n">0</span><span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">9</td><td>      <span class="c">//if the particle is dead, free the memory</span></td></tr><tr><td class="number">10</td><td>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_350.html" target="_blank">free</a><span class="k2">(</span>particles.at<span class="k2">(</span>i<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">11</td><td>    <span class="k2">}</span><span class="k1">else</span><span class="k2">{</span></td></tr><tr><td class="number">12</td><td>      <span class="c">//if the particle is still alive, put it in the alive vector</span></td></tr><tr><td class="number">13</td><td>      alive.push_back<span class="k2">(</span>particles.at<span class="k2">(</span>i<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">14</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">15</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">16</td><td>  <span class="c">//change the contents of vector particles to the contents of vector alive</span></td></tr><tr><td class="number">17</td><td>  particles.assign<span class="k2">(</span>alive.begin<span class="k2">(</span><span class="k2">)</span>,alive.end<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
What would you recommend for my example other than malloc? I&#39;m still working with my first project that uses structures, so I&#39;m still quite new to the various uses of malloc, new, free, and delete. You should be able to malloc or new a structure, right?<br />As for the doubles, feel free to use floats. That would take up less memory, right?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Schyfis)</author>
		<pubDate>Sat, 02 Aug 2008 21:48:36 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The thing is new and delete are part of C++, that is memory allocation and freeing are part of the language, when in C (malloc and free), they are provided by the system library.</p><p>When you use new it calls that class constructor if there is one, and delete calls the destructor. If new for some reason can&#39;t allocate the memory, the default action is to throw an exception, where malloc just returns a NULL pointer.</p><p>You can use malloc to allocate an area in memory for a struct, but you can&#39;t really use it to create a class on the heap.</p><p>(AFAIK you can use malloc, then manually call the constructor, then manually call the destructor before freeing it, but you are really asking for trouble if you go down that path.)</p><p>Edit:<br />and please for the love of whatever deity you follow, use -&gt; to dereference your pointers
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Timorg)</author>
		<pubDate>Sat, 02 Aug 2008 22:07:14 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I think there&#39;s a little miscommunication in this thread... as to the skill of the original poster (Op).</p><p>Not taking in account sound and keyboard input.. this is how I (self taught game dev) learned:</p><p>1-Create a program that draws a rectangle.<br />2-Then try to change it&#39;s color.<br />3-Then try to change it&#39;s color rapidly with a loop.<br />4-Once you&#39;ve got that then try to move it.<br />5-Then try to make it bounce off the edges of the screen.<br />6-Then fiddle around with random ideas like &quot;What if I make it change color everytime it bounces?&quot;<br />7-Then make an array of rectangles so you have 20 or more bouncing off the screen.<br />8-That should give you enough working knowledge to write your own particle explosion, starfields, etc.</p><p>I&#39;m curious, which step is the OP at? :p
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Idealius)</author>
		<pubDate>Sun, 03 Aug 2008 01:15:56 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>What is the specific task the OP is having trouble with?</p><p>Idealius: your example fails. It took me less than a day to learn how to bounce rectangles around on the screen. Ok, I used circles instead of rectangles, but it&#39;s the same thing. A particle explosion is much different.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Black)</author>
		<pubDate>Sun, 03 Aug 2008 01:24:01 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You&#39;re probably right as I learned on Qbasic long before Allegro ever existed..<br />And computers were less mainstream back then, too.</p><p>I guess I&#39;m just wondering if the OP has a basic understanding of arrays. Once you have that a particle explosion should be easy to create.</p><p>Of course creating, tracking, and deleting it as an object is another layer of complexity..</p><p>kudos to circles =)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Idealius)</author>
		<pubDate>Sun, 03 Aug 2008 01:57:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I learned in QBASIC too!</p><p>My biggest problem with a particle explosion was always the random direction thing. I could make things go up, down, left, right, or at a 45 degree angle to any of those, but it wasn&#39;t until just recently that I learned how to make things go in any direction. I still have trouble with particle effects, though.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Black)</author>
		<pubDate>Sun, 03 Aug 2008 02:06:27 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Oh cool. I guess I just assumed you started on Allegro.</p><p>Yeah I think I bridged that gap by using float&#39;s instead of int&#39;s for the particle&#39;s coords and deltas. And of course knowing how to make a random value that can be negative OR positive helped, too..</p><p>Then there are more complex ways to do it, by giving the particles&#39; starting points based on the shape of a circle so when they travel the same basic circular plot is maintained.. like fireworks.</p><p>..using vectors (not the class)..etc. Ah memories. Thanks..
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Idealius)</author>
		<pubDate>Sun, 03 Aug 2008 02:32:24 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I began working with 2d environments a little over 2 weeks ago. Before that, it was all text, learning for and while loops, arrays, etc, etc, all the basics. I&#39;m still not that familiar with implementing physics for objects in 2d. I made a bouncy ball program but I&#39;m pretty sure I cheated.</p><p>I&#39;d say I&#39;m probably around step 5.</p><p>I&#39;m going to try out some of the examples posted here, although I can already tell that it may be difficult for me to understand. I&#39;ll post back later with how I did.</p><p>Thanks for all the replies! <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /> I woke up this morning and was like, &quot;Whoa! 17 replies!!&quot; <img src="http://www.allegro.cc/forums/smileys/cheesy.gif" alt=":D" /></p><p>----------</p><p>I can&#39;t seem to figure out how to add a post right after my last post, so I&#39;m just going to use the &quot;minus bar&quot; and edit this post. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /></p><p>Schyfis, I tried out your code and I threw together a working program below (oh yeah, I don&#39;t know how to put it in a cool code window). I&#39;m a little confused about it though, mainly this line:</p><p>particle* p = (particle*)malloc(sizeof(particle));</p><p>This allocates memory for each particle in the vector, am I right? But, why is it necessary to do this? Is it because particle p has been declared as a pointer? And if so, why not just directly declare p as not a pointer? Full working program below:</p><p>#include &lt;allegro.h&gt;<br />#include &lt;ctime&gt;<br />#include &lt;math.h&gt;<br />#include &lt;vector&gt;</p><p>using namespace std;</p><p>BITMAP* buffer;</p><p>//define a particle structure<br />typedef struct particle {<br />	//we&#39;ll need an x and y position for each particle<br />	int x, y;<br />	//the particles are going to be moving,<br />	//so here&#39;s x velocity and y velocity<br />	int xvel, yvel;<br />	//let&#39;s also keep track of the old<br />	//x and y positions so we can draw the<br />	//particles as lines instead of just points<br />	int oldx, oldy;<br />};<br />//create a vector of pointers to particles (kind of like an array)<br />vector &lt;particle*&gt; particles;<br />/*<br />explode: a function to make a particle explosion<br />parameters:<br />	x: the horizontal position of the explosion&#39;s center<br />	y: the vertical position of the explosion&#39;s center<br />	num: number of particles in the explosion<br />*/<br />void explode(int x, int y, int num) {<br />	//initializes the random number generator with the current time as the seed<br />	srand(time(0));<br />	//for loop to create num particles<br />	for(int i=0; i&lt;num; i++) {<br />		//allocates memory for our new particle<br />		//note that this is a pointer to a particle, not the particle itself<br />		particle* p = (particle*)malloc(sizeof(particle));<br />		//set x, y, oldx, and oldy to the center of the explosion<br />		(*p).x = (*p).oldx = x;<br />		(*p).y = (*p).oldy = y;<br />		//set xvel and yvel to random numbers between -4 and 4<br />		(*p).xvel=rand()%64-rand()%64;<br />		(*p).yvel=rand()%64-rand()%64;<br />//      (*p).xvel=-1;<br />//      (*p).yvel=0;<br />		//add the particle pointer to our vector<br />		particles.push_back(p);<br />	}<br />}<br />/*<br />stepParticles: a function to step the particles through one frame of movement<br />parameters: none<br />notes:<br />	-call this function every time you go through your game loop.<br />	-remember that particles is a vector of pointers, so you have to dereference them!<br />*/<br />void stepParticles(){<br />	//iterate through our vector of particle pointers<br />	//particles.size() gets the total number of elements in the vector<br />	for(int i=0; i&lt;particles.size(); i++){<br />		//set oldx and oldy to the current values of x and y<br />		(*particles.at(i)).oldx=(*particles.at(i)).x;<br />		(*particles.at(i)).oldy=(*particles.at(i)).y;<br />		//now we add xvel and yvel to x and y so the particles move<br />		(*particles.at(i)).x+=(*particles.at(i)).xvel;<br />		(*particles.at(i)).y+=(*particles.at(i)).yvel;<br />	}<br />}<br />/*<br />drawParticles: a function to draw the particles on the screen<br />parameters: none<br />notes: call this function every time you go through your game loop.<br />*/<br />void drawParticles() {<br />	//iterate through the vector like last time<br />	for(int i=0; i&lt;particles.size(); i++){<br />		//you&#39;ll have to have a BITMAP named buffer for this to work,<br />		//assuming you&#39;re double buffering<br />		line(buffer,<br />			(*particles.at(i)).x, (*particles.at(i)).y,<br />			(*particles.at(i)).oldx, (*particles.at(i)).oldy,<br />			makecol(255,127,0));<br />		//it spans many lines to make it easier to read<br />	}<br />}</p><p>int main(){<br />    allegro_init();<br />    install_keyboard();<br />    set_gfx_mode(GFX_AUTODETECT_WINDOWED,640,480,0,0);<br />    set_color_depth(32);<br />    <br />    buffer = create_bitmap(640,480);</p><p>//    particle.x = 200;<br />//    particle.y = 200;<br />//    particle.xvel = 5;<br />//    particle.yvel = 5;</p><p>//an example of your game loop<br />while(!key[KEY_ESC]){<br />	clear_keybuf();<br />	if(key[KEY_SPACE]){</p><p>    	srand(time(0));<br />		//make explosion at random place on the screen<br />		//explode(rand()%SCREEN_W, rand()%SCREEN_H, 5);<br />		explode(300,240,100);<br />    }</p><p>    	clear(buffer);<br />    	stepParticles();<br />    	drawParticles();<br />    	blit(buffer,screen,0,0,0,0,buffer-&gt;w,buffer-&gt;h);</p><p>    <br />    rest(20);<br />	<br />}<br />}<br />END_OF_MAIN();
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (yohosuff)</author>
		<pubDate>Sun, 03 Aug 2008 04:48:01 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>To put code into the codebox just put [code] and [/code] around it.</p><p>The particles are declared as a pointer so they can be allocated on the heap(correct me if I&#39;m wrong). This way they can be deleted. The stack is what items are declared on if you don&#39;t allocate memory, and it is hard to delete them off of it. The stack will also go out of scope. Ex:
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">int</span><span class="k3">*</span> return_stack<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span>
<span class="k2">{</span>
   <span class="k1">int</span> number <span class="k3">=</span> <span class="n">10</span><span class="k2">;</span> <span class="c">//declare on stack, valid now</span>
   <span class="k1">return</span> <span class="k3">&amp;</span>number<span class="k2">;</span> <span class="c">//return address of number</span>
<span class="k2">}</span><span class="k2">;</span>

<span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span>
<span class="k2">{</span>
   <span class="k1">int</span><span class="k3">*</span> p_num<span class="k2">;</span>
   p_num <span class="k3">=</span> return_stack<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="c">//number goes out of scope,</span>
   <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%d"</span>,<span class="k3">*</span>p_num<span class="k2">)</span><span class="k2">;</span> <span class="c">//causing p_num to be some random value</span>
<span class="k2">}</span>
</pre></div></div><p>
 The heap is where memory that was allocated by malloc or new resides. It doesn&#39;t go out of scope Ex:
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">int</span><span class="k3">*</span> return_stack<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span>
<span class="k2">{</span>
   <span class="k1">int</span><span class="k3">*</span> number <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k3">*</span><span class="k2">)</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_551.html" target="_blank">malloc</a><span class="k2">(</span><span class="k1">sizeof</span><span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span> <span class="c">//declare on heap, valid now</span>
   <span class="k3">*</span>number <span class="k3">=</span> <span class="n">10</span><span class="k2">;</span>
   <span class="k1">return</span> number<span class="k2">;</span> <span class="c">//return address pointed to by number</span>
<span class="k2">}</span><span class="k2">;</span>

<span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span>
<span class="k2">{</span>
   <span class="k1">int</span><span class="k3">*</span> p_num<span class="k2">;</span>
   p_num <span class="k3">=</span> return_stack<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="c">//number doesn't go out of scope,</span>
   <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%d"</span>,<span class="k3">*</span>p_num<span class="k2">)</span><span class="k2">;</span> <span class="c">//causing it to stay 10</span>
   <span class="c">//deallocate it (forgot the code)</span>
<span class="k2">}</span>
</pre></div></div><p>
Always be sure to deallocate memory or there will be a memory leak.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (someone972)</author>
		<pubDate>Sun, 03 Aug 2008 08:36:28 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks someone972, for showing me how to do the code thing. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /></p><p>By the way, what&#39;s a memory leak?</p><p>I&#39;ll play around with the particles for a while a post back if I run into more trouble with it. Thanks for all the help everyone! <img src="http://www.allegro.cc/forums/smileys/cheesy.gif" alt=":D" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (yohosuff)</author>
		<pubDate>Sun, 03 Aug 2008 11:07:10 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Memory leak occurs when allocated memory is not freed when you&#39;re done with it.<br />Example relevant is when you keep creating more particles but never free any, then the old particles stay in memory, and when you have reused the the old pointers to point to the new particles you have no way to access the old particles, they have leaked out of your control.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trezker)</author>
		<pubDate>Sun, 03 Aug 2008 11:16:19 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
By the way, what&#39;s a memory leak?
</p></div></div><p>
Whenever you allocate memory, either using <b>malloc</b> (plain C) or <b>new</b> (C++), you are putting your hands around a bit of memory that can&#39;t be used for anything else.  It is good practice to deallocate anything you allocate, either using <b>free</b> (plain C) or <b>delete</b> (C++).  Most OS (that is, I believe it is the OS that does this), deallocates memory on the program&#39;s exit.  However, it&#39;s still good practice to do it yourself, and if you are allocating memory for things that only exist for a moment in your program, you are wasting memory and this can cause the entire computer to run out.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Onewing)</author>
		<pubDate>Sun, 03 Aug 2008 11:20:17 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks for the explanations. I understand memory leaks now. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (yohosuff)</author>
		<pubDate>Sun, 03 Aug 2008 13:09:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I managed to make a little explosion too. I&#39;m quite proud of it. I&#39;d probably use it in combination with an animation of an explosion in the center.</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="p">#include &lt;math.h&gt;</span></td></tr><tr><td class="number">2</td><td><span class="p">#include &lt;allegro.h&gt;</span></td></tr><tr><td class="number">3</td><td>&#160;</td></tr><tr><td class="number">4</td><td><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span> buffer<span class="k2">;</span></td></tr><tr><td class="number">5</td><td>&#160;</td></tr><tr><td class="number">6</td><td><span class="k1">struct</span> Particle_Type</td></tr><tr><td class="number">7</td><td><span class="k2">{</span></td></tr><tr><td class="number">8</td><td>  <span class="k1">double</span> x<span class="k2">;</span></td></tr><tr><td class="number">9</td><td>  <span class="k1">double</span> y<span class="k2">;</span></td></tr><tr><td class="number">10</td><td>  <span class="k1">double</span> speed<span class="k2">;</span></td></tr><tr><td class="number">11</td><td>  <span class="k1">double</span> angle<span class="k2">;</span></td></tr><tr><td class="number">12</td><td>  <span class="k1">int</span> life<span class="k2">;</span></td></tr><tr><td class="number">13</td><td><span class="k2">}</span>Particles<span class="k2">[</span><span class="n">150</span><span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">14</td><td>&#160;</td></tr><tr><td class="number">15</td><td><span class="k1">double</span> Max_Angle <span class="k3">=</span> <span class="n">2</span> <span class="k3">*</span> <span class="n">3</span>.<span class="n">14159</span><span class="k2">;</span></td></tr><tr><td class="number">16</td><td>&#160;</td></tr><tr><td class="number">17</td><td><span class="k1">void</span> Draw_Stuff<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">18</td><td><span class="k2">{</span></td></tr><tr><td class="number">19</td><td>  <a href="http://www.allegro.cc/manual/clear_to_color" target="_blank"><span class="a">clear_to_color</span></a><span class="k2">(</span>buffer, <a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</span></a><span class="k2">(</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="k2">;</span></td></tr><tr><td class="number">20</td><td>  <span class="k1">for</span><span class="k2">(</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> <span class="n">150</span><span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">21</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">22</td><td>    <span class="k1">if</span><span class="k2">(</span>Particles<span class="k3">&lt;</span>i&gt;.life<span class="k2">)</span></td></tr><tr><td class="number">23</td><td>    <span class="k2">{</span>  </td></tr><tr><td class="number">24</td><td>      <a href="http://www.allegro.cc/manual/putpixel" target="_blank"><span class="a">putpixel</span></a><span class="k2">(</span>buffer, Particles<span class="k3">&lt;</span>i&gt;.x, Particles<span class="k3">&lt;</span>i&gt;.y, <a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</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="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">25</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">26</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">27</td><td>  <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>buffer, <a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">640</span>, <span class="n">480</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">28</td><td><span class="k2">}</span></td></tr><tr><td class="number">29</td><td>&#160;</td></tr><tr><td class="number">30</td><td><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">31</td><td><span class="k2">{</span></td></tr><tr><td class="number">32</td><td>  <a href="http://www.allegro.cc/manual/allegro_init" target="_blank"><span class="a">allegro_init</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">33</td><td>  <a href="http://www.allegro.cc/manual/install_keyboard" target="_blank"><span class="a">install_keyboard</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">34</td><td>  <a href="http://www.allegro.cc/manual/set_color_depth" target="_blank"><span class="a">set_color_depth</span></a><span class="k2">(</span><span class="n">16</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">35</td><td>  <a href="http://www.allegro.cc/manual/set_gfx_mode" target="_blank"><span class="a">set_gfx_mode</span></a><span class="k2">(</span> GFX_AUTODETECT_WINDOWED, <span class="n">640</span>, <span class="n">480</span>, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">36</td><td>  </td></tr><tr><td class="number">37</td><td>  buffer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/create_bitmap" target="_blank"><span class="a">create_bitmap</span></a><span class="k2">(</span><span class="n">640</span>, <span class="n">480</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">38</td><td>  </td></tr><tr><td class="number">39</td><td>  <span class="k1">while</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_ESC<span class="k2">]</span><span class="k2">)</span></td></tr><tr><td class="number">40</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">41</td><td>    <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_SPACE<span class="k2">]</span><span class="k2">)</span></td></tr><tr><td class="number">42</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">43</td><td>      <span class="k1">for</span><span class="k2">(</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> <span class="n">150</span><span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">44</td><td>      <span class="k2">{</span></td></tr><tr><td class="number">45</td><td>        Particles<span class="k3">&lt;</span>i&gt;.x <span class="k3">=</span> <span class="n">320</span>.<span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">46</td><td>        Particles<span class="k3">&lt;</span>i&gt;.y <span class="k3">=</span> <span class="n">240</span>.<span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">47</td><td>        Particles<span class="k3">&lt;</span>i&gt;.speed <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span> % <span class="n">10</span> <span class="k3">+</span> <span class="n">5</span><span class="k2">;</span></td></tr><tr><td class="number">48</td><td>        Particles<span class="k3">&lt;</span>i&gt;.angle <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span> % <span class="n">360</span> <span class="k3">+</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">49</td><td>        Particles<span class="k3">&lt;</span>i&gt;.angle <span class="k3">=</span> Particles<span class="k3">&lt;</span>i&gt;.angle <span class="k3">*</span> <span class="n">3</span>.<span class="n">14159</span> <span class="k3">/</span> <span class="n">180</span><span class="k2">;</span></td></tr><tr><td class="number">50</td><td>        Particles<span class="k3">&lt;</span>i&gt;.life <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span> % <span class="n">10</span> <span class="k3">+</span> <span class="n">10</span><span class="k2">;</span></td></tr><tr><td class="number">51</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">52</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">53</td><td>    <span class="k1">for</span><span class="k2">(</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> <span class="n">150</span><span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">54</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">55</td><td>      <span class="k1">if</span><span class="k2">(</span>Particles<span class="k3">&lt;</span>i&gt;.life <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">56</td><td>      <span class="k2">{</span></td></tr><tr><td class="number">57</td><td>        Particles<span class="k3">&lt;</span>i&gt;.x <span class="k3">+</span><span class="k3">=</span> Particles<span class="k3">&lt;</span>i&gt;.speed <span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_113.html" target="_blank">cos</a><span class="k2">(</span>Particles<span class="k3">&lt;</span>i&gt;.angle<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">58</td><td>        Particles<span class="k3">&lt;</span>i&gt;.y <span class="k3">+</span><span class="k3">=</span> Particles<span class="k3">&lt;</span>i&gt;.speed <span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_728.html" target="_blank">sin</a><span class="k2">(</span>Particles<span class="k3">&lt;</span>i&gt;.angle<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">59</td><td>        Particles<span class="k3">&lt;</span>i&gt;.life--<span class="k2">;</span></td></tr><tr><td class="number">60</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">61</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">62</td><td>    Draw_Stuff<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">63</td><td>    <a href="http://www.allegro.cc/manual/rest" target="_blank"><span class="a">rest</span></a><span class="k2">(</span><span class="n">50</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">64</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">65</td><td>  <a href="http://www.allegro.cc/manual/destroy_bitmap" target="_blank"><span class="a">destroy_bitmap</span></a><span class="k2">(</span>buffer<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">66</td><td>  <a href="http://www.allegro.cc/manual/allegro_exit" target="_blank"><span class="a">allegro_exit</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">67</td><td><span class="k2">}</span></td></tr><tr><td class="number">68</td><td><a href="http://www.allegro.cc/manual/END_OF_MAIN" target="_blank"><span class="a">END_OF_MAIN</span></a><span class="k2">(</span><span class="k2">)</span></td></tr></tbody></table></div></div><p>

I get this warning whenever I compile, I know it&#39;s because I&#39;m passing doubles to putpixel() but I don&#39;t know how to fix it.</p><p><span class="source-code"><span class="k2">[</span>Warning<span class="k2">]</span> passing <span class="s">'double'</span> <span class="k1">for</span> converting <span class="n">2</span> of <span class="s">'void putpixel(BITMAP*, int, int, int)'</span></span>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Black)</author>
		<pubDate>Tue, 05 Aug 2008 05:00:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>That is an awesome particle explosion! <img src="http://www.allegro.cc/forums/smileys/cheesy.gif" alt=":D" /> Also, the code is easy to understand even without the blue little helpy helpers. <img src="http://www.allegro.cc/forums/smileys/grin.gif" alt=";D" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (yohosuff)</author>
		<pubDate>Tue, 05 Aug 2008 05:11:04 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I make my code easy to understand because the more compleximacated stuff makes me think. And I&#39;m too damn tired to think right now.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Black)</author>
		<pubDate>Tue, 05 Aug 2008 05:15:27 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Neil: It runs too fast on my q6600 quad core. It seems even if you didn&#39;t program it for multi core systems, X gets its own core as well <img src="http://www.allegro.cc/forums/smileys/shocked.gif" alt=":o" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Tue, 05 Aug 2008 05:38:52 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>SILENCE!</p><p>I was too lazy to implement real timing... would it work right if I used timing instead of rest()? If I had it in a game I&#39;d do it properly.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Black)</author>
		<pubDate>Tue, 05 Aug 2008 05:42:06 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Heh, I&#39;m just bugging you.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Tue, 05 Aug 2008 05:42:41 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
I get this warning whenever I compile, I know it&#39;s because I&#39;m passing doubles to putpixel() but I don&#39;t know how to fix it.</p><p>[Warning] passing &#39;double&#39; for converting 2 of &#39;void putpixel(BITMAP*, int, int, int)&#39;
</p></div></div><p>
C++ uses strong static typing, which means that you need to pass arguments with the correct types.<br />Some implicit conversions are allowed (i.e., you can assign a value of type A to a variable of type B), but if the conversion can lead to loss of precision (e.g. double -&gt; int), the compiler throws a warning. You need to explicitly cast to tell the compiler that you know what you&#39;re doing:
</p><div class="source-code snippet"><div class="inner"><pre><a href="http://www.allegro.cc/manual/putpixel" target="_blank"><span class="a">putpixel</span></a><span class="k2">(</span>buffer, <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>Particles<span class="k3">&lt;</span>i&gt;.x, <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>Particles<span class="k3">&lt;</span>i&gt;.y, <a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</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="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
Note that this produces a sub-pixel inaccuracy around 0, because the default cast rounds towards 0 (negative numbers round up, positive ones round down). Objects crossing the x or y axis will experience a tiny glitch. You can use libm&#39;s floor() function to avoid this:
</p><div class="source-code snippet"><div class="inner"><pre><a href="http://www.allegro.cc/manual/putpixel" target="_blank"><span class="a">putpixel</span></a><span class="k2">(</span>buffer, <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_330.html" target="_blank">floor</a><span class="k2">(</span>Particles<span class="k3">&lt;</span>i&gt;.x<span class="k2">)</span>, <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_330.html" target="_blank">floor</a><span class="k2">(</span>Particles<span class="k3">&lt;</span>i&gt;.y<span class="k2">)</span>, <a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</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="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Tobias Dammers)</author>
		<pubDate>Tue, 05 Aug 2008 15:18:45 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
C++ uses strong static typing
</p></div></div><p>

Type system war!!!! :-)</p><p>C++ has a weak static type system, due to static_cast, reinterpret_cast and C-style casts.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (axilmar)</author>
		<pubDate>Tue, 05 Aug 2008 19:23:51 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>And what if those casts didn&#39;t exist? I figure much worse... <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (imaxcs)</author>
		<pubDate>Wed, 06 Aug 2008 00:58:56 +0000</pubDate>
	</item>
</rss>
