|
|
1.1 root 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: NXRectFill(&imageRect);
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.