This is AnalogClockView.m in view mode; [Download] [Up]
// // AnalogClockView.m // // Matt Pharr- pharr@cs.yale.edu // #import "AnalogClockView.h" #import "AnalogClockWraps.h" #import "AnalogClockWraps.c" #import <appkit/graphics.h> #import <libc.h> #import <dpsclient/wraps.h> #import <time.h> #import <math.h> #import <strings.h> #import <appkit/NXImage.h> #import <appkit/publicWraps.h> @implementation AnalogClockView - fixPosition { if (currentLocation.x + currentSize.width >= bounds.size.width) currentLocation.x = bounds.size.width - currentSize.width; if (currentLocation.x <= bounds.origin.x) currentLocation.x = 0; if (currentLocation.y + currentSize.height >= bounds.size.height) currentLocation.y = bounds.size.height - currentSize.height; if (currentLocation.y <= bounds.origin.y) currentLocation.y = 0; return self; } - bounceIfNeeded { if (currentLocation.x + currentSize.width >= bounds.size.width) moveVector.x= (-1) * randBetween(0.5, 1.5); if (currentLocation.x <= bounds.origin.x) // keep it ON the screen moveVector.x= randBetween(0.5, 1.5); if (currentLocation.y + currentSize.height >= bounds.size.height) moveVector.y= (-1) * randBetween(0.5, 1.5); if (currentLocation.y <= bounds.origin.y) moveVector.y= randBetween(0.5, 1.5); return self; } - oneStep { time_t tTime; struct tm *currentTime; NXPoint p={ 0, CLOCK_HEIGHT+24}; currentLocation.x += moveVector.x; // move the x and y positions of the image currentLocation.y += moveVector.y; // as indicated by the move vectors [self bounceIfNeeded]; [self fixPosition]; time(&tTime); currentTime= localtime(&tTime); if (secs != currentTime->tm_sec) { if (mins != currentTime->tm_min) { if ([hourMinuteImage lockFocus] == YES) { hours= currentTime->tm_hour; mins= currentTime->tm_min; drawHourMinuteFace(hours % 12, mins, CLOCK_WIDTH, CLOCK_HEIGHT, hasColor); [hourMinuteImage unlockFocus]; } } secs= currentTime->tm_sec; currentLocation.x += moveVector.x; // move it one more time so it's not so jerky currentLocation.y += moveVector.y; // when the time changes... [self bounceIfNeeded]; [self fixPosition]; if ([currentImage lockFocus] == YES) { [hourMinuteImage composite:NX_COPY toPoint:&p]; drawSecond(secs, CLOCK_WIDTH, CLOCK_HEIGHT, hasColor); [currentImage unlockFocus]; } } [currentImage composite:NX_COPY toPoint:¤tLocation]; usleep((1*1000000)/68); // sleep a few vblanks return self; } - (const char *)windowTitle { return "Analog Clock"; } - drawSelf:(const NXRect *)rects :(int)rectCount { if (!rects || !rectCount) { return self; } PSsetgray(0); NXRectFill(rects); return self; } - initFrame:(const NXRect *)frameRect { [super initFrame:frameRect]; currentLocation.x= 400.0; currentLocation.y= 400.0; moveVector.x= randBetween(0.5, 1.5); moveVector.y= randBetween(0.5, 1.5); currentSize.width= CLOCK_WIDTH + 24; currentSize.height= CLOCK_HEIGHT + 24; currentImage= [[NXImage alloc] initSize:¤tSize]; [currentImage setFlipped:YES]; hourMinuteImage= [[NXImage alloc] initSize:¤tSize]; [hourMinuteImage setFlipped:YES]; secs= -1; // force it to redraw the bitmap the first time through mins= -1; if ([Window defaultDepthLimit] == NX_TwoBitGrayDepth) { // monochrome screen? hasColor= 0; } else hasColor= 1; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.