home *** CD-ROM | disk | FTP | other *** search
/ Nebula 2 / Nebula Two.iso / Apps / ScreenSavers / BackSpaceViews / SnakesView.BackModule / SnakesView.m < prev    next >
Encoding:
Text File  |  1995-06-12  |  4.0 KB  |  191 lines

  1. //
  2. // SnakesView.m
  3. //
  4. // Matt Pharr- pharr@cs.yale.edu
  5. //
  6.  
  7. #import "SnakesView.h"
  8. #import <dpsclient/wraps.h>
  9. #import <libc.h>
  10.  
  11. #define MAX_SNAKES            11
  12. #define BEFORE_REDRAW         1000
  13. #define max(x,y)              ((x) > (y) ? (x) : (y))
  14. #define MIN_X                 (bounds.origin.x)
  15. #define MAX_X                 (bounds.size.width)
  16. #define MIN_Y                 (bounds.origin.y)
  17. #define MAX_Y                 (bounds.size.height)
  18.  
  19. typedef struct {
  20.     NXPoint position;
  21.     NXPoint move_vector;
  22.     int radius;
  23.     float color;
  24.     float d_color;
  25.     float r,g,b;
  26. } SNAKE;
  27.  
  28. SNAKE snakes[MAX_SNAKES];
  29.  
  30. @implementation SnakesView
  31.  
  32. - oneStep
  33. {
  34.     int i;
  35.  
  36.     if (++nSteps >= BEFORE_REDRAW) {
  37.     usleep(500000);
  38.     nSteps= 0;
  39.     aliveSnakes= 0;
  40.     }
  41.     if (aliveSnakes == 0) {
  42.         PSsetgray(0.0);
  43.     NXRectFill(&bounds);
  44.     }
  45.  
  46.     if (((aliveSnakes < nSnakes) && (random() % 30 == 1)) ||
  47.         (aliveSnakes == 0)) {
  48.     snakes[aliveSnakes].position.x= random() % (int)MAX_X;
  49.     snakes[aliveSnakes].position.y= MAX_Y;
  50.     if (random() % 2 == 1)
  51.             snakes[aliveSnakes].move_vector.x= (5 + random () % 10) * (MAX_X / 1100);
  52.     else 
  53.             snakes[aliveSnakes].move_vector.x= (-5 - random () % 10) * (MAX_X / 1100);
  54.  
  55.     if (random() % 2 == 1)
  56.             snakes[aliveSnakes].d_color= randBetween(0.0,0.04);
  57.     else
  58.             snakes[aliveSnakes].d_color= -1 * randBetween(0.0,0.04);
  59.  
  60.     snakes[aliveSnakes].move_vector.y= -1 * random() % 15;
  61.     snakes[aliveSnakes].radius= 10 + random() % 30;
  62.     snakes[aliveSnakes].color= randBetween(0.0,1.0);
  63.     snakes[aliveSnakes].r= randBetween(0.0,1.0);
  64.     snakes[aliveSnakes].g= randBetween(0.0,1.0);
  65.     snakes[aliveSnakes].b= randBetween(0.0,1.0);
  66.     ++aliveSnakes;
  67.     }
  68.  
  69.     [self lockFocus];
  70.     for (i= 0; i < aliveSnakes; ++i) {
  71.     PSsetgray(0.0);
  72.     PSarc(snakes[i].position.x, max(snakes[i].position.y, snakes[i].radius+1),
  73.           snakes[i].radius+1, 0, 360);
  74.     PSstroke();
  75.  
  76.     snakes[i].color += snakes[i].d_color;
  77.     if (snakes[i].color > 1 || snakes[i].color < 0)
  78.             snakes[i].d_color *= -1;
  79.  
  80.     if ([Window defaultDepthLimit] == NX_TwoBitGrayDepth) {
  81.         PSsetgray(snakes[i].color);
  82.     }
  83.     else {
  84.         PSsetrgbcolor(snakes[i].r, snakes[i].g, snakes[i].b);
  85.     }
  86.  
  87.     PSarc(snakes[i].position.x, max(snakes[i].position.y, snakes[i].radius),
  88.           snakes[i].radius, 0, 360);
  89.     PSfill();
  90.     }
  91.     [self unlockFocus];
  92.  
  93.     for (i= 0; i < aliveSnakes; ++i) {
  94.     snakes[i].position.x += snakes[i].move_vector.x;
  95.     snakes[i].position.y += snakes[i].move_vector.y;
  96.     snakes[i].move_vector.y -= 2;
  97.         /*    snakes[i].move_vector.y *= randBetween(.975,.996); */
  98.         /* a little air resistance... */
  99.  
  100.     if (snakes[i].position.x - snakes[i].radius < MIN_X) {
  101.         snakes[i].move_vector.x= random() % 15;
  102.     }
  103.     if (snakes[i].position.x + snakes[i].radius > MAX_X) {
  104.         snakes[i].move_vector.x= -1 * random() % 15;
  105.     }
  106.  
  107.     if (snakes[i].position.y < MIN_Y) {
  108.         snakes[i].position.y= MIN_Y;
  109.         snakes[i].move_vector.y *= -.9;
  110.     }
  111.     }
  112.  
  113.     return self;
  114. }
  115.  
  116.  
  117. - initFrame:(const NXRect *)frameRect
  118. {
  119.     [super initFrame:frameRect];
  120.  
  121.     [self inspector:self];
  122.  
  123.     if (NXGetDefaultValue([NXApp appName], "snakesNumber") == NULL) {
  124.     NXWriteDefault([NXApp appName], "snakesNumber", "6");
  125.     nSnakes= 6;
  126.     }
  127.     else {
  128.     nSnakes= atoi(NXGetDefaultValue([NXApp appName], "snakesNumber"));
  129.     }
  130.     if (nSnakes < 1) nSnakes= 1;
  131.  
  132.     [nSnakesSlider setIntValue:nSnakes];
  133.  
  134.     return self;
  135. }
  136.  
  137.  
  138. - drawSelf:(const NXRect *)rects :(int)rectCount
  139. {
  140.     if (!rects || !rectCount) {
  141.     return self;
  142.     }
  143.  
  144.     PSsetgray(0.0);
  145.     NXRectFill(rects);
  146.  
  147.     return self;
  148. }
  149.  
  150.  
  151. - (const char *)windowTitle
  152. {
  153.     return "Snakes";
  154. }
  155.  
  156.  
  157. - (BOOL)useBufferedWindow
  158. {
  159.     return YES;
  160. }
  161.  
  162.  
  163. - inspector:sender
  164. {
  165.     char buf[MAXPATHLEN];
  166.  
  167.     if (!inspectorPanel) {
  168.     sprintf(buf,"%s/%s",[(BSThinker()) moduleDirectory:"Snakes"],"Snakes.nib");
  169.     [NXApp loadNibFile:buf owner:self withNames:NO];
  170.     }
  171.  
  172.     return inspectorPanel;
  173. }
  174.  
  175.  
  176. -setNSnakes:sender
  177. {
  178.     char temp[40];
  179.     
  180.     nSnakes= [sender intValue];
  181.     aliveSnakes= 0;
  182.  
  183.     sprintf(temp, "%d", nSnakes);
  184.     NXWriteDefault([NXApp appName], "snakesNumber", temp);
  185.  
  186.     return self;
  187. }
  188.  
  189.  
  190. @end
  191.