|
|
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.