<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Special Effects</title>
		<link>http://www.allegro.cc/forums/view/564140</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Tue, 07 Feb 2006 12:09:37 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Maybe these are really general questions but I&#39;d really like to know how to make FUN special effects in games.</p><p>For a while I took a bitmap that looked like a pointy star with yellow filling on the inside and red filling on the outside and rendered different randomly angled rotations each frame for x number of frames to make an explosion, that looked ok.</p><p>I&#39;ve tried particles that shoot off every which way from a specific point for explosions, but I&#39;ve also seen cooler ones...</p><p>A good example is in the game Overgod (in the depot under action I think -- if you play this game, I recomend you turn off the sound) the graphics arn&#39;t anything exciting, but the expolosions and special effects look like they belong in a 3D game (and it&#39;s quite captivating)... how do you do that?</p><p>Are their articles on making cool particle effects/explosion rendering engines etc?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Michael Jensen)</author>
		<pubDate>Sun, 05 Feb 2006 03:26:17 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The explosions aren&#39;t usually rendered. But you could use the fire effect I use in the OL demo to create an explosion, too. Using explosion sprites would give better speed but less variation.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Fladimir da Gorf)</author>
		<pubDate>Sun, 05 Feb 2006 03:35:51 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ve made pretty decent looking fire and smoke effects before with sprites. I&#39;ll attach a screenshot of it (although it looks pretty bad when it&#39;s not animated...it looks very cool when it is, though).</p><p>All I did was have each particle raise up at between 85 and 95 degrees, with slightly random speed, slightly random colorization between yellow/red/orange, and would scale larger and become more transparent as it became &quot;older&quot;. Once it&#39;s alpha became &lt;= 0, it would be destroyed. As the particles were drawn, they would use the blender mode &quot;addition&quot; so that the flames seemed to combine with each other, rather than be drawn over top of each other.</p><p>Smoke was dome in a similar way, only it would spread out a lot more, and not be colorized.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elverion)</author>
		<pubDate>Sun, 05 Feb 2006 07:40:10 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Anyone have stuff on like nice flashy glowy things other than fire?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Ceagon Xylas)</author>
		<pubDate>Sun, 05 Feb 2006 12:01:50 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ve done all sorts of flashy-glowy stuff using pretty similar methods, such as &quot;magic glitter&quot; effects, explosions, object motion blur, lights, so on so on. Just minor tweeks here and there can make many different effects that way I mentioned earlier.</p><p>From google, I found what looks like a pretty promising particle tutorial.<br /><a href="http://awiki.tomasu.org/bin/view/Main/AllegroParticles">http://awiki.tomasu.org/bin/view/Main/AllegroParticles</a></p><p>And from NeHe:<br /><a href="http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=19">http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=19</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elverion)</author>
		<pubDate>Sun, 05 Feb 2006 12:48:07 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Here&#39;s my flame-thrower and napalm &#39;engine.&#39;<br /><span class="remote-thumbnail"><span class="json">{"name":"image21ah.gif","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/1\/4\/14d6ad50fd536d14bafc8ef5632e1b86.gif","w":484,"h":272,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/1\/4\/14d6ad50fd536d14bafc8ef5632e1b86"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/1/4/14d6ad50fd536d14bafc8ef5632e1b86-240.jpg" alt="image21ah.gif" width="240" height="134" /></span> <img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/5/b/5be661c585c2458bc4a030355c8d8bf0.gif" alt="image39tk.gif" width="168" height="204" /> <img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/5/c/5c94c0b5987e6242f5087f83da141942.gif" alt="image46sf.gif" width="160" height="131" /><br />Yeah, that&#39;s two bears...So lay off. My code looks like this [hopefully you&#39;ll be able to understand what&#39;s happening.]
</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">const</span> <span class="k1">int</span> MAX_FIRE<span class="k3">=</span><span class="n">1024</span><span class="k2">;</span></td></tr><tr><td class="number">2</td><td><span class="k1">int</span> fire_counter<span class="k3">=</span><span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">3</td><td>&#160;</td></tr><tr><td class="number">4</td><td>&#160;</td></tr><tr><td class="number">5</td><td><span class="k1">class</span> fire<span class="k2">{</span></td></tr><tr><td class="number">6</td><td>public:</td></tr><tr><td class="number">7</td><td>  <span class="k1">float</span> x,y,velX,velY<span class="k2">;</span> <span class="c">//obvious what these do</span></td></tr><tr><td class="number">8</td><td>  <span class="k1">short</span> life<span class="k2">;</span> <span class="c">//life of the fire 'particle'</span></td></tr><tr><td class="number">9</td><td>  <span class="k1">bool</span> visible<span class="k2">;</span> <span class="c">//weather or not it's visible</span></td></tr><tr><td class="number">10</td><td>&#160;</td></tr><tr><td class="number">11</td><td>  <span class="k1">void</span> deploy<span class="k2">(</span><span class="k1">short</span> x1,<span class="k1">short</span> y1,<span class="k1">float</span> velX1,<span class="k1">float</span> velY1<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">12</td><td>  <span class="k1">void</span> update<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">13</td><td><span class="k2">}</span>fire<span class="k2">[</span>MAX_FIRE<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> fire::deploy<span class="k2">(</span><span class="k1">short</span> x1,<span class="k1">short</span> y1,<span class="k1">float</span> velX1,<span class="k1">float</span> velY1<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">16</td><td>  x<span class="k3">=</span>x1<span class="k2">;</span> y<span class="k3">=</span>y1<span class="k2">;</span> velX<span class="k3">=</span>velX1<span class="k2">;</span> velY<span class="k3">=</span>velY1<span class="k2">;</span></td></tr><tr><td class="number">17</td><td>  life<span class="k3">=</span><span class="n">200</span><span class="k3">+</span>roll<span class="k2">(</span><span class="n">55</span><span class="k2">)</span><span class="k2">;</span> visible<span class="k3">=</span><span class="k1">true</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td>  <span class="c">//roll here simply returns a random number from 1-55.</span></td></tr><tr><td class="number">19</td><td>  </td></tr><tr><td class="number">20</td><td>  fire_counter<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">21</td><td>  <span class="k1">if</span><span class="k2">(</span>fire_counter&gt;<span class="k3">=</span>MAX_FIRE-1<span class="k2">)</span></td></tr><tr><td class="number">22</td><td>    fire_counter<span class="k3">=</span><span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td><span class="k2">}</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td>&#160;</td></tr><tr><td class="number">25</td><td><span class="k1">void</span> fire::update<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">26</td><td>  <span class="k1">if</span><span class="k2">(</span>visible <span class="k3">&amp;</span><span class="k3">&amp;</span> life&gt;0<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">27</td><td>    life--<span class="k2">;</span></td></tr><tr><td class="number">28</td><td>    </td></tr><tr><td class="number">29</td><td>                             <span class="c">//my roll() function returns int, not float</span></td></tr><tr><td class="number">30</td><td>                             <span class="c">//so I have to make sure it knows to use a float</span></td></tr><tr><td class="number">31</td><td>    <span class="k1">if</span><span class="k2">(</span>velX<span class="k3">&lt;</span><span class="k3">-</span><span class="n">0</span>.<span class="n">01</span><span class="k2">)</span> velX<span class="k3">+</span><span class="k3">=</span><span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>roll<span class="k2">(</span><span class="n">50</span><span class="k2">)</span><span class="k3">/</span><span class="n">1000</span><span class="k2">;</span></td></tr><tr><td class="number">32</td><td>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>velX&gt;0.01<span class="k2">)</span> velX-<span class="k3">=</span><span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>roll<span class="k2">(</span><span class="n">50</span><span class="k2">)</span><span class="k3">/</span><span class="n">1000</span><span class="k2">;</span></td></tr><tr><td class="number">33</td><td>    <span class="k1">else</span> velX<span class="k3">=</span><span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">34</td><td>    <span class="k1">if</span><span class="k2">(</span>velY<span class="k3">&lt;</span><span class="k3">-</span><span class="n">0</span>.<span class="n">7</span><span class="k2">)</span> velY<span class="k3">+</span><span class="k3">=</span><span class="n">0</span>.<span class="n">03</span><span class="k2">;</span></td></tr><tr><td class="number">35</td><td>    <span class="k1">else</span> velY<span class="k3">+</span><span class="k3">=</span><span class="n">0</span>.<span class="n">008</span><span class="k2">;</span></td></tr><tr><td class="number">36</td><td>    x<span class="k3">+</span><span class="k3">=</span>velX<span class="k2">;</span></td></tr><tr><td class="number">37</td><td>    y<span class="k3">+</span><span class="k3">=</span>velY<span class="k2">;</span></td></tr><tr><td class="number">38</td><td>    </td></tr><tr><td class="number">39</td><td>    <a href="http://www.allegro.cc/manual/drawing_mode" target="_blank"><span class="a">drawing_mode</span></a><span class="k2">(</span>DRAW_MODE_TRANS,NULL,NULL,NULL<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">40</td><td>    <span class="k1">for</span><span class="k2">(</span><span class="k1">short</span> i<span class="k3">=</span><span class="n">1</span><span class="k2">;</span> i<span class="k3">&lt;</span><span class="n">5</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">41</td><td>      <span class="c">//not sure if this is a very smart algorithm, but it seems to make it pretty ^_^</span></td></tr><tr><td class="number">42</td><td>      <a href="http://www.allegro.cc/manual/set_trans_blender" target="_blank"><span class="a">set_trans_blender</span></a><span class="k2">(</span><span class="n">0</span>,<span class="n">0</span>,<span class="n">0</span>,life<span class="k3">/</span><span class="n">2</span><span class="k3">+</span>life<span class="k3">/</span><span class="n">2</span><span class="k3">/</span><span class="n">5</span>%i<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">43</td><td>      <a href="http://www.allegro.cc/manual/circlefill" target="_blank"><span class="a">circlefill</span></a><span class="k2">(</span>buffer,x,y,i<span class="k3">+</span>life<span class="k3">/</span><span class="n">51</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>,life,<span class="n">0</span><span class="k2">)</span><span class="k2">)</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>    <a href="http://www.allegro.cc/manual/solid_mode" target="_blank"><span class="a">solid_mode</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">46</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">47</td><td><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">/*Where you call your key input*/</span></td></tr><tr><td class="number">50</td><td><span class="k1">float</span> angle<span class="k3">=</span><span class="n">4</span>.<span class="n">353</span><span class="k2">;</span> <span class="c">//set this to whatever you want in radiants</span></td></tr><tr><td class="number">51</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">52</td><td>  fire<span class="k2">[</span>fire_counter<span class="k2">]</span>.deploy<span class="k2">(</span><span class="n">320</span>,<span class="n">240</span>,<span class="n">3</span><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<span class="k2">)</span>,<span class="n">3</span><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<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">53</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

So tell me what all I did wrong there. =] I&#39;m known for amassing errors.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Ceagon Xylas)</author>
		<pubDate>Sun, 05 Feb 2006 14:40:42 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I think if you just use addition as your blending mode, it would look rather nice. Addition blending is just like it sounds...it &quot;adds&quot; the colors instead of just blitting over top of them. You should probably also begin with an alpha of, say 0.75. I&#39;m not sure how to do this in allegro, though, sorry.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elverion)</author>
		<pubDate>Sun, 05 Feb 2006 15:19:54 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>If you want to use software graphics, downloading FBlend would be a good start. Though you won&#39;t be able to both rotate (and/or stretch) and blend the sprites.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Fladimir da Gorf)</author>
		<pubDate>Sun, 05 Feb 2006 16:20:00 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Oh wow, the add_blender was ALLLOOTTT better! Thanks much Elverion! I&#39;m leaning towards the top right in this image.<br /><span class="remote-thumbnail"><span class="json">{"name":"image95cs.gif","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/0\/2\/02337cd6bf280fd19cb415572af2d3f6.gif","w":518,"h":255,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/0\/2\/02337cd6bf280fd19cb415572af2d3f6"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/0/2/02337cd6bf280fd19cb415572af2d3f6-240.jpg" alt="image95cs.gif" width="240" height="118" /></span>
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">for</span><span class="k2">(</span><span class="k1">short</span> i<span class="k3">=</span><span class="n">1</span><span class="k2">;</span> i<span class="k3">&lt;</span><span class="n">5</span><span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span>
  <a href="http://www.allegro.cc/manual/set_add_blender" target="_blank"><span class="a">set_add_blender</span></a><span class="k2">(</span><span class="n">0</span>,<span class="n">0</span>,<span class="n">0</span>,life<span class="k3">/</span><span class="n">8</span><span class="k3">+</span>life<span class="k3">/</span><span class="n">2</span><span class="k3">/</span><span class="n">5</span>%i<span class="k2">)</span><span class="k2">;</span>
  <a href="http://www.allegro.cc/manual/circlefill" target="_blank"><span class="a">circlefill</span></a><span class="k2">(</span>buffer,x,y,i<span class="k3">+</span>life<span class="k3">/</span><span class="n">51</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>,life,life<span class="k3">/</span><span class="n">4</span><span class="k3">+</span>life<span class="k3">/</span><span class="n">2</span><span class="k3">/</span><span class="n">5</span>%i<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
                                            <span class="c">//this is the red writing on the pictures</span>
<span class="k2">}</span>
</pre></div></div><p>

Okay I&#39;ll look into that Fladimir. =]
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Ceagon Xylas)</author>
		<pubDate>Sun, 05 Feb 2006 16:21:01 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It&#39;d also help if you used sprites with some texture instead of circles.  You&#39;ll basically get the benefit of lots of little sprites without actually having them.</p><p>Marcello
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Marcello)</author>
		<pubDate>Mon, 06 Feb 2006 00:36:25 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ceagon Xylas: You should make a game in which you play the role of a dragon who are out to burn some towns. Fighting crossbow soldiers, archers, knights, catapults and other medieval stuff.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kentl)</author>
		<pubDate>Mon, 06 Feb 2006 00:41:27 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks for the idea, I&#39;ll most likely do that now =] Specially if I can find someone willing to do the dragon art ^_^</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
It&#39;d also help if you used sprites with some texture instead of circles. You&#39;ll basically get the benefit of lots of little sprites without actually having them.
</p></div></div><p>
I&#39;m afraid I don&#39;t understand the last part of what you&#39;re saying here.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Ceagon Xylas)</author>
		<pubDate>Mon, 06 Feb 2006 02:29:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
It&#39;d also help if you used sprites with some texture instead of circles.
</p></div></div><p>
Rotating these sprites properly also can help a lot (of course anti-aliasing is probably a must here). In Painkiller it worked really well. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Krzysztof Kluczek)</author>
		<pubDate>Mon, 06 Feb 2006 02:34:24 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yep. You&#39;ve definantly made some improvement! It looks very nice now. As for the &quot;It&#39;d also help if you used sprites with some texture instead of circles. You&#39;ll basically get the benefit of lots of little sprites without actually having them.&quot;, he is suggesting that you make a better sprite, simply put. Look at the example I included in that zip file I attached in an earlier post. In your case, you might want it to be more yellowish in the sprite itself.</p><p>I suggest GIMP ( www.gimp.org ) for doing any sort of texturing or making sprites like this.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elverion)</author>
		<pubDate>Mon, 06 Feb 2006 03:08:26 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Okay, I like this idea -- but not for the fire. So I may use it for my smoke &#39;engine&#39; instead. It&#39;s taking alot more CPU though. =/</p><p>[edit]<br />Oh, and after I thought about it... <i>Heat rises.</i><br />So instead of velY+=0.008 I&#39;m using velY-=(float)roll(250)/10000
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Ceagon Xylas)</author>
		<pubDate>Mon, 06 Feb 2006 04:08:19 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yep. If you just use a better effect with fewer particles, maybe you can get it to work great. But, I think what you have right now is good enough. It looks like fire at least.</p><p>Might I be able to get your full source on this?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elverion)</author>
		<pubDate>Mon, 06 Feb 2006 06:44:13 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yeah, most all of it is right up there ^
</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">int</span> roll<span class="k2">(</span><span class="k1">short</span> sides<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">2</td><td>  <span class="k1">static</span> <span class="k1">bool</span> seeded<span class="k2">;</span></td></tr><tr><td class="number">3</td><td>  <span class="k1">int</span> val<span class="k2">;</span></td></tr><tr><td class="number">4</td><td>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>seeded<span class="k2">)</span> seeded<span class="k3">=</span><span class="k1">true</span><span class="k2">;</span></td></tr><tr><td class="number">5</td><td>  val <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="k2">(</span><span class="n">100000</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">6</td><td>  val <span class="k3">=</span> <span class="k2">(</span>val % sides<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">7</td><td>  <span class="k1">return</span> val<span class="k2">;</span></td></tr><tr><td class="number">8</td><td><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><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">11</td><td><span class="k1">const</span> <span class="k1">int</span> MAX_FIRE<span class="k3">=</span><span class="n">1024</span><span class="k2">;</span></td></tr><tr><td class="number">12</td><td><span class="k1">int</span> fire_counter<span class="k3">=</span><span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">13</td><td>&#160;</td></tr><tr><td class="number">14</td><td>&#160;</td></tr><tr><td class="number">15</td><td><span class="k1">class</span> fire<span class="k2">{</span></td></tr><tr><td class="number">16</td><td>public:</td></tr><tr><td class="number">17</td><td>  <span class="k1">float</span> x,y,velX,velY<span class="k2">;</span> <span class="c">//obvious what these do</span></td></tr><tr><td class="number">18</td><td>  <span class="k1">short</span> life<span class="k2">;</span> <span class="c">//life of the fire 'particle'</span></td></tr><tr><td class="number">19</td><td>  <span class="k1">bool</span> visible<span class="k2">;</span> <span class="c">//weather or not it's visible</span></td></tr><tr><td class="number">20</td><td>&#160;</td></tr><tr><td class="number">21</td><td>  <span class="k1">void</span> deploy<span class="k2">(</span><span class="k1">short</span> x1,<span class="k1">short</span> y1,<span class="k1">float</span> velX1,<span class="k1">float</span> velY1<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">22</td><td>  <span class="k1">void</span> update<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td><span class="k2">}</span>fire<span class="k2">[</span>MAX_FIRE<span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td>&#160;</td></tr><tr><td class="number">25</td><td><span class="k1">void</span> fire::deploy<span class="k2">(</span><span class="k1">short</span> x1,<span class="k1">short</span> y1,<span class="k1">float</span> velX1,<span class="k1">float</span> velY1<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">26</td><td>  x<span class="k3">=</span>x1<span class="k2">;</span> y<span class="k3">=</span>y1<span class="k2">;</span> velX<span class="k3">=</span>velX1<span class="k2">;</span> velY<span class="k3">=</span>velY1<span class="k2">;</span></td></tr><tr><td class="number">27</td><td>  life<span class="k3">=</span><span class="n">200</span><span class="k3">+</span>roll<span class="k2">(</span><span class="n">55</span><span class="k2">)</span><span class="k2">;</span> visible<span class="k3">=</span><span class="k1">true</span><span class="k2">;</span></td></tr><tr><td class="number">28</td><td>  </td></tr><tr><td class="number">29</td><td>  fire_counter<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">30</td><td>  <span class="k1">if</span><span class="k2">(</span>fire_counter&gt;<span class="k3">=</span>MAX_FIRE-1<span class="k2">)</span></td></tr><tr><td class="number">31</td><td>    fire_counter<span class="k3">=</span><span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">32</td><td><span class="k2">}</span><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="k1">void</span> fire::update<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">35</td><td>  <span class="k1">if</span><span class="k2">(</span>visible <span class="k3">&amp;</span><span class="k3">&amp;</span> life&gt;0<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">36</td><td>    life--<span class="k2">;</span></td></tr><tr><td class="number">37</td><td>    <span class="k1">if</span><span class="k2">(</span>velX<span class="k3">&lt;</span><span class="k3">-</span><span class="n">0</span>.<span class="n">01</span><span class="k2">)</span> velX<span class="k3">+</span><span class="k3">=</span><span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>roll<span class="k2">(</span><span class="n">50</span><span class="k2">)</span><span class="k3">/</span><span class="n">1000</span><span class="k2">;</span></td></tr><tr><td class="number">38</td><td>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>velX&gt;0.01<span class="k2">)</span> velX-<span class="k3">=</span><span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>roll<span class="k2">(</span><span class="n">50</span><span class="k2">)</span><span class="k3">/</span><span class="n">1000</span><span class="k2">;</span></td></tr><tr><td class="number">39</td><td>    <span class="k1">else</span> velX<span class="k3">=</span><span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">40</td><td>    <span class="k1">if</span><span class="k2">(</span>velY<span class="k3">&lt;</span><span class="k3">-</span><span class="n">3</span>.<span class="n">7</span><span class="k2">)</span> velY<span class="k3">=</span><span class="k3">-</span><span class="n">3</span>.<span class="n">7</span><span class="k2">;</span> <span class="k1">else</span> velY-<span class="k3">=</span><span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>roll<span class="k2">(</span><span class="n">250</span><span class="k2">)</span><span class="k3">/</span><span class="n">100000</span><span class="k2">;</span></td></tr><tr><td class="number">41</td><td>    <span class="c">//call for collision detection here if you need it.</span></td></tr><tr><td class="number">42</td><td>    x<span class="k3">+</span><span class="k3">=</span>velX<span class="k2">;</span></td></tr><tr><td class="number">43</td><td>    y<span class="k3">+</span><span class="k3">=</span>velY<span class="k2">;</span></td></tr><tr><td class="number">44</td><td>    </td></tr><tr><td class="number">45</td><td>    <a href="http://www.allegro.cc/manual/drawing_mode" target="_blank"><span class="a">drawing_mode</span></a><span class="k2">(</span>DRAW_MODE_TRANS,NULL,NULL,NULL<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">46</td><td>    <span class="k1">for</span><span class="k2">(</span><span class="k1">short</span> i<span class="k3">=</span><span class="n">1</span><span class="k2">;</span> i<span class="k3">&lt;</span><span class="n">5</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">47</td><td>      <a href="http://www.allegro.cc/manual/set_add_blender" target="_blank"><span class="a">set_add_blender</span></a><span class="k2">(</span><span class="n">0</span>,<span class="n">0</span>,<span class="n">0</span>,life<span class="k3">/</span><span class="n">8</span><span class="k3">+</span>life<span class="k3">/</span><span class="n">2</span><span class="k3">/</span><span class="n">5</span>%i<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">48</td><td>      <a href="http://www.allegro.cc/manual/circlefill" target="_blank"><span class="a">circlefill</span></a><span class="k2">(</span>buffer,x,y,i<span class="k3">+</span>life<span class="k3">/</span><span class="n">51</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>,life<span class="k3">/</span><span class="n">1</span>.<span class="n">25</span>,life<span class="k3">/</span><span class="n">4</span><span class="k3">+</span>life<span class="k3">/</span><span class="n">2</span><span class="k3">/</span><span class="n">5</span>%i<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">49</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">50</td><td>    <a href="http://www.allegro.cc/manual/solid_mode" target="_blank"><span class="a">solid_mode</span></a><span class="k2">(</span><span class="k2">)</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><span class="k2">;</span></td></tr><tr><td class="number">53</td><td>&#160;</td></tr><tr><td class="number">54</td><td>main<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">55</td><td>  <span class="k1">float</span> angle<span class="k3">=</span><span class="n">4</span>.<span class="n">353</span><span class="k2">;</span> <span class="c">//set this to whatever you want in radiants</span></td></tr><tr><td class="number">56</td><td>  <span class="k1">while</span><span class="k2">(</span><span class="k3">!</span>game_over<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">57</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">58</td><td>      fire<span class="k2">[</span>fire_counter<span class="k2">]</span>.deploy<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="n">3</span><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<span class="k2">)</span>,<span class="n">3</span><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<span class="k2">)</span><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">for</span><span class="k2">(</span><span class="k1">short</span> i<span class="k3">=</span><span class="n">0</span><span class="k2">;</span> i<span class="k3">&lt;</span>MAX_FIRE<span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> fire<span class="k3">&lt;</span>i&gt;.update<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">61</td><td>    <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>buffer<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">62</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">63</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Ceagon Xylas)</author>
		<pubDate>Mon, 06 Feb 2006 09:12:14 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
If you want to use software graphics,
</p></div></div><p> Actually I was planning on learning managed Direct 3D for my next game (probably a 2D game in VB.NET, overhead view with zooming) thanks for the articles and code posted... I&#39;ll try to read it -- starting with nehe #19.</p><p>edit: hmmm.. I couldn&#39;t find a binary to download of nehe&#39;s example (didn&#39;t feel like downloading opengl sdk or whatever it is that you need, and the source and trying to compile it...) -- but from his explination, it&#39;s not that impressive, the only thing he has incorporated that I never tried to was particles with images bound to them instead of colors...</p><p>I suppose that could be kind of cool...  maybe if it also supported alpha blending like someone else said in this thread, each particle could be bitmapped/rotated/blended.</p><p>edit: CX I like the topleft implimentation of the fire.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Michael Jensen)</author>
		<pubDate>Mon, 06 Feb 2006 12:05:26 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Feel free to use my fire if you want. I&#39;ll ask that you be nice and give me credit, but I wont hold it to you. Freesource. A further note on that is you may need to output 3 &#39;particles&#39; at once instead of just one. Something like
</p><div class="source-code snippet"><div class="inner"><pre><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>
  <span class="k1">for</span><span class="k2">(</span><span class="k1">short</span> i<span class="k3">=</span><span class="n">0</span><span class="k2">;</span> i<span class="k3">&lt;</span><span class="n">3</span><span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
    fire<span class="k2">[</span>fire_counter<span class="k2">]</span>.deploy<span class="k2">(</span>...<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

And here&#39;s the <a href="http://nehe.gamedev.net/data/lessons/vc/lesson19.zip">Binary</a> for lesson 19. The NeHe binaries are found at the bottom of the page in the VC++ zip:
</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
</p><ul><li><p>DOWNLOAD Visual C++ Code For This Lesson.
</p></li></ul></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Ceagon Xylas)</author>
		<pubDate>Tue, 07 Feb 2006 02:17:43 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ahh, it just said code and I didn&#39;t realize... Yeah just what I thought, blending sprites instead of dots... cool.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Michael Jensen)</author>
		<pubDate>Tue, 07 Feb 2006 12:09:37 +0000</pubDate>
	</item>
</rss>
