[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]

    uses
      {vgaSCRN,}crt;

    const
      Balls = 900;  {if program too fast increase: if too slow decrease}

    type
      movement= record
        x,   y : integer;  { position }
        dx,  dy : integer;  { velocity }
        ddx, ddy : integer;  { acceleration }
        color    : integer;
        MaxYValue: integer;
      END;

    VAR
      ch : char;           {for readkey}
      I  : integer;
      Ball : array[1..BAlls] of movement;

    procedure PutDot(x,y,color:integer);
    begin
      Mem[$a000{VGA_Segment}:(y*320)+x] := color;
    end;

    Procedure VideoMode ( Mode : Byte );
    Begin { VideoMode }
      Asm
        Mov  AH,00
        Mov  AL,Mode
        Int  10h
      End;
    End;  { VideoMode }

    BEGIN {MAIN}
      videoMODE($13); {320x200x256c}
      {init all balls}
      FOR I:=1 to BAlls do
      BEGIN
        With ball[i] do
        BEGIN
          ddx := 0; { constant horizontal acceleration }  {gravity < or >}
          ddy := 0; { constant vertical acceleration } {gravity ^ or v }

          { in this case there is NO gravity pull from ANY direction: weightless}
          dx := Random(2)-1;             { initial velocity < or >}
          dy := -1;                      { initial velocity ^ or v}

          x := i mod 305+random(15)+1; { initial coordinates, as }
          y := I mod 190+random(10)+1; {   you specified }

          { 320 * 200 positioning : take I and remainder when divided by 'balls'
            to produce a sequential increment that does not over flow 320 or 200;
            plus a random to give the fuzzy line effect}

          color:=Random( I div ((I div 254)+1)) + 1;  {Each Balls color}
          { This formula will take a loop from 1 to [any number] and make it so it
            will increment from 1 to 255 [valid color assignments]}
          MaxYValue:=Y+1;  {future use only}
        END; {with}
      END; {for do loop}

      WHILE not(keypressed) do
      begin
        FOR i:=1 to Balls do
        BEGIN
          With ball[i] do
          BEGIN
            putdot(x, y, 0);    { blank out the pixel drawn on the last
            iteration } dx := dx + ddx;     { updating velocity }
            dy := dy + ddy;
            x  :=  x +  dx;     { updating position }
            y  :=  y +  dy;
            IF x< 1 then
            begin      {hits left of screen}
              X:=1;
              dx:=dx*-1;           {moves it to the right}
            End;

            IF x > 319 then
            begin   {hits right of screen}
              x :=319;
              dx:=-dx;             {moves it to the left}
            END;

            IF y > 190 then
            begin   { BOUNCE! }
              y := 190;
              dy := -dy;            {not used: all object float upward not down}
            End;
            putdot(x, y, color);  { draw the pixel at the new position }
          END; {WITH}
        END; {for do loop}
      End; {KEYPRESS}

      videoMODe($3);          {back to text mode}
    end. {PROGRAM}

[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]