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