This is FlexyCubeViewPart.m in view mode; [Download] [Up]
#import "FlexyCubeViewPart.h" #import "Thinker.h" #import <appkit/NXImage.h> #import <appkit/Panel.h> #import <dpsclient/wraps.h> #import <libc.h> #import <math.h> #import "FlexyCubeWraps.h" #define ACCELERATION 1.15 #define FLEXY 0.5 #define CUBESIZE 150 #define MINSPEED 1 @implementation FlexyCubeView - drawSelf:(const NXRect *)rects :(int)rectCount { if (!rects || !rectCount) return self; [super drawSelf:rects :rectCount]; [self drawCube: 1.0]; return self; } - drawCube: (float) gray { float x, y, w, h; x = imageRect.origin.x; y = imageRect.origin.y; w = imageRect.size.width; h = imageRect.size.height; if (x < 0.0) { w += x; x = 0.0; } else if (x + w > bounds.size.width) w = bounds.size.width - x; if (y < 0.0) { h += y; y = 0.0; } else if (y + h > bounds.size.height) h = bounds.size.height - y; // Avoid leaving border smudges x += 1; y += 1; w -= 2; h -= 2; if (w <= 0 || h <= 0) // Ugh, this won't do. return self; PSgsave(); PStranslate(x, y); drawNeXTCube(w, h, gray); PSgrestore(); return self; } - adjustSpeed: (float *) speedp minSpeed: (float) minSpeed maxSpeed: (float) maxSpeed pos: (float *) posp iMin: (float) iMin iMax: (float) iMax { float speed = *speedp; float pnt = *posp; if (pnt < iMin) { if (speed < 0) speed /= ACCELERATION; else speed *= ACCELERATION; } else if (pnt > iMax) { if (speed > 0) { speed /= ACCELERATION; } else speed *= ACCELERATION; } else if (fabs(speed) < maxSpeed) speed *= ACCELERATION; else if (fabs(speed) > maxSpeed) speed /= ACCELERATION; // Change direction when we start going too slowly if (fabs(speed) < minSpeed) speed = -speed; pnt += speed; *posp = pnt; *speedp = speed; return self; } - oneStep { static int xCount = 100, yCount = 150; NXPoint iMin, iMax; float x, y; iMin.x = 0.0; iMin.y = 0.0; iMax.x = maxCoord.x; iMax.y = maxCoord.y; x = imageRect.origin.x; y = imageRect.origin.y; PSsetgray(0); NXRectFill(&imageRect); [self adjustSpeed: &delta.x minSpeed: MINSPEED maxSpeed: targetSpeed.x pos: &x iMin: iMin.x iMax: iMax.x]; [self adjustSpeed: &delta.y minSpeed: MINSPEED maxSpeed: targetSpeed.y pos: &y iMin: iMin.y iMax: iMax.y]; imageRect.origin.x = x; imageRect.origin.y = y; [self drawCube: 1.0]; // Every once in an odd moon, change the targetSpeeds if (--xCount < 0) { xCount = random() % 1000; targetSpeed.x = randBetween(3,12); } if (--yCount < 0) { yCount = random() % 1000; targetSpeed.y = randBetween(3,12); } return self; } - initFrame:(NXRect *)frameRect { [super initFrame: frameRect]; imageRect.size.width = imageRect.size.height = CUBESIZE; return self; } - setImageConstraints { [super setImageConstraints]; if (imageRect.origin.x > maxCoord.x || imageRect.origin.y > maxCoord.y) { imageRect.origin.x = randBetween(0, maxCoord.x); imageRect.origin.y = randBetween(0, maxCoord.y); } delta.x = targetSpeed.x = 6; delta.y = targetSpeed.y = 5; return self; } - setImage: image { return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.