stars.pas 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. PROGRAM Sterne;
  2. uses Exec, Graphics, Intuition, Utility;
  3. {$I tagutils.inc}
  4. CONST MAX_STERNE = 42;
  5. MAX_GESCHW = 15;
  6. TYPE Star = packed Record
  7. x,y :Integer;
  8. msin :Real;
  9. mcos :Real;
  10. d :Integer;
  11. v :Integer;
  12. End;
  13. VAR Scr :pScreen;
  14. Win :pWindow;
  15. Msg :pIntuiMessage;
  16. Ende :Boolean;
  17. Stars :Array[1..MAX_STERNE] of Star;
  18. factor :Real;
  19. col :Integer;
  20. dum :Longint;
  21. PROCEDURE newStern(num :Integer);
  22. BEGIN
  23. col:=Random(360);
  24. Stars[num].x := Scr^.Width shr 1;
  25. Stars[num].y := Scr^.Height shr 1;
  26. Stars[num].msin := sin(col*factor);
  27. Stars[num].mcos := cos(col*factor);
  28. Stars[num].d := 0;
  29. Stars[num].v := Random(MAX_GESCHW)+2;
  30. END;
  31. PROCEDURE moveStern(num :Integer);
  32. BEGIN
  33. Stars[num].d:=Stars[num].d+Stars[num].v;
  34. Stars[num].x:=Round(Stars[num].d*Stars[num].msin)+Scr^.Width shr 1;
  35. Stars[num].y:=Round(Stars[num].d*Stars[num].mcos)+Scr^.Height shr 1;
  36. {Inc(Stars[num].v);}
  37. END;
  38. PROCEDURE drawSterne;
  39. BEGIN
  40. For dum:=1 to MAX_STERNE Do Begin
  41. If Stars[dum].v=0 Then Begin
  42. If Random(10)>4 Then
  43. newStern(dum);
  44. End Else If Stars[dum].d>Scr^.Width shr 1 Then Begin
  45. SetAPen(Win^.RPort,0);
  46. If WritePixel(Win^.RPort,(Stars[dum].x),(Stars[dum].y))=0 Then;
  47. Stars[dum].v:=0;
  48. End Else Begin
  49. SetAPen(Win^.RPort,0);
  50. If WritePixel(Win^.RPort,(Stars[dum].x),(Stars[dum].y))=0 Then;
  51. moveStern(dum);
  52. col:=(Stars[dum].d shl 5) Div Scr^.Height shr 1;
  53. If col>7 Then
  54. col:=7;
  55. SetAPen(Win^.RPort,col);
  56. If WritePixel(Win^.RPort,(Stars[dum].x),(Stars[dum].y))=0 Then;
  57. End;
  58. End;
  59. END;
  60. PROCEDURE initSterne;
  61. BEGIN
  62. For dum:=1 to MAX_STERNE Do begin
  63. Stars[dum].x := Scr^.Width shr 1;
  64. Stars[dum].y := Scr^.Height shr 1;
  65. Stars[dum].msin := 0.0;
  66. Stars[dum].mcos := 0.0;
  67. Stars[dum].d := 0;
  68. Stars[dum].v := 0;
  69. end;
  70. factor:=PI/180;
  71. END;
  72. PROCEDURE CleanUp(str:string; code : Longint);
  73. BEGIN
  74. If Win<>Nil Then
  75. CloseWindow(Win);
  76. If (Scr<>Nil) then CloseScreen(Scr);
  77. if GfxBase <> nil then CloseLibrary(GfxBase);
  78. if str <> '' then writeln(str);
  79. Halt(code);
  80. END;
  81. PROCEDURE Init;
  82. var
  83. thetags : array[0..3] of tTagItem;
  84. BEGIN
  85. GfxBase := OpenLibrary(GRAPHICSNAME,0);
  86. if GfxBase = nil then CleanUp('no graphics.library',20);
  87. Scr:=Nil; Win:=Nil;
  88. thetags[0] := TagItem(SA_Depth, 3);
  89. thetags[1] := TagItem(SA_DisplayID, HIRES_KEY);
  90. thetags[2].ti_Tag := TAG_END;
  91. Scr := OpenScreenTagList(NIL,@thetags);
  92. If Scr=Nil Then CleanUp('No screen',20);
  93. thetags[0] := TagItem(WA_Flags, WFLG_BORDERLESS);
  94. thetags[1] := TagItem(WA_IDCMP, IDCMP_MOUSEBUTTONS);
  95. thetags[2] := TagItem(WA_CustomScreen, Longint(Scr));
  96. thetags[3].ti_Tag := TAG_DONE;
  97. Win:=OpenWindowTagList(Nil, @thetags);
  98. If Win=Nil Then CleanUp('No window',20);
  99. initSterne;
  100. SetRGB4(@Scr^.ViewPort, 0, $0,$0,$0);
  101. SetRGB4(@Scr^.ViewPort, 1, $3,$3,$3);
  102. SetRGB4(@Scr^.ViewPort, 2, $6,$6,$6);
  103. SetRGB4(@Scr^.ViewPort, 3, $b,$b,$b);
  104. SetRGB4(@Scr^.ViewPort, 4, $c,$c,$c);
  105. SetRGB4(@Scr^.ViewPort, 5, $d,$d,$d);
  106. SetRGB4(@Scr^.ViewPort, 6, $e,$e,$e);
  107. SetRGB4(@Scr^.ViewPort, 7, $f,$f,$f);
  108. END;
  109. BEGIN
  110. Init;
  111. Ende:=false;
  112. Repeat
  113. drawSterne;
  114. Msg:=pIntuiMessage(GetMsg(Win^.UserPort));
  115. If Msg<>Nil Then Begin
  116. ReplyMsg(Pointer(Msg));
  117. Ende:=true;
  118. End;
  119. Until Ende;
  120. CleanUp('',0);
  121. END.