home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / crm_demo / magic / demo / m_demo / m_lines.c < prev    next >
C/C++ Source or Header  |  1994-04-30  |  4KB  |  177 lines

  1. /* Atari Demo: Bouncing lines */
  2.  
  3. /* --------------------------------------------------------------- *
  4.  * (c) Copyright Modula 2 Software Ltd 1986.  All rights reserved. *
  5.  * --------------------------------------------------------------- *
  6.  * (c) Copyright TDI Software Inc 1985, 1986. All rights reserved. *
  7.  * --------------------------------------------------------------- *
  8.  *         Portiert auf MAGICLIB by Peter Hellinger  06.01.91      *
  9.  * --------------------------------------------------------------- *
  10.  *   Portiert nach Pascal, angepasst an Magic 4.00   04.08.93/Hp   *
  11.  * --------------------------------------------------------------- *
  12.  *   Portiert nach C                           4/94 Dirk Stadler   *
  13.  * ----------------------------------------------------------------*/
  14.  
  15. #include <magic.h>
  16. #include <stddef.h>
  17.  
  18. #define maxLines  30
  19. #define SMALLER   0x4000  /* MULTITOS >= 1.08 */
  20.  
  21. typedef int LineDescr[4];
  22.  
  23. /* Globale Variablen */
  24. int GraphWin, TimerId;
  25. int maxX, maxY, min;
  26. int index, t, i, new, old, ii, color, colcount;
  27. int fback;
  28. GRECT r;
  29. LineDescr Ball, Vel, max;
  30. LineDescr _Lines[maxLines];
  31.  
  32. void TheLines(void);
  33.  
  34. /* 
  35.     Zeichnet Linien.
  36. */
  37. void DrawLines()
  38. {
  39.     if (new >= maxLines) {        
  40.         /* Lösche alte Linie */
  41.         vsl_color(DefaultWS.Handle, fback);
  42.         v_pline(DefaultWS.Handle, 2, _Lines[old % maxLines]);
  43.         old++;
  44.     }
  45.     /* Zeichne neue Linie */
  46.     for (i=0; i<=3; i++)
  47.         _Lines[new % maxLines][i] = Ball[i];
  48.     new++;
  49.     vsl_color(DefaultWS.Handle, color);
  50.     v_pline(DefaultWS.Handle, 2, Ball);     
  51. } /* DrawLines */
  52.  
  53. /* 
  54.     Timerhandler, der alle 10 ms Linien ausgibt. 
  55. */
  56. void LinesTimer()
  57. {
  58.     int i;
  59.     
  60.     if (GraphWin > 0) {
  61.         if (!WinIconified(GraphWin)) {
  62.             for (i=0; i<=3; i++) {
  63.                 t = Ball[i] + Vel[i];
  64.                 if (t >= max[i]) {
  65.                     t = max[i] * 2 - Vel[i] - Ball[i];
  66.                     Vel[i] *= -1;
  67.                 }
  68.                 if (!(i % 2))
  69.                     min = r.g_y;
  70.                 else
  71.                     min = r.g_x;
  72.                 if (t < min) {
  73.                     if (t < 0)
  74.                         t *= -1;
  75.                     else
  76.                         t = min;
  77.                     Vel[i] *= -1;
  78.                 }
  79.                 Ball[i] = t;
  80.             }
  81.             
  82.             /* Linien ausgeben */
  83.             RewriteWindow(GraphWin, DefaultWS.Handle, DrawLines);
  84.             colcount++;
  85.             if (colcount > 10) {
  86.                 color++;
  87.                 if (color >= DefaultWS.DefColors)
  88.                     color = 0;
  89.                 if (color == fback)
  90.                     color++;
  91.                 colcount = 0;
  92.             }
  93.         }
  94.     }
  95. } /* LinesTimer */
  96.  
  97. /*
  98.     Der Fensterhandler für das Graphikfenster.
  99. */
  100. void LinesWinHandler(PtrWinPara w)
  101. {
  102.     w->action = 0;  /* Erstmal nicht reagieren */
  103.     
  104.     switch (w->message) {
  105.         case WinRedraw:        TheLines();
  106.                             break;
  107.         case WinTopped:        w->action = wTopped;
  108.                             break;
  109.         case WinClosed:        GraphWin = -1;
  110.                             RemoveMUTIMER(TimerId);
  111.                             w->action = wClose;
  112.                             break;
  113.         case WinFulled:        TheLines();
  114.                             w->action = wFulled;
  115.                             break;
  116.         case WinSized:        TheLines();
  117.                             w->action = wSized;
  118.                             break;
  119.         case WinMoved:        SetWinPos(GraphWin, w->spec.g_x, w->spec.g_y);
  120.                             TheLines();
  121.                             break;
  122.         case WinBottomed:    w->action = wBottom;
  123.                             break;
  124.         case WinIconify:    w->action = wIconify;
  125.                             break;
  126.         case WinUniconify:    w->action = wUniconify;
  127.     }
  128. } /* LinesWinHandler */
  129.  
  130. /* 
  131.     Normales Fenster öffnen und Timerhandler installieren. 
  132. */
  133. void TheLines()
  134. {
  135.     int i;
  136.     
  137.     if (GraphWin < 0) {
  138.         GraphWin = OpenWindow(LinesWinHandler,
  139.                               MOVER | NAME | CLOSER | SIZER | FULLER | SMALLER, 0,
  140.                               fback, 7, -1, -1, 250, 200, 0, 0, 0, 0,
  141.                               " The Lines ", "", NULL, NULL);
  142.         TimerId = InstMUTIMER(LinesTimer, 10);
  143.     }
  144.     
  145.     GetUseableRect(GraphWin, &r);
  146.     maxX = r.g_x + r.g_w;
  147.     maxY = r.g_y + r.g_h;
  148.     max[0] = maxX;
  149.     max[1] = maxY;
  150.     max[2] = maxX;
  151.     max[3] = maxY;
  152.     
  153.     for (i=0; i<=3; i++) {
  154.         Vel[i] = RndInt(16) - 8;
  155.         ii = max[i] - 100;
  156.         Ball[i] = RndInt(ii) + 50;
  157.     }
  158.     
  159.     new = old = 0;
  160. } /* TheLines */
  161.  
  162. /* 
  163.     Dient zur Initialisierung der Variablen. 
  164. */
  165. void Lines()
  166. {
  167.     GraphWin = -1;
  168.     colcount = 0;
  169.     if (DefaultWS.DefColors > 2)
  170.         fback = 1;
  171.     else
  172.         fback = 0;
  173.     color = fback + 1;
  174. } /* Lines */
  175.                 
  176.                             
  177.