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


{Program to simulate travel through a star field - try a different MaxStar}
uses
  TpCrt, TpInline, Graph;    {OpInline used for HiWord only}
const
  MaxStar = 50;                        {num stars}
  MaxHistory = 3;                      {points per streak, = 2**n -1, note mask on line #59}
type
  T_HistoryPoint = record
                     hX, hY : Integer;
                   end;
  T_Star = record
             X, Y       : LongInt;           {star position}
             DX, DY     : LongInt;         {delta}
             DXPositive,
             DYPositive : Boolean;
             Speed      : Word;
             History    : array[0..MaxHistory] of T_HistoryPoint; {Position history}
             HistIndex  : Byte;
           end;
  T_StarArray = array[1..MaxStar] of T_Star;
var
  Gd,
  Gm,
  i,
  j       : Integer;

  Color   : Word;

  A       : T_StarArray;
  BoundX,
  BoundY,
  CenterX,

  CenterY : LongInt;

  Angle   : Real;

  Shift   : Byte;

BEGIN
  Gd := Detect;
  InitGraph(Gd, Gm, '\turbo\tp');
  if GraphResult <> grOk then
    Halt(1);
  Color := GetMaxColor;
  BoundX := GetMaxX * 65536;
  BoundY := GetMaxY * 65536;
  CenterX := GetMaxX * 32768;
  CenterY := GetMaxY * 32768;
  FillChar(A, SizeOf(A), $FF);
  Randomize;
  {Background}
  for i := 1 to 1500 do
    PutPixel(Random(GetMaxX), Random(GetMaxY), Color);
  {Stars}
  repeat
    for i := 1 to MaxStar do
      with A[i] do
        begin
          if (X < 0) or (X > BoundX) or (Y < 0) or (Y > BoundY) then
            begin
            {Position is off-screen, go back to center, new angle}
              Angle := 6.283185 * Random;
              Speed := Random(2000) + 1000;
              DX := Round(Speed * Sin(Angle));
              DY := Round(Speed * Cos(Angle));
              X := 300 * DX + CenterX;
              Y := 300 * DY + CenterY;
              DXPositive := DX > 0;
              DYPositive := DY > 0;
              DX := Abs(DX);
              DY := Abs(DY);
            {Erase all of old line segment}
              for j := 0 to MaxHistory do
                with History[j] do
                  PutPixel(hX, hY, 0);
            end
          else
            begin               {Plot point}
              Inc(HistIndex);                {Next slot in history}
              HistIndex := HistIndex and $03; { <-- change for new MaxHistory!}
              with History[HistIndex] do
                begin
                  PutPixel(hX, hY, 0);         {Erase inner dot of line segment}
                  hX := HiWord(X);
                  hY := HiWord(Y);
                  PutPixel(hX, hY, Color);     {New outer dot of line segment}
                end;
        {Next point}
              if DXPositive then
                Inc(X, DX)
              else
                Dec(X, DX); {Add delta}
              if DYPositive then
                Inc(Y, DY)
              else
                Dec(Y, DY);
              case Speed of
                1000..1300 : Shift := 9;
                1300..1600 : Shift := 8;
                1600..2100 : Shift := 7;
                2100..2700 : Shift := 6;
                2700..2900 : Shift := 5;
                2900..3000 : Shift := 4;
              end;
              Inc(DX, DX shr Shift);         {Increase delta to accelerate}
              Inc(DY, DY shr Shift);
            end;
        end;
  until KeyPressed;
  ReadLn;
  CloseGraph;
END.


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