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

    {-------------------------- SCHNIPP -----------------------------}

    {STARSCROLL.PAS geaenderte Fassung  }

    {$A+,B-,D-,E-,F+,I+,L-,N-,O-,R-,S-,V-}
    {$M 64000,0,655360}

    USES crt,graph,BGIDriv;                 {ich binde die Treiber ein}

    CONST MaxStars=500;                     {auf meinem 386-25er muss ich in
                                            der geaenderten Fassung schon 500
                                            Sterne eintragen, damit es nur noch
                                            ein wenig schneller ist als die alte
                                            Fassung mit 100 Sternen ;-)}

    TYPE Punkt=ARRAY[1..3] OF INTEGER;     {Siehe ganz unten Move()}

    VAR
       gd,gm,mpx,mpy,scal,a,b,e:integer;
       Stars1,Stars:ARRAY[1..MaxStars] OF Punkt;

       mx,my,m2x,m2y,sop,                   {siehe Init}
       act:INTEGER;

    PROCEDURE dpunkt( x,y,z, Col:integer);
    VAR n:INTEGER;
      BEGIN
       n:=z+e;

       {n=Nenner, nur einmal berechnen, geht schneller}

       PutPixel(mpx+ (scal*x div n),mpy+ (scal*y div n),col);

                     {hier nur integer-operationen}
      END;

    PROCEDURE dline( x1,y1,z1,x2,y2,z2:integer);
    VAR n1,n2:INTEGER;
      BEGIN
       n1:=z1+e;n2:=z2+e;  {n1=Nenner fuer 1.Punkt, n2=Nenner fuer 2.Punkt}

       Line(mpx+(scal*(x1 div n1)),mpy+(scal*(y1 div n1)),
            mpx+(scal*(x2 div n2)),mpy+(scal*(y2 div n2)));

          {Nix mit Round(xxx / nX), dauert zu lange: Integer ->Real ->Integer}
      END;

    PROCEDURE Init;
    begin
     act:=1;
     e:=1;
     scal := 2;

     mx:=getmaxx;     {damit man es auch in EgaLo oder anderen GModes}
     m2x:=mx shr 1;   {betreiben kann, alle Werte abhaengig von MaximalX und}
     my:=getmaxy;     {MaximalY}
     m2y:=my shr 1;
     mpx:=m2x;
     mpy:=m2y-(mpy shr 1);

     sop:=sizeof(punkt);  {Schreibt sich leichter :-) }
    end;

    BEGIN
      Randomize;
      gd:=ega;
      gm:=egahi;

      if RegisterBGIdriver(@EgaVgaDriverProc) < 0 then halt(255);

      InitGraph(gd,gm,'');  {oder InitGraph(gd,gm,'PathToDriver');}
      Init;
      FOR a:=0 TO 15 DO  SetRGBPalette(a,a*3,a*3,a*3);
      FOR a:=1 TO MaxStars DO
        BEGIN
          Stars[a,1]:=Random(mx)-m2x;
          Stars[a,2]:=Random(my)-m2y;
          Stars[a,3]:=Random(30)+1;
        END;

      Move(Stars,Stars1,SoP*MaxStars);      {man sollte Stars1 initialisieren}
                                            {wenn man es benutzt}
      SetColor(15);
      SetVisualPage(act);

      {AB hier kommt es auf Geschwindigkeit an}

      REPEAT
                {IF act=0 THEN act:=1 ELSE act:=0; dauert zu lange, deshalb:}
                {wenn (act)=1 -> act:=1-(1) = 0  wenn (act)=0 -> act:=1-(0)=1}
        act:=1-act;

        SetActivePage(act);
        FOR a:= 1 TO MaxStars DO
        BEGIN
          Stars[a,3]:=Stars[a,3]-1;
          IF stars[a,3]= 0 THEN
          BEGIN
            Stars[a,1]:=Random(mx)-m2x;
            Stars[a,2]:=Random(my)-m2y;
            Stars[a,3]:=30;
          END;
          dpunkt(Stars[a,1],Stars[a,2],Stars[a,3],15-(stars[a,3] shr 1));

                            {round(xxx/2) dauert zu lange {shr 1 = div 2 }
        END;
        SetVisualPage(act);

        act:=1-act;   {s.o.}

        SetActivePage(act);
        FOR a:=1 TO MaxStars DO
        BEGIN
          dpunkt(Stars1[a,1],Stars1[a,2],Stars1[a,3],0);

          {Wenn man Stars1 nicht initialisierst kommt es schon mal vor, dass
           man einen Division by Zero Error beim ersten beim 1. Aufruf erhaelt}

          move(stars[a],stars1[a],sop);

          {nicht einzeln uebertragen, Move ist schneller, deshalb auch Type Punkt}

        END;

        act:=1-act; {s.o.}

      UNTIL KeyPressed;

      closegraph;          {Nicht vergessen !!!! ;-) }
    END.

    {------------------------- SCHNAPP --------------------------------------}

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