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

    {
    From: JUSTIN GREER

    > I have recently coded a program that gives a three layer starfield
    > moving only accross the monitor.  I am looking for some code that
    > will give a 'warp' kinda feeling. (The stars coming at you, like that
    > windows screen saver.)  Any help, even just some mathematics would be
    > greatly appriciated.
    > Thanks

    Well, a while ago I wrote one of these that seems to work real well...
    I just spent a half-hour or so doing it, because the only ones I had
    were in future crew type demos, and I wanted a screen saver one... Here
    ya' go:

    Here's a program I've been working on a little lately--It shows
    a 3D star field with 256 colors used.  I haven't seen this particular
    type of star program anywhere outside of demos and things, and I thought
    it might be helpful.  I haven't had time to really optimize it yet,
    and it is pretty math-intensive, so it's not the fastest thing in the
    world (even though it's a little too fast on my 486dx2/66 =|).
    You can shange most of the variables in the program for different
    effects--Things like the maximum stars and stuff.  I am running TP7, and
    I have not tried this with other versions, but it should work fine
    as far as I know.
    }

    {$G+,N+}
    PROGRAM TPSTARS;
    USES CRT;
    VAR
      STD,SCRNX,SCRNY,SCRNC,Z:ARRAY [1..200] OF WORD;
      X,Y:ARRAY [1..200] OF INTEGER;
      I:WORD;

    PROCEDURE INIT;
    BEGIN
      FOR I := 1 TO 200 DO
        BEGIN
          X [I] := RANDOM(1000)-500;
          Y [I] := RANDOM(800)-400;
          Z [I] := RANDOM(1846)+202;
          STD [I] := ROUND(SQR(X[I])+SQR(Y[I]));
        END;
      ASM
        MOV AX,013H
        INT 10H
      END;
      PORT[$3C8]:=1;
      FOR I := 1 TO 255 DO
        BEGIN
          PORT[$3C9]:=ROUND((256-I)/4);
          PORT[$3C9]:=ROUND((256-I)/4);
          PORT[$3C9]:=ROUND((256-I)/4);
        END;
    END;
    PROCEDURE RESETSTAR;
     BEGIN
      Z[I]:=2048;
      X[I]:=RANDOM(1000)-500;
      Y[I]:=RANDOM(800)-400;
      STD [I] := ROUND(SQR(X[I])+SQR(Y[I]));
    END;
    PROCEDURE CLOSEDOWN;ASSEMBLER;
    ASM
      MOV AX,003H
      INT 10H
    END;
    PROCEDURE MOVESTARS;
    BEGIN
      repeat
      FOR I := 1 TO 200 DO
        BEGIN
          mem [$a000:(scrny[i] shl 8+ scrny[i] shl 6)+scrnx[i]]:=0;
          dec(Z[I]);{:=Z[I]-1;}
          IF Z[I] < 2 THEN RESETSTAR;
          SCRNX[I]:=(300*X[I]) DIV Z[I]+160;
          SCRNY[I]:=(300*Y[I]) DIV Z[I]+100;
          IF SCRNX[I] > 319 THEN RESETSTAR;
          IF SCRNY[I] > 199 THEN RESETSTAR;
           IF SCRNX[I] < 0 THEN RESETSTAR;
          IF SCRNY[I] < 0 THEN RESETSTAR;
          SCRNC[I]:=Round(SQRT(SQR(Z[I])+STD[I]) / 9)+1;
          mem [$a000:(scrny[i] shl 8+ scrny[i] shl 6)+scrnx[i]]:=scrnc[i];
        END;
      UNTIL Keypressed;
    END;
    BEGIN
      INIT;
      MOVESTARS;
      CLOSEDOWN;
    END.

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