home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1990 / 09 / tricks / space.pas < prev    next >
Pascal/Delphi Source File  |  1990-06-15  |  5KB  |  169 lines

  1. (* ------------------------------------------------------ *)
  2. (*                       SPACE.PAS                        *)
  3. (*         Unit zum Erzeugen eines Sternenhimmels         *)
  4. (*          (c) 1990 Andreas Heinemann & TOOLBOX          *)
  5. (* ------------------------------------------------------ *)
  6. UNIT SPACE;
  7.  
  8. INTERFACE
  9.  
  10. USES Graph;
  11.  
  12. CONST max_stars                 = 250;
  13.       max_layers                = 4;
  14.  
  15. TYPE  star                      = RECORD
  16.                                     x, y, pix : WORD;
  17.                                   END;
  18.       space_layer               = ARRAY [1..max_stars] OF
  19.                                      star;
  20.       space_layer_Ptr           = ^space_layer;
  21.       space_typ                 = ARRAY [1..max_layers] OF
  22.                                      space_layer_Ptr;
  23.       space_data                = RECORD
  24.             x1, y1, x2, y2  : WORD;
  25.             layer_stars  : ARRAY[1..max_layers] OF WORD;
  26.             layer_jmp    : ARRAY[1..max_layers] OF INTEGER;
  27.             color        : WORD;
  28.             space_VAR    : space_typ;
  29.                                   END;
  30.       space_data_Ptr            = ^space_data;
  31.  
  32. CONST starMem                   = SizeOf(star);
  33.  
  34. PROCEDURE init_space(Ptr : space_data_Ptr);
  35. PROCEDURE Dispose_space(Ptr : space_data_Ptr);
  36. PROCEDURE put_space(Ptr : space_data_Ptr);
  37. PROCEDURE Move_layer(Ptr : space_data_Ptr;nr : INTEGER);
  38. PROCEDURE clear_layer(Ptr : space_data_Ptr;nr : INTEGER);
  39. PROCEDURE Move_layer_ndsp(Ptr : space_data_Ptr;
  40.                           nr : INTEGER);
  41. PROCEDURE put_layer(Ptr : space_data_Ptr;nr : INTEGER);
  42. PROCEDURE Move_space(Ptr : space_data_Ptr);
  43. PROCEDURE Move_space_snow(Ptr : space_data_Ptr);
  44.  
  45. IMPLEMENTATION
  46.  
  47. PROCEDURE init_space(Ptr : space_data_Ptr);
  48. VAR i, h : INTEGER;
  49. BEGIN
  50.  WITH Ptr^ DO
  51.       FOR i := 1 TO max_layers DO
  52.           GetMem(space_VAR[i], StarMem * layer_stars[i]);
  53.  
  54.  WITH Ptr^ DO
  55.       FOR h := 1 TO max_layers DO
  56.           FOR i := 1 TO layer_stars[h] DO
  57.               WITH space_VAR[h]^[i] DO
  58.                    REPEAT
  59.                           x := x1 + Random(x2 - x1);
  60.                           y := y1 + Random(y2 - y1);
  61.                    UNTIL GetPixel(x, y) <> color;
  62. END;
  63.  
  64. PROCEDURE put_space(Ptr : space_data_Ptr);
  65. VAR i, h : INTEGER;
  66. BEGIN
  67.  WITH Ptr^ DO
  68.       FOR h := 1 TO max_layers DO
  69.           FOR i := 1 TO layer_stars[h] DO
  70.               WITH space_VAR[h]^[i] DO BEGIN
  71.                    pix := GetPixel(x, y);
  72.                    PutPixel(x, y, color);
  73.       END;
  74. END;
  75.  
  76. PROCEDURE Move_layer(Ptr : space_data_Ptr;nr : INTEGER);
  77. VAR i : INTEGER;
  78. BEGIN
  79.  WITH Ptr^ DO
  80.       FOR i := 1 TO layer_stars[nr] DO
  81.           WITH space_VAR[nr]^[i] DO BEGIN
  82.                PutPixel(x, y, pix);           { Sterne weg }
  83.  
  84.             REPEAT BEGIN
  85.                IF x + layer_jmp[nr] <= x1 THEN BEGIN
  86.                   x := x2;
  87.                   y := y1 + Random(y2 - y1);
  88.                END;
  89.  
  90.                x := x + layer_jmp[nr];
  91.                IF x >= x2 THEN BEGIN
  92.                   x := x1;
  93.                   y := y1 + Random(y2 - y1);
  94.                END;
  95.  
  96.                pix := GetPixel(x, y);
  97.  
  98.             END UNTIL pix <> color;
  99.  
  100.             PutPixel(x, y, color);
  101.           END;
  102. END;
  103.  
  104. PROCEDURE clear_layer(Ptr : space_data_Ptr;nr : INTEGER);
  105. VAR i : INTEGER;
  106. BEGIN
  107.  WITH Ptr^ DO
  108.       FOR i := 1 TO layer_stars[nr] DO
  109.           WITH space_VAR[nr]^[i] DO
  110.                PutPixel(x, y, pix);           { Sterne weg }
  111. END;
  112.  
  113. PROCEDURE Move_layer_ndsp(Ptr : space_data_Ptr;
  114.                           nr : INTEGER);
  115. VAR i : INTEGER;
  116. BEGIN
  117.  WITH Ptr^ DO
  118.       FOR i := 1 TO layer_stars[nr] DO
  119.           WITH space_VAR[nr]^[i] DO BEGIN
  120.                REPEAT
  121.                       IF x + layer_jmp[nr] <= x1 THEN BEGIN
  122.                          x := x2;
  123.                          y := y1 + Random(y2 - y1);
  124.                       END;
  125.  
  126.                       x := x + layer_jmp[nr];
  127.                       IF x >= x2 THEN BEGIN
  128.                          x := x1;
  129.                          y := y1 + Random(y2 - y1);
  130.                       END;
  131.  
  132.                       pix := GetPixel(x, y);
  133.                UNTIL pix <> color;
  134.          END;
  135. END;
  136.  
  137. PROCEDURE Move_space(Ptr : space_data_Ptr);
  138. VAR i : INTEGER;
  139. BEGIN
  140.  FOR i := 1 TO max_layers DO
  141.      Move_layer(Ptr, i);
  142. END;
  143.  
  144. PROCEDURE put_layer(Ptr : space_data_Ptr;nr : INTEGER);
  145. VAR i : INTEGER;
  146. BEGIN
  147.  WITH Ptr^ DO
  148.       FOR i := 1 TO layer_stars[nr] DO
  149.           WITH space_VAR[nr]^[i] DO
  150.                PutPixel(x, y, color);
  151. END;
  152.  
  153. PROCEDURE Move_space_snow(Ptr : space_data_Ptr);
  154. VAR i : INTEGER;
  155. BEGIN
  156.  FOR i := 1 TO max_layers DO clear_layer(Ptr, i);
  157.  FOR i := 1 TO max_layers DO Move_layer(Ptr, i);
  158.  FOR i := 1 TO max_layers DO put_layer(Ptr, i);
  159. END;
  160.  
  161. PROCEDURE Dispose_space(Ptr : space_data_Ptr);
  162. VAR i : INTEGER;
  163. BEGIN
  164.  WITH Ptr^ DO
  165.       FOR i := 1 TO max_layers DO
  166.           FreeMem(space_VAR[i], StarMem * layer_stars[i]);
  167. END;
  168. END.
  169.