{-------------------------- 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 --------------------------------------}