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