<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Particle engine</title>
		<link>http://www.allegro.cc/forums/view/592121</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Tue, 03 Jul 2007 16:24:14 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ok, here&#39;s the deal. I need an open-source particle engine that really rocks. I honestly can&#39;t be assed to do the programming because I have tried before and the math just never works out. So I wanted to ask if anyone knows of an open-source particle engine, preferably with scriptable particle types. Who ever has written one, and hasn&#39;t abandoned it or left it half-finished, will be given full credit for his/her work.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (The Master)</author>
		<pubDate>Sun, 01 Jul 2007 11:42:06 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Maybe <a href="http://www.talula.demon.co.uk/egg/index.html">this</a>? I don&#39;t think that it&#39;s really what you want but it may give you leads.</p><p>Honestly, particle effects are easy to do...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Archon)</author>
		<pubDate>Sun, 01 Jul 2007 13:52:34 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Was that written with allegro? or does it use a different base for graphics?</p><p>I&#39;m not terribly good at those sorts of things. And anyway, if I can get a particle engine that&#39;s customisable and works with allegro, it takes another entry off my long list of headaches with writting a good RPG engine.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (The Master)</author>
		<pubDate>Sun, 01 Jul 2007 14:01:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I agree with Archon. Particle effects are not that difficult, unless you are modeling something really complex. Perhaps it would help us understand your problem if you described what you wanted to model with these particles.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Wilson Saunders)</author>
		<pubDate>Sun, 01 Jul 2007 21:16:59 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Look at me - I scream NOOB.</p><p>I&#39;ve just put a rockin&#39; particle system into my game, and it took me about an hour. Trust me and the other guys - it is not difficult. You don&#39;t have to worry about loads of maths - it just needs to look cool <img src="http://www.allegro.cc/forums/smileys/grin.gif" alt=";D" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (jamyskis)</author>
		<pubDate>Sun, 01 Jul 2007 21:47:08 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Aye. Most effects can be achieved using particles, particle emitters and particle &quot;affectors&quot; (attracting, repulsing, dampening etc). Emitters and affectors should be treated as game objects (so they can be moved though physics or by some other logic. Whatever really), while particles are usually best treated as a simple (non-oop) struct with position, velocity, life, type and possibly other things like colors, fade-type etc and functions like &quot;draw&quot;, &quot;update&quot; and &quot;addForce&quot;.</p><p>I handle it all like this; I have an object &quot;particleCollection&quot;, which has a list of the particles under it&#39;s control, together with the affectors used on them. <br />For each particle, each frame, it does: modifies the particles through the affectors, updates them (and resets and forces acting on it) and draws them.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Jonatan Hedborg)</author>
		<pubDate>Sun, 01 Jul 2007 21:48:00 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Damnit guys, now you made me want to make a particle system... <img src="http://www.allegro.cc/forums/smileys/angry.gif" alt="&gt;:(" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trezker)</author>
		<pubDate>Mon, 02 Jul 2007 01:21:49 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Perhaps it would help us understand your problem if you described what you wanted to model with these particles.
</p></div></div><p>

I want to be able to script battle animations. Rather than having hundreds of sprite images in the datafile that describe all said battle animations, I can just load a script defining the animation and render it on the fly. I&#39;ve had a look at EGG, and it seems to do what I&#39;m after.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
I handle it all like this; I have an object &quot;particleCollection&quot;, which has a list of the particles under it&#39;s control, together with the affectors used on them. <br />For each particle, each frame, it does: modifies the particles through the affectors, updates them (and resets and forces acting on it) and draws them.
</p></div></div><p>

Did you make a particle engine?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (The Master)</author>
		<pubDate>Mon, 02 Jul 2007 05:36:14 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Sort of, yeah. I could probably dig out (and clean up) the sources when i get a bit of free time. It has the basic functionality, but not many particle types or emitters.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Jonatan Hedborg)</author>
		<pubDate>Mon, 02 Jul 2007 07:45:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Don&#39;t worry about it. EGG is a starting point, and the code isn&#39;t too hard to read. I&#39;ll stick with that and expand on it. I just wanted the basic functionality taken care of.</p><p>Believe me, I&#39;ve been programming that RPG engine, and there are alot of modules to keep track of, and sometimes when I add a new one, bugs pop up in others. The more corners I can safely cut the better, hence why I was after a particle engine.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (The Master)</author>
		<pubDate>Mon, 02 Jul 2007 08:01:45 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Damnit guys, now you made me want to make a particle system... <img src="http://www.allegro.cc/forums/smileys/angry.gif" alt="&gt;:(" />
</p></div></div><p>

Hehe, ditto. I&#39;ve been considering it for a while, but I&#39;m just not far enough into development to set aside time for it yet, so I&#39;m leaving it as a dessert. <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kibiz0r)</author>
		<pubDate>Mon, 02 Jul 2007 11:11:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>try this :</p><p>header:</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">#ifndef _PARTICLE</span></td></tr><tr><td class="number">2</td><td><span class="p">#define _PARTICLE</span></td></tr><tr><td class="number">3</td><td>&#160;</td></tr><tr><td class="number">4</td><td><span class="p">#include "Engine.h"</span></td></tr><tr><td class="number">5</td><td>&#160;</td></tr><tr><td class="number">6</td><td><span class="k1">using</span> <span class="k1">namespace</span> ol<span class="k2">;</span></td></tr><tr><td class="number">7</td><td>&#160;</td></tr><tr><td class="number">8</td><td><span class="k1">void</span> init_particles<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">9</td><td>&#160;</td></tr><tr><td class="number">10</td><td>&#160;</td></tr><tr><td class="number">11</td><td><span class="k1">class</span> bsgParticle:public bsgSprite</td></tr><tr><td class="number">12</td><td><span class="k2">{</span></td></tr><tr><td class="number">13</td><td>public:</td></tr><tr><td class="number">14</td><td><span class="k1">int</span> m_nWait<span class="k2">;</span></td></tr><tr><td class="number">15</td><td><span class="k1">int</span> m_nCol<span class="k2">;</span></td></tr><tr><td class="number">16</td><td><span class="k1">int</span> m_nKind<span class="k2">;</span></td></tr><tr><td class="number">17</td><td><span class="k1">float</span> m_fLife<span class="k2">;</span></td></tr><tr><td class="number">18</td><td>&#160;</td></tr><tr><td class="number">19</td><td>bsgParticle<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td><span class="k1">virtual</span> ~bsgParticle<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">void</span> draw<span class="k2">(</span><span class="k1">int</span> a_nCameraX,<span class="k1">int</span> a_nCameraY<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td><span class="k1">void</span> do_ai<span class="k2">(</span><span class="k1">float</span> a_fLagCount<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td><span class="k2">}</span><span class="k2">;</span></td></tr><tr><td class="number">25</td><td>&#160;</td></tr><tr><td class="number">26</td><td><span class="p">#endif</span></td></tr></tbody></table></div></div><p>

implementation
</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><span class="p">#include "particle.h"</span></td></tr><tr><td class="number">3</td><td><span class="p">#include "AIdef.h"</span></td></tr><tr><td class="number">4</td><td>&#160;</td></tr><tr><td class="number">5</td><td>Rgba <span class="k3">*</span> pc_smoke<span class="k2">[</span><span class="n">255</span><span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">6</td><td>Rgba <span class="k3">*</span> pc_engine<span class="k2">[</span><span class="n">255</span><span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">7</td><td>Rgba <span class="k3">*</span> pc_engine2<span class="k2">[</span><span class="n">255</span><span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">8</td><td>&#160;</td></tr><tr><td class="number">9</td><td>&#160;</td></tr><tr><td class="number">10</td><td><span class="k1">void</span> init_particles<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">11</td><td><span class="k2">{</span></td></tr><tr><td class="number">12</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">256</span><span class="k2">;</span>i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">13</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">14</td><td>       pc_smoke<span class="k3">&lt;</span>i&gt;<span class="k3">=</span> <span class="k1">new</span> Rgba<span class="k2">(</span><span class="n">255</span>,<span class="n">255</span>,<span class="n">255</span>,i<span class="k2">)</span><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="k2">}</span></td></tr><tr><td class="number">17</td><td>&#160;</td></tr><tr><td class="number">18</td><td>&#160;</td></tr><tr><td class="number">19</td><td>bsgParticle::bsgParticle<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">20</td><td><span class="k2">{</span></td></tr><tr><td class="number">21</td><td>m_nKind<span class="k3">=</span>P_SMOKE<span class="k2">;</span></td></tr><tr><td class="number">22</td><td>m_nCol<span class="k3">=</span><span class="n">255</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td>m_fLife<span class="k3">=</span><span class="n">50</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td>m_nWait<span class="k3">=</span><span class="n">2</span><span class="k2">;</span></td></tr><tr><td class="number">25</td><td>m_fSpeed<span class="k3">=</span><span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td>m_nType<span class="k3">=</span>ID_NONE<span class="k2">;</span></td></tr><tr><td class="number">27</td><td>m_blCanCollide<span class="k3">=</span><span class="k1">false</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>&#160;</td></tr><tr><td class="number">31</td><td>bsgParticle::~bsgParticle<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">32</td><td><span class="k2">{</span></td></tr><tr><td class="number">33</td><td>&#160;</td></tr><tr><td class="number">34</td><td><span class="k2">}</span></td></tr><tr><td class="number">35</td><td>&#160;</td></tr><tr><td class="number">36</td><td>&#160;</td></tr><tr><td class="number">37</td><td><span class="k1">void</span> bsgParticle::do_ai<span class="k2">(</span><span class="k1">float</span> a_fLagCount<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>m_fLife-<span class="k3">=</span>a_fLagCount<span class="k2">;</span></td></tr><tr><td class="number">40</td><td>m_nCol<span class="k3">=</span><span class="k1">int</span><span class="k2">(</span>m_fLife<span class="k3">*</span><span class="n">4</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">41</td><td><span class="k1">if</span> <span class="k2">(</span>m_fLife<span class="k3">&lt;</span><span class="k3">=</span><span class="n">0</span><span class="k2">)</span> m_blDestroyed<span class="k3">=</span><span class="k1">true</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">void</span> bsgParticle::draw<span class="k2">(</span><span class="k1">int</span> a_nCameraX,<span class="k1">int</span> a_nCameraY<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><span class="k1">int</span> nDrawX<span class="k3">=</span><span class="k1">int</span><span class="k2">(</span>SCREENCENTER_X<span class="k3">+</span><span class="k2">(</span>m_fX-a_nCameraX<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">47</td><td><span class="k1">int</span> nDrawY<span class="k3">=</span><span class="k1">int</span><span class="k2">(</span>SCREENCENTER_Y<span class="k3">+</span><span class="k2">(</span>m_fY-a_nCameraY<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">48</td><td>&#160;</td></tr><tr><td class="number">49</td><td><span class="c">// only draw what we see</span></td></tr><tr><td class="number">50</td><td>&#160;</td></tr><tr><td class="number">51</td><td><span class="k1">if</span> <span class="k2">(</span><span class="k2">(</span>nDrawX&gt;<span class="k3">=</span><span class="k3">-</span><span class="n">100</span><span class="k2">)</span><span class="k3">&amp;</span><span class="k3">&amp;</span><span class="k2">(</span>nDrawY<span class="k3">&lt;</span><span class="n">900</span><span class="k2">)</span><span class="k3">&amp;</span><span class="k3">&amp;</span><span class="k2">(</span>nDrawY&gt;<span class="k3">=</span><span class="k3">-</span><span class="n">100</span><span class="k2">)</span><span class="k3">&amp;</span><span class="k3">&amp;</span><span class="k2">(</span>nDrawY<span class="k3">&lt;</span><span class="n">700</span><span class="k2">)</span><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">switch</span> <span class="k2">(</span>m_nKind<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">case</span> P_SMOKE:</td></tr><tr><td class="number">56</td><td>            GfxRend::Point<span class="k2">(</span> nDrawX, nDrawY, <span class="k3">*</span>pc_smoke<span class="k2">[</span>m_nCol<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">57</td><td>          <span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">58</td><td>&#160;</td></tr><tr><td class="number">59</td><td>          <span class="k1">case</span> <span class="n">2</span><span class="k2">:</span></td></tr><tr><td class="number">60</td><td>&#160;</td></tr><tr><td class="number">61</td><td>          <span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">62</td><td>&#160;</td></tr><tr><td class="number">63</td><td>          <span class="k1">case</span> <span class="n">3</span><span class="k2">:</span></td></tr><tr><td class="number">64</td><td>&#160;</td></tr><tr><td class="number">65</td><td>          <span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">66</td><td>          <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><span class="k2">}</span></td></tr></tbody></table></div></div><p>

This was grabbed from my game engine..<br />you could easily adapt it to your game
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Ariesnl)</author>
		<pubDate>Tue, 03 Jul 2007 16:24:14 +0000</pubDate>
	</item>
</rss>
