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

    { MAKE SURE TO SET THE BGI PATH BELOW !! }
    { Integer Math Starfield }
    { Jack Mott - (C) 1996 }
    { free to use for noncommercial purposes }
    { Give credit where credit is due }
    { Contact: thecrow@iconn.net }
    PROGRAM StarFieldCoolness;

    USES
     crt,graph;
    CONST
     MAX = 250;
    VAR
      xv :array[1..MAX] of integer;
      yv :array[1..MAX] of integer;
      x,y:array[1..MAX] of integer;
      x2,y2:longint;
      xyS:longint;
      c:array[1..MAX] of integer;
      i,count:integer;
      speed:integer;
      k:char;

    PROCEDURE Init;
    var
      grDriver : Integer;
      grMode   : Integer;
      ErrCode  : Integer;
    begin
      grDriver := Detect;
      InitGraph(grDriver,grMode,'\turbo\tp\');
      ErrCode := GraphResult;
    end;

    PROCEDURE ResetStar(star:integer);
    VAR
      r:integer;
    BEGIN
      x[star] := random(640)+1;
      y[star] := random(480)+1;
      x[star] := x[star] - 250;
      y[star] := y[star] - 170;

    if speed <> 0 then
      begin
      xv[star] := x[star] div speed;
      yv[star] := y[star] div speed;
      end
    else
      begin
      xv[star] := x[star];
      yv[star] := y[star];
      end;

    if (xv[star] = 0) and (yv[star] = 0) then
      begin
        xv[star] := 1;
        yv[star] := 1;
      end;

    END;

    PROCEDURE MoveRight;
    VAR
      i:integer;

    BEGIN
      for i := 1 to MAX do xv[i] := xv[i] - 1;
    END;
    PROCEDURE MoveLeft;
    VAR
      i:integer;

    BEGIN
      for i := 1 to MAX do xv[i] := xv[i] + 1;
    END;

    PROCEDURE MoveUp;
    VAR
      i:integer;

    BEGIN
      for i := 1 to MAX do yv[i] := yv[i] + 1;
    END;

    PROCEDURE MoveDown;
    VAR
      i:integer;

    BEGIN
      for i := 1 to MAX do yv[i] := yv[i] - 1;
    END;

    PROCEDURE MoveUpLeft;
    VAR
      i:integer;

    BEGIN
      for i := 1 to MAX do
        begin
          yv[i] := yv[i] + 1;
          xv[i] := xv[i] + 1;
        end;
    END;

    PROCEDURE MoveUpRight;
    VAR
      i:integer;

    BEGIN
      for i := 1 to MAX do
        begin
          yv[i] := yv[i] + 1;
          xv[i] := xv[i] - 1;
        end;
    END;

    PROCEDURE MoveDownRight;
    VAR
      i:integer;

    BEGIN
      for i := 1 to MAX do
        begin
          yv[i] := yv[i] - 1;
          xv[i] := xv[i] -1;
        end;
    END;

    PROCEDURE MoveDownLeft;
    VAR
      i:integer;

    BEGIN
      for i := 1 to MAX do
        begin
          yv[i] := yv[i] - 1;
          xv[i] := xv[i] +1;
        end;
    END;

    BEGIN

    Init;
    randomize;
    speed := 15;
    FOR i := 1 TO MAX DO ResetStar(i);
    count := 0;
    REPEAT
    inc(count);

    FOR i := 1 TO MAX DO
      BEGIN

        {Optional, makes stars move faster as they get closer}
        { Havent gotten this to look very good yet }
    {
        if count mod 15 = 0 then
          begin
            if xv[i] > 0 then xv[i] := xv[i] + 1
            else if xv[i] < 0 then xv[i] := xv[i] - 1;

            if yv[i] > 0 then yv[i] := yv[i] + 1
            else if yv[i] < 0 then yv[i] := yv[i] - 1;
          end;
     }
        x[i] := x[i] + xv[i];
        y[i] := y[i] + yv[i];
        IF (x[i] > 320) or (x[i] < -320) or (y[i] > 240) or (y[i] < -240) THEN
          ResetStar(i);
        x2 := x[i];
        y2 := y[i];
        xyS := x2*x2+y2*y2;
        { x^2+y^2 = d^2 (distance from origin) would work better but slower}
        if xyS > 40000 then c[i] := 15
        else if xyS > 10000 then c[i] :=7
        else c[i] := 8;

        putpixel(x[i]+320,y[i]+240,c[i]);

      END;

        if keypressed then
          begin
            k := readkey;
            if k = 'q' then halt;
            if k = '6' then MoveRight;
            if k = '4' then MoveLeft;
            if k = '8' then MoveUp;
            if k = '2' then MoveDown;
            if k = '7' then MoveUpLeft;
            if k = '9' then MoveUpRight;
            if k = '1' then MoveDownLeft;
            if k = '3' then MoveDownRight;
            if k = '=' then dec(speed);
            if k = '-' then inc(speed);
          end;

    delay(20);
    FOR i := 1 TO MAX DO
      putpixel(x[i]+320,y[i]+240,0);

    UNTIL 1 = 2;
    END.

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