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.

Firework!


This is the Orca/Pascal version, written using Object Pascal to demonstrate object oriented programming.