stars.pas 3.2 KB

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