[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]
{
NB>{Hello All! I've recently coded this screen saver.It really looks like
NB>snow is falling all over, don't you think?
Yeah, it looked pretty neat!
NB>However, I did not set out to do a snow screen saver and if you exp
NB>with it a little you will see that it can even turn out to be a fir
NB>If anyone can improve this code or make anything out of it, I would
NB>very pleased to have a copy of the source.
Ok, I played around with it a bit today, and following is my modified
version. I pretty much just cleaned it up, got rid of all the unused
variables and stuff (there were quite a few <G>) for readability,
simplified a the calculations, and removed a lot of the overhead, and
removed most of the global variables. You will see that now you can
have a lot more snowflakes without it bogging out. I also removed the
custom palette because you can get pretty much the same colours using
the default palette (indexes 19-31). It can probably be simplified
even further (ie. remove the x and y tables and just use newPos table).
Oh yeah, I threw in a little snowflake explosion at the start too :-).
(********************************************************************
Originally by : Nick Batalas, 14-6-1994
Modifications by : Eric Coolman, 19-6-1994
********************************************************************)
}
Program SnowFall;
Uses crt; { for keypressed only }
const
Flakes = 500; { try less flakes for faster snowfall }
{---------------- Stuff not specific to snowfall ----------------}
Procedure vidMode(mode : byte);assembler;
asm mov ah,$00; mov al,mode; int 10h; end;
Procedure setPixel(pixPos : word; color : byte);
begin
mem[$A000:pixPos] := color;
end;
{---------------------------MAIN PROGRAM-------------------------}
var
CurFlake : integer; { snowflake counter }
i : longint; { to add velocity to flakes }
x,y, newPos: array[0..Flakes] of word; { lookup tables }
BEGIN
randomize;
for curFlake:=0 to Flakes do { set up snow lookup table }
begin
x[curFlake]:=random(319);
y[curFlake]:=random(199);
end;
vidMode($13); { 320x200x256 graphics mode }
i := 0; { change to 100 or higher to get rid of start explosion }
repeat
inc(i);
for curFlake:=0 to Flakes do
begin
setPixel(newPos[curFlake], 0); { erase old snowflake }
newPos[curFlake] := { set up and draw new snowflake }
round(x[curFlake]*(i*0.01)) + { new X }
round(y[curFlake]*(i*0.01)) * 320; { new Y }
setPixel(newPos[curFlake], (curFlake mod 13) + 19);
end;
while (port[$3da] and $08) = $08 do; { wait for vRetrace to }
while (port[$3da] and $08) = $00 do; { start and end }
until keypressed;
vidMode($03); { return to 80x25 textmode }
end.
[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]