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

    {
    movement mimics dancing rain? [closest analogy I can think of]
    }
    uses crt;
    const Balls = 1900;  {increment if too fast: decrement if too slow}
    type movement= record
         x,   y : integer;  { position }
        dx,  dy : integer;  { velocity }
       ddx, ddy : integer;  { acceleration }
       color    : integer;
       MaxYValue: integer;
            END;
    VAR ch : char;
        I  : integer;
     Ball: array[1..BAlls] of movement;
    Procedure VideoMode ( Mode : Byte );
        Begin { VideoMode }
          Asm
            Mov  AH,00
            Mov  AL,Mode
            Int  10h
          End;
        End;  { VideoMode }
    procedure PutDot(x,y,color:integer);
      begin
        Mem[$A000{VGA_Segment}:(y*320)+x] := color;
      end;

    BEGIN
    videoMODE($13);
    randomize;
    {init all balls}
    for i:=1 to BAlls do BEGIN
    With ball[i] do BEGIN
    ddx := 0;             { no horizontal acceleration }
    ddy := 1;             { constant vertical acceleration }
     dx := Random(2)-1;   { push it left of right to start}
     if dx=0 then dx:=1;  { all balls will have a horizontal movement}
     dy:=0;               { the object is initially at rest }
      x := I div ((i div 320)+1); { initial coordinates, as }
      y := i mod 130+random(3); {   you specified }
      color:=random(I mod 255);  {Each Balls color}
      MaxYValue:=Y+1;
    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;
      End;
      IF x > 319 then begin   {hits right of screen}
         x :=319;
         dx:=-dx;
      END;
      IF y > 190 then begin   { BOUNCE! }
        y := 190;
        dy := -dy;
      End;
      putdot(x, y, color);  { draw the pixel at the new position }
      END; {WITH}
     END; {for do loop}
    End; {KEYPRESS}
    videoMODe($3);
    end. {PROGRAM}

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