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

{
Hmmm, this is a small, but neat routine. Really something to post. I hope you
like it. Made by Jeroen Bouwens, Holland. This routine is PD, Freeware and
Smileware, which means bla..blabla...blablabla. Got it? See ya! :-)

O Yeah, I nearly forgot. It is a perspective scroller that comes right at you.
}
Uses Crt;

Var
  I,J,XS,YS,TL,EP,AD,XT,YT,ZY         : Integer;
  Alpha,Beta,Gamma,G,Tel              : Integer;
  XX,YY,ZZ,BX,BY                      : Integer;
  Exists                              : Boolean;
  Tof,TSeg,SL,ArrayTel,Lof            : Word;
  VX,VY,VZ                            : Real;
  XT1,YT1,ZT1                         : Real;
  Offsets                             : Array[0..160*50] Of Word;
  Colors                              : Array[0..160*50] Of Byte;
  Cosinus,Sinus                       : Array [0..360] of Real;
  Tekst                               : String;

Procedure Rotate(Var X,Y,Z:Real;Alpha,Beta,Gamma:Integer);
Var X1,X2,Y1,Y2,Z1,Z2 : Real;
Begin
  X1:=X;
  Y1:=Cosinus[Alpha]*Y-Sinus[Alpha]*Z;
  Z1:=Sinus[Alpha]*Y+Cosinus[Alpha]*Z;
  X2:=Cosinus[Beta]*X1+Sinus[Beta]*Z1;
  Y2:=Y1;
  Z2:=Cosinus[Beta]*Z1-Sinus[Beta]*X1;
  X:=Cosinus[Gamma]*X2-Sinus[Gamma]*Y2;
  Y:=Sinus[Gamma]*X2+Cosinus[Gamma]*Y2;
  Z:=Z2;
End;{Rotate}

Procedure PrecalcPoints;
Begin
  For I:=0 To 360 Do Begin
    Cosinus[I]:=Cos(I/57.29578);
    Sinus[I]:=Sin(I/57.29578);
  End;
  G:=250;{Find some well working value for this (250 is fine for VZ=300) }
  Alpha:=320; Beta:=310; Gamma:=330;{Change these for an other orientation of
                                     the scroll}
  VX:=0; VY:=0; VZ:=300;             {Don't make VZ 0 -> division by zero!!}
  XX:=-160; YY:=-25; ZZ:=0;
  For I:=1 To 160*50 do Begin
    XT1:=XX; YT1:=YY; ZT1:=Cos(XX/10)*2+Sin(YY/5)*2; {Play with these!}
    Colors[I]:=Round(ZT1*3+44);
    Rotate(XT1,YT1,ZT1,Alpha,Beta,Gamma);
    BX:=160+Round((XT1*G)/(ZT1+VZ));
    BY:=100+Round((YT1*G*0.8333)/(ZT1+VZ));
    Offsets[I]:=320*BY+BX;
    Mem[$A000:Offsets[I]]:=15;
    Inc(YY);
    If YY>=24  Then Begin
      YY:=-25;
      XX:=XX+2;{Also change size of arrays:Offsets,Colors if you change this}
      If XX>=159 Then Begin XX:=-160; YY:=-25; End;
    End;
  End;
  FillChar(Mem[$A000:0],64000,0);
End;

Begin
  Asm Mov AX,$13; Int $10 End;
  PrecalcPoints;
  Tekst:='                    '+
         'Well, this is an interesting routine (and it seems to work too '+
         ':-)                    ';
  TOf:=Ofs(Tekst); TSeg:=Seg(Tekst);
  Tel:=0;
  Repeat
    For TL:=0 To 7 Do Begin
      ArrayTel:=8*49+1;
      For I:=1 To 19 Do Begin
        SL:=Mem[TSeg:TOf+I+Tel];
        LOf:=$FA6E+SL*8;
        For XS:=0 To 7 Do Begin
          For YS:=1 To 8 Do Begin
            If (Mem[$F000:LOf] And (128 Shr XS))<>0 Then Begin
              Mem[$A000:Offsets[ArrayTel-TL*49]]:=Colors[ArrayTel-TL*49];
              Mem[$A000:Offsets[ArrayTel+1-TL*49]]:=Colors[ArrayTel-TL*49];
              Mem[$A000:Offsets[ArrayTel+2-TL*49]]:=Colors[ArrayTel-TL*49];
              Mem[$A000:Offsets[ArrayTel+3-TL*49]]:=Colors[ArrayTel-TL*49];
              Mem[$A000:Offsets[ArrayTel+4-TL*49]]:=Colors[ArrayTel-TL*49];
              Mem[$A000:Offsets[ArrayTel+5-TL*49]]:=Colors[ArrayTel-TL*49];
            End Else Begin
              Mem[$A000:Offsets[ArrayTel-TL*49]]:=0;
              Mem[$A000:Offsets[ArrayTel+1-TL*49]]:=0;
              Mem[$A000:Offsets[ArrayTel+2-TL*49]]:=0;
              Mem[$A000:Offsets[ArrayTel+3-TL*49]]:=0;
              Mem[$A000:Offsets[ArrayTel+4-TL*49]]:=0;
              Mem[$A000:Offsets[ArrayTel+5-TL*49]]:=0;
            End;
            Inc(Lof);
            Inc(ArrayTel,6);
          End;
          Dec(Lof,8);
          Mem[$A000:Offsets[ArrayTel-TL*49]]:=0;
          Inc(ArrayTel);
        End;
      End;
    End;
    Inc(Tel); If Tel>=Length(Tekst)-20 Then Tel:=0;
  Until KeyPressed;
End.


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