home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.0 / NeXTSTEP3.0.iso / NextDeveloper / Examples / AppKit / BackspaceViews / FlexyCube / FlexyCubeView.m < prev    next >
Encoding:
Text File  |  1992-02-18  |  3.0 KB  |  183 lines

  1. #import "FlexyCubeView.h"
  2. #import "Thinker.h"
  3. #import <appkit/NXImage.h>
  4. #import <appkit/Panel.h>
  5. #import <dpsclient/wraps.h>
  6. #import <libc.h>
  7. #import <math.h>
  8.  
  9. #import "FlexyCubeWraps.h"
  10.  
  11. #define ACCELERATION    1.15
  12. #define FLEXY  0.5
  13.  
  14. #define CUBESIZE    150
  15. #define MINSPEED    1
  16.  
  17. @implementation FlexyCubeView
  18.  
  19. - drawSelf:(const NXRect *)rects :(int)rectCount
  20. {
  21.     if (!rects || !rectCount) return self;
  22.     [super drawSelf:rects :rectCount];
  23.     [self drawCube: 1.0];
  24.     return self;
  25. }
  26.  
  27. - drawCube: (float) gray
  28. {
  29.     float x, y, w, h;
  30.  
  31.     x = imageRect.origin.x;
  32.     y = imageRect.origin.y;
  33.     w = imageRect.size.width;
  34.     h = imageRect.size.height;
  35.  
  36.     if (x < 0.0) {
  37.         w += x;
  38.         x = 0.0;
  39.     } else if (x + w > bounds.size.width)
  40.         w = bounds.size.width - x;
  41.  
  42.     if (y < 0.0) {
  43.         h += y;
  44.         y = 0.0;
  45.     } else if (y + h > bounds.size.height)
  46.         h = bounds.size.height - y;
  47.  
  48.     // Avoid leaving border smudges
  49.     x += 1; y += 1; w -= 2; h -= 2;
  50.  
  51.     if (w <= 0 || h <= 0)
  52.     // Ugh, this won't do.
  53.         return self;
  54.  
  55.     PSgsave();
  56.     PStranslate(x, y);
  57.  
  58.     drawNeXTCube(w, h, gray);
  59.  
  60.     PSgrestore();
  61.  
  62.     return self;
  63. }
  64.  
  65. - adjustSpeed: (float *) speedp
  66.     minSpeed: (float) minSpeed
  67.     maxSpeed: (float) maxSpeed
  68.     pos: (float *) posp
  69.     iMin: (float) iMin
  70.     iMax: (float) iMax
  71. {
  72.     float speed = *speedp;
  73.     float pnt = *posp;
  74.  
  75.     if (pnt < iMin)
  76.     {
  77.         if (speed < 0)
  78.             speed /= ACCELERATION;
  79.         else
  80.             speed *= ACCELERATION;
  81.     }
  82.     else if (pnt > iMax)
  83.     {
  84.         if (speed > 0)
  85.         {
  86.             speed /= ACCELERATION;
  87.         }
  88.         else
  89.             speed *= ACCELERATION;
  90.     }
  91.     else if (fabs(speed) < maxSpeed)
  92.         speed *= ACCELERATION;
  93.     else if (fabs(speed) > maxSpeed)
  94.         speed /= ACCELERATION;
  95.  
  96.     // Change direction when we start going too slowly
  97.     if (fabs(speed) < minSpeed)
  98.         speed = -speed;
  99.  
  100.     pnt += speed;
  101.  
  102.     *posp = pnt;
  103.     *speedp = speed;
  104.  
  105.     return self;
  106. }
  107.  
  108. - oneStep
  109. {
  110.     static int xCount = 100, yCount = 150;
  111.     
  112.     NXPoint iMin, iMax;
  113.     float x, y;
  114.  
  115.     iMin.x = 0.0;
  116.     iMin.y = 0.0;
  117.     iMax.x = maxCoord.x;
  118.     iMax.y = maxCoord.y;
  119.  
  120.     x = imageRect.origin.x;
  121.     y = imageRect.origin.y;
  122.  
  123.     PSsetgray(0);
  124.     NXRectFi'3imageRect);
  125.  
  126.     [self adjustSpeed: &delta.x minSpeed: MINSPEED maxSpeed: targetSpeed.x
  127.      pos: &x iMin: iMin.x iMax: iMax.x];
  128.     [self adjustSpeed: &delta.y minSpeed: MINSPEED maxSpeed: targetSpeed.y
  129.      pos: &y iMin: iMin.y iMax: iMax.y];
  130.  
  131.     imageRect.origin.x = x;
  132.     imageRect.origin.y = y;
  133.  
  134.     [self drawCube: 1.0];
  135.  
  136.     // Every once in an odd moon, change the targetSpeeds
  137.     if (--xCount < 0)
  138.     {
  139.         xCount = random() % 1000;
  140.         targetSpeed.x = randBetween(3,12);
  141.     }
  142.     if (--yCount < 0)
  143.     {
  144.         yCount = random() % 1000;
  145.         targetSpeed.y = randBetween(3,12);
  146.     }
  147.  
  148.     return self;
  149. }
  150.  
  151. - initFrame:(NXRect *)frameRect
  152. {
  153.     [super initFrame: frameRect];
  154.  
  155.     imageRect.size.width = imageRect.size.height = CUBESIZE;
  156.  
  157.     return self;
  158. }
  159.  
  160. - setImageConstraints
  161. {
  162.     [super setImageConstraints];
  163.  
  164.     if (imageRect.origin.x > maxCoord.x ||
  165.         imageRect.origin.y > maxCoord.y)
  166.     {
  167.         imageRect.origin.x = randBetween(0, maxCoord.x);
  168.         imageRect.origin.y = randBetween(0, maxCoord.y);
  169.     }
  170.  
  171.     delta.x = targetSpeed.x = 6;
  172.     delta.y = targetSpeed.y = 5;
  173.  
  174.     return self;
  175. }
  176.  
  177. - setImage: image
  178. {
  179.     return self;
  180. }
  181.  
  182. @end
  183.