[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]
{
Fire v1.0
Written By Evan Jones
The Flame Effect :-
X = Pixel A,B,C = Values to average DV = Decay Value
123 123
4X5 4X5
678 ABC X's colour = A+B+C / 3 ( beacause were adding 3 values ) - DV
^ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
^ X and its surrounding pixel colours. À> X and the pixels we've chosen
The basics of the flame effect are to choose as many of the 8 pixels
( you could use others ) arround the pixel, you are trying to finds
colour, as you want. Then find the average ( add up all the values and
divide by the ammount of values you added ) of the pixels and then
use this as the pixel's colour. You have to do this for every one of the
pixels in your pixel array.
Because were calculating values then putting them in the array you can't
just use the screen. So you are going to have to use another array to do
all your calculations and then move that to the screen.
This file is provided so that you programmers who want to write demos and
stuff like that can learn how to. I've commented most of the source and
have only used a couple of assembler statments so those of you ( you know
who you are ) who don't know how to write in assembler can still know what
is going on, although I can't guarentee that.
I would like it if you could send me a message saying what you think of this
and if you have added things I'd also like a copy of the source. You can
mail me at :-
Evan.Jones@Millenium.Cbr.Fidonet.Org
- Or by Fidonet -
"Evan Jones" at 3:620/265
}
Program Flames;
Const
Pal : array[1..768-16*3] Of Byte =
( 0, 0, 0, 0, 0, 24, 0, 0, 24, 0, 0, 28,
0, 0, 32, 0, 0, 32, 0, 0, 36, 0, 0, 40,
8, 0, 40, 16, 0, 36, 24, 0, 36, 32, 0, 32,
40, 0, 28, 48, 0, 28, 56, 0, 24, 64, 0, 20,
72, 0, 20, 80, 0, 16, 88, 0, 16, 96, 0, 12,
104,0, 8, 112, 0, 8,120, 0, 4,128, 0, 0,
128,0, 0, 132, 0, 0,136, 0, 0,140, 0, 0,
144, 0, 0,144, 0, 0,148, 0, 0,152, 0, 0,
156, 0, 0,160, 0, 0,160, 0, 0,164, 0, 0,
168, 0, 0,172, 0, 0,176, 0, 0,180, 0, 0,
184, 4, 0,188, 4, 0,192, 8, 0,196, 8, 0,
200, 12, 0,204, 12, 0,208, 16, 0,212, 16, 0,
216, 20, 0,220, 20, 0,224, 24, 0,228, 24, 0,
232, 28, 0,236, 28, 0,240, 32, 0,244, 32, 0,
252, 36, 0,252, 36, 0,252, 40, 0,252, 40, 0,
252, 44, 0,252, 44, 0,252, 48, 0,252, 48, 0,
252, 52, 0,252, 52, 0,252, 56, 0,252, 56, 0,
252, 60, 0,252, 60, 0,252, 64, 0,252, 64, 0,
252, 68, 0,252, 68, 0,252, 72, 0,252, 72, 0,
252, 76, 0,252, 76, 0,252, 80, 0,252, 80, 0,
252, 84, 0,252, 84, 0,252, 88, 0,252, 88, 0,
252, 92, 0,252, 96, 0,252, 96, 0,252,100, 0,
252,100, 0,252,104, 0,252,104, 0,252,108, 0,
252,108, 0,252,112, 0,252,112, 0,252,116, 0,
252,116, 0,252,120, 0,252,120, 0,252,124, 0,
252,124, 0,252,128, 0,252,128, 0,252,132, 0,
252,132, 0,252,136, 0,252, 136, 0,252, 140, 0,
252,152, 0,252, 152, 0,252, 156, 0,252, 156, 0,
252,160, 0,252, 160, 0,252, 164, 0,252, 164, 0,
252,168, 0,252, 168, 0,252, 172, 0,252, 172, 0,
252,176, 0,252, 176, 0,252, 180, 0,252, 180, 0,
252,184, 0,252, 184, 0,252, 188, 0,252, 188, 0,
252,196, 0,252, 196, 0,252, 196, 0,252, 190, 0,
252,200, 0,252, 200, 0,252, 204, 0,252, 208, 0,
252,208, 0,252, 208, 0,252, 208, 0,252, 208, 0,
252,212, 0,252, 212, 0,252, 212, 0,252, 212, 0,
252,216, 0,252, 216, 0,252, 216, 0,252, 216, 0,
252,216, 0,252, 220, 0,252, 220, 0,252, 220, 0,
252,224, 0,252, 228, 0,252, 228, 0,252, 228, 0,
252,228, 0,252, 228, 0,252, 232, 0,252, 232, 0,
252,236, 0,252, 236, 0,252, 240, 0,252, 240, 0,
252,240, 0,252, 240, 0,252, 240, 0,252, 244, 0,
252,248, 0,252, 248, 0,252, 248, 0,252, 252, 0,
252,252, 4,252, 252, 8,252, 252, 12,252, 252, 16,
252,252, 20,252, 252, 24,252, 252, 28,252, 252, 32,
252,252, 36,252, 252, 40,252, 252, 40,252, 252, 44,
252,252, 48,252, 252, 52,252, 252, 56,252, 252, 60,
252,252, 64,252, 252, 68,252, 252, 72,252, 252, 76,
252,252, 82,252, 252, 84,252, 252, 86,252, 252, 88,
252,252, 92,252, 252, 96,252, 252, 100,252, 252, 104,
252,252,108,252, 252, 112,252, 252, 116,252, 252, 120,
252,252,124,252, 252, 124,252, 252, 128,252, 252, 132,
252,252,136,252, 252, 140,252, 252, 144,252, 252, 148,
252,252,152,252, 252, 154,252, 252, 162,252, 252, 164,
252,252,168,252, 252, 168,252, 252, 172,252, 252, 176,
252,252,180,252, 252, 184,252, 252, 188,252, 252, 192,
252,252,196,252, 252, 200,252, 252, 204,252, 252, 208,
252,252,208,252, 252, 212,252, 252, 216,252, 252, 220,
252,252,224,252, 252, 228,252, 252, 232,252, 252, 236,
252,252,240,252, 252, 244,252, 252, 248,252, 252, 252);
Var
FlameArr : Array[0..99,0..159] Of Byte;
{^ the array to calculate everything }
B,P : Byte;
{ ^ some dummy variables }
Procedure PlotPixel ( X, Y : Word; C : Byte ); Assembler;
{ Sorry it's in assembler but I would be even slower if I didn't}
Asm
Mov AX, 320
Mul Y { Get the Y Pos ( Y * 320 cuz were in 320x200 mode ) }
Mov DI, AX
Add DI, X { add the X value to find the offset }
Mov AX, 0A000h
Mov ES, AX { set ES to the video seg }
Mov AL, C
Mov [ES:DI], AL { move the colour to the video memory }
End;
Procedure CalcFlames;
Var
X, Y : Word;
{ two variables for accessing the points in the array and screen }
Calc : Word;
{ a temp value for CALCulating things }
Begin
{ For flame effect scroll through every pixel and }
{ choose some other pixels around it. Divide by }
{ the ammount of pixels you added up and then }
{ subtract a decay ammount. }
{ 2 }
{ 123 A23 X = 1+5+6/3 - Decay Value. = 4 - DV }
{ 3X5 3XB ^ ^ ^ }
{ 692 C92 A+B+C/3 }
{ }
{ X = Pixel }
{ }
For Y := 0 To 99 Do { number of rows }
For X := 0 To 159 Do { number of cols }
Begin
Calc := FlameArr[Y+1,X] + FlameArr[Y+1,X-1] +
FlameArr[Y+1,X+1] + FlameArr[Y,X];
{ add the values of the surrounding pixels }
FlameArr[Y,X] := Calc Div 4;
{ divide by the number of pixels added up }
If FlameArr[Y,X] > 2 Then
Dec ( FlameArr[Y,X], 2 );
{ decrement by the decay value }
End;
For X := 0 To 159 Do { Comment this and the next line }
FlameArr[99,X] := Random ( 204 ) + 11;{ for interesting effect }
{ set a new bottom line }
For Y := 0 To 97 Do
For X := 0 To 159 Do
Begin
{ plot the pixels to the screen }
PlotPixel ( X+80, Y+50, FlameArr[Y,X] );
{ added 80 to X and 50 to Y to center on screen}
{PlotPixel ( X * 2, Y * 2, FlameArr[Y,X] );
PlotPixel ( X * 2+1, Y * 2+1, FlameArr[Y,X] );
{^^ Un-comment these two lines for a "Grid" Effect }
End;
End;
Procedure SetColour ( Index, R, G, B : Byte );
{ Sets a colour to a specific RGB value }
Begin
Port[$3C8] := Index;
Port[$3C9] := R;
Port[$3C9] := G;
Port[$3C9] := B;
End;
Begin
{ Change to MCGA 320x200x256 mode }
Asm
Mov AX, 13h
Int 10h
End;
{ Initalize random seed }
Randomize;
{ Clear the Flame Array }
FillChar ( FlameArr, SizeOf ( FlameArr ), 0 );
{ calculate a new bottom line }
For B := 0 To 159 Do
FlameArr[99,B] := Random ( 204 ) + 11;
{ make a the colours go from black to red }
For B := 0 To 255 Do
SetColour ( B, ( B * 43 ) Shr 7, 0, 0 );
Repeat
{ calculate the flames }
CalcFlames;
{ until ESC is pressed }
Until ( Port[$60] = $81 );
{ go back to 80x25x16 text mode }
Asm
Mov AX, 3
Int 10h
End;
End.---
[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]