home *** CD-ROM | disk | FTP | other *** search
/ HomeWare 14 / HOMEWARE14.bin / prog / pcgpe10.arj / FIRE.TXT < prev    next >
Text File  |  1994-05-10  |  5KB  |  101 lines

  1.  
  2.          ╔═════════════════════════════════════════════════════╗
  3.          ║        How to code youre own "Fire" Routines        ║
  4.          ╚═════════════════════════════════════════════════════╝
  5.  
  6.     Hiya Puppies!
  7.  
  8.     Hopefully this information file will give you all the information you
  9.     need to code youre own fire routines, seen in many demo's and also to
  10.     actually take it all further and develop youre own effects..
  11.  
  12.     Ok, so lets get on....
  13.  
  14.     Setting up
  15.  
  16.  
  17.     first thing we need to do is set up two arrays, the size of the arrays
  18.     depends on the many things, screen mode, speed of computer etc, its not
  19.     really important, just that they should both be the same size... I'll
  20.     use 320x200 (64000 byte) arrays for this text, because that happens to
  21.     be the size needed for using a whole screen in vga mode 13h.
  22.  
  23.     The next thing we need to do is set a gradient palette, this can be
  24.     smoothly gradiated through ANY colours, but for the purpose of this
  25.     text lets assume the maximum value is a white/yellow and the bottom
  26.     value is black, and it grades through red in the middle.
  27.  
  28.     Ok, we have two arrays, lets call them startbuffer and screenbuffer, so
  29.     we know whats going on. Firstly, we need to setup an initial value for
  30.     the start buffer...  so what we need is a random function, that returns
  31.     a value between 0 and 199 (because our screen is 200 bytes wide) this
  32.     will give us the initial values for our random "hotspots" so we do this
  33.     as many times as we think is needed, and set all our bottom line values
  34.     of the start buffer to the maximum colour value. (so we have the last
  35.     300 bytes of the start buffer set randomly with our maximum colour,
  36.     usually if we use a full palette this would be 255 but it can be
  37.     anything that is within our palette range.)
  38.  
  39.     Ok, thats set the bottom line up.. so now we need to add the effect,
  40.     for this we need to copy the start buffer, modify it and save it to the
  41.     screenbuffer, we do this by averaging the pixels (this is in effect
  42.     what each byte in our array represents) surrounding our target....
  43.  
  44.     It helps to think of these operations in X,Y co-ordinates....
  45.  
  46.     Lets try a little diagram for a single pixel.....
  47.  
  48.     This is the startbuffer             This is our screenbuffer
  49.  
  50.     ┌───┬───┬───┬───┬───┐               ┌───┬───┬───┬───┬───┐
  51.     │0,0│0,1│0,2│0,3│0,4│ etc...        │   │   │   │   │   │
  52.     ├───┼───┼───┼───┼───┤               ├───┼───┼───┼───┼───┤
  53.     │1,0│1,1│1,2│1,3│1,4│ etc..         │   │X,Y│   │   │   │
  54.     ├───┼───┼───┼───┼───┤               ├───┼───┼───┼───┼───┤
  55.     │2,0│2,1│2,2│2,3│2,4│ etc..         │   │   │   │   │   │
  56.     └───┴───┴───┴───┴───┘               └───┴───┴───┴───┴───┘
  57.  
  58.     Here we're going to calulate the value for X,Y (notice I didnt start at
  59.     0,0 for calculating our new pixel values?? thats because we need to
  60.     average the 8 surrounding pixels to get out new value.. and the pixels
  61.     around the edges wouldn't have 8 pixels surrounding them), so what we
  62.     need to do to get the value for X,Y is to average the values for all
  63.     the surrounding pixels... that means adding 0,0 0,1 0,2 + 1,0 1,2 + 2,0
  64.     2,1 2,2 and then dividing the total by 8 (the number of pixels we've
  65.     takes our averages from), but there's two problems still facing us..
  66.  
  67.     1) The fire stays on the bottom line....
  68.     2) Its slow....
  69.     3) The fire colours dont fade...
  70.  
  71.     Ok, so first thing, we need to get the fire moving! :) this is really
  72.     VERY easy. All we need to do is to take our average values from the
  73.     pixel value BELOW the pixel we are calculating for, this in effect,
  74.     moves the lines of the new array up one pixel... so for example our old
  75.     X,Y value we were calculating for was 1,1 so now we just calculate for
  76.     2,1 and put the calculated value in the pixel at 1,1 instead.. easy..
  77.  
  78.     The second problem can be approached in a few ways.. first and easiest
  79.     is to actually calculate less pixels in our averaging.. so instead of
  80.     the 8 surrounding pixels we calculate for example, 2 pixels, the one
  81.     above and the one below our target pixel (and divide by 2 instead of 8)
  82.     this saves a lot of time, another approach is to use a screen mode,
  83.     where you can set 4 pixels at a time, or set up the screen so that you
  84.     can use smaller arrays (jare's original used something like 80X50 mode)
  85.     which in effect reduces to 1/4 the number of pixels needed to be
  86.     calculated.
  87.  
  88.     The third problem is just a matter of decrementing the calculated value
  89.     that we get after averaging by 1 (or whatever) and storing that value.
  90.  
  91.     Last but not least, we need to think about what else can be done...
  92.     well, you can try setting a different palette, you can also try setting
  93.     the pixel value we calculated from to another place, so say, instead of
  94.     calculating from one pixel below our target pixel, you use one pixel
  95.     below and 3 to the right of our target... FUN! :))
  96.  
  97.     Well, I hope I didnt confuse you all too much, if you need anything
  98.     clearing up about this, then email me at pc@espr.demon.co.uk ok?
  99.  
  100.     Written by  Phil Carlisle (aka Zoombapup // CodeX) 1994.
  101.