Firework
Firework
program Firework;
uses Common, QuickDrawII, EventMgr, MscToolSet;
type
Fire = Object
x, y, xdir, ydir: Integer;
procedure setup(startX, startY: Integer);
procedure move;
end;
var
i, j, k, x, y, color: Integer;
tick: LongInt;
fires: Array[0..30] of Fire;
procedure Fire.setup;
begin
x := startX;
y := startY;
xdir := randomInteger mod 8 - 4;
ydir := randomInteger mod 8 - 4;
end;
procedure Fire.move;
begin
setSolidPenPat(black);
moveTo(x, y);
line(0, 0);
x := x + xdir;
y := y + ydir;
setSolidPenPat(color);
moveTo(x, y);
line(0, 0);
end;
begin
startDesk(320);
clearScreen(black);
hideCursor;
tick := getTick;
setRandSeed(tick);
while true do begin
{ Setup fire }
setPenSize(1, 1);
color := randomInteger mod 15 + 1;
x := randomInteger mod 320;
y := randomInteger mod 100 + 50;
for i := 0 to 30 do begin
new(fires[i]);
fires[i].setup(x, y);
end;
{ Draw 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);
fires[j].move;
if button(0) then begin
for k := 0 to 30 do
dispose(fires[i]);
endDesk;
halt(0);
end;
end;
repeat until getTick > tick;
tick := tick + 1;
end;
clearScreen(black);
end;
end.
Orca/Pascal version, written using Object Pascal to demonstrate object oriented programming.
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