Calculator Community > Axe

Flames tutorial

(1/17) > >>

Builderboy:
Do you want your title screens to look like this?


If so, go no further because in this tutorial, I will be discussing how to get epic fire effects into your games and title screens using Axe.  This is applicable to either white fire or black fire, with, or without objects in the fire.

The rules of the fire are simple.  Take each pixel, move that pixel up, then also randomly erase pixels.  Since each pixel on the screen has an equal probability of being erased, pixels near the top have a lower probability of being set, because the pixels would have had to travel all the way from the bottom to the top without getting erased.  But thats a lot of mumbo jumbo, lets get straight to the code:


--- Code: ---.Axe
ClrDraw
[FEFDFBF7EFDFBD7F]->Str1  //Each Byte here has 7 bits set and 1 bit not set (like FE is 11111110 in binary)
                      //This is so that we can erase a random pixel, since Axe has no built in way to do that
Line(0,63,95,63       //the pixels to catch fire, explained a little later

Repeat getKey(15)    //until we press clear

For(F,L6+12,L6+767       //loop through all of the screen pixels except the last 12
{F} and {rand^8+Str1}->{F-12}   //take the byte, use AND to erase a single bit from it, and then store it into the byte directly *above* it
End                     //this makes it so that as the byte rises, each frame a pixel is erased from it

DispGraph

End
--- End code ---

So why do we need the line command?  Well because this routine needs fuel.  What that means is that if you draw a sprite onto the screen while this routine is running, that sprite will catch fire automatically.  If you stop drawing the sprite, it will rise and vanish like smoke.  Anything you draw onto the part of the screen that is being 'flamed' will automatically catch fire, and will continue to be on fire until you stop drawing it, at which point it will vanish like smoke.  Go ahead try it out!

Also, some of you may want to try a black background with white smoke.  the principles are exactly the same, but everything is inverted.  Instead of FE (11111110), you would use 01 (00000001), and instead of using AND, you would use OR.  Its that simple :)

Darl181:
Wow, this is awesome :o
Now I can make that "light people on fire" game I was going to make a while back ;)

How well would this work for animated sprites?  And is there a way to make only part of the screen (say, a sprite) on fire?

AngelFish:

--- Quote from: Darl181 on February 20, 2011, 01:33:10 am ---Wow, this is awesome :o
Now I can make that "light people on fire" game I was going to make a while back ;)

How well would this work for animated sprites?  And is there a way to make only part of the screen (say, a sprite) on fire?

--- End quote ---

Yep. Draw the sprite in two parts (assuming you'll be erasing the sprite every cycle to allow movement).  Draw the first part on the buffer before the For( loop and draw the second part after the For( loop. Only the first part will be on fire. I wouldn't recommend this method for processor intensive games though, because it's slow.

Darl181:
So, I would xor the second sprites back to nothing, I guess?
I could use RecallPic, but that erases the buffer like pt-off...

Builderboy:
@Qwerty that wouldn't work because there is no ClrDraw, so there is no difference between doing it before or after.

It could work very well for animated sprites, and with masking you could make it so that only the top of them is on fire and nothing inside.

However, making only a section of the screen create fire is difficult.  This is a screen effect, not an object effect, so anything that passes into the 'fire field' will catch on fire.  Also, since this is byte based, you would have to make the fire field out of whole bytes, unless you wanted to get into some complicated byte masking.

Navigation

[0] Message Index

[#] Next page

Go to full version