Firework
Firework
program Firework;
uses Types, QuickDraw, Events, MiscTool;
type
Fire = Record
x, y, xdir, ydir: Integer;
end;
var
i, j, x, y, color: Integer;
tick: LongInt;
fires: Array[0..30] of Fire;
begin
graphics(320);
clearScreen(black);
hideCursor;
tick := getTick;
setRandSeed(tick);
while true do begin
{ Setup firework }
setPenSize(1, 1);
color := random mod 15 + 1;
x := random mod 320;
y := random mod 100 + 50;
for i := 0 to 30 do begin
fires[i].x := x;
fires[i].y := y;
fires[i].xdir := random mod 8 - 4;
fires[i].ydir := random mod 8 - 4;
end;
{ Shoot fire }
for i := 1 to 30 do begin
setSolidPenPat(black);
moveTo((i - 1) * x div 30,
(i - 1) * y div 30);
line(0, 0);
setSolidPenPat(color);
moveTo(i * x div 30, i * y div 30);
line(0, 0);
repeat until getTick - tick > 1;
tick := getTick;
end;
{ Draw firework }
for i := 1 to 30 do begin
for j := 0 to 30 do begin
setPenSize(i div 15 + 1, i div 15 + 1);
setSolidPenPat(black);
moveTo(fires[j].x, fires[j].y);
line(0, 0);
fires[j].x := fires[j].x + fires[j].xdir;
fires[j].y := fires[j].y + fires[j].ydir;
setSolidPenPat(color);
moveTo(fires[j].x, fires[j].y);
line(0, 0);
if button(0) then exit;
end;
repeat until getTick > tick;
tick := tick + 1;
end;
clearScreen(black);
end;
end.
This program teaches random number generation. The random number will always be the same unless it started on a random seed - the current system tick is a good choice.
You can see the Orca/Pascal version here. Orca/Pascal version is written using Object Pascal, an object oriented extension of the Pascal language.
GSoft BASIC Comparison
TYPE FIRE
X AS INTEGER
Y AS INTEGER
XDIR AS INTEGER
YDIR AS INTEGER
END TYPE
DIM FIRES(30) AS FIRE
TICK = GETTICK
DO
! Setup Firework
X = RND (1) * 320
Y = RND (1) * 100 + 50
COLOR = RND (1) * 15 + 1
HGR
FOR I = 1 TO 30
FIRES(I).X = X
FIRES(I).Y = Y
FIRES(I).XDIR = RND (1) * 8 - 4
FIRES(I).YDIR = RND (1) * 8 - 4
NEXT
! Shoot fire
FOR I = 1 TO 30
HCOLOR= 0
HPLOT (I - 1) * X / 30, (I - 1) * Y / 30
HCOLOR= COLOR
HPLOT I * X / 30, I * Y / 30
DO UNTIL GETTICK - TICK > 1
LOOP
TICK = GETTICK
NEXT
! Draw firework
FOR I = 1 TO 30
FOR J = 1 TO 30
HCOLOR= 0
HPLOT FIRES(J).X, FIRES(J).Y
FIRES(J).X = FIRES(J).X + FIRES(J).XDIR
FIRES(J).Y = FIRES(J).Y + FIRES(J).YDIR
HCOLOR= COLOR
HPLOT FIRES(J).X, FIRES(J).Y
NEXT
NEXT
LOOP