This is LinesView.m in view mode; [Download] [Up]
#import "LinesView.h" #import "Thinker.h" #import <appkit/appkit.h> #import <dpsclient/wraps.h> #import <libc.h> #import <math.h> #import "LinesView.h" #define RANDINT(n) (random() % (n+1)) // Return random integer 0..n #define XVEL corners[count].xVel // Some slimy shortcuts, asuuming we're #define YVEL corners[count].yVel // using "count" as corner counter. #define XLOC corners[count].xLoc #define YLOC corners[count].yLoc #define MAXVEL 12 // Maximum velocity of corners @implementation LinesView - initFrame:(NXRect *) frameRect { [super initFrame: frameRect]; drawOp = dps_ustroke; [self setNumberOfCorners:self]; userPath = newUserPath(); return self; } - (int) intValue { return 17; } - setNumberOfCorners:sender { int count; int oldNumCorners = numCorners; /* set the number of corners based on the "corners" slider */ numCorners = MIN(MAXNUMCORNERS, MAX([sender intValue], MINNUMCORNERS)); /* set the new corner starting positions & velocities */ for (count = oldNumCorners; count < numCorners; count++) { XLOC = (int)(bounds.size.width) / 2; YLOC = (int)(bounds.size.height) / 2; XVEL = (RANDINT(4) ? 1 : -1) * (1 + RANDINT(MAXVEL/2)); YVEL = (RANDINT(4) ? 1 : -1) * (1 + RANDINT(MAXVEL/2)); } [self display]; return self; } - drawSelf:(const NXRect *)rects :(int)rectCount { int count; /* fill with the background color */ PSsetgray(NX_BLACK); NXRectFill(&bounds); PSsetgray(NX_WHITE); PSsetlinewidth(0.0); /* "plot" the points */ beginUserPath(userPath, NO); for (count = 0; count < numCorners; count++) { if (count) { UPlineto(userPath, XLOC, YLOC); } else { UPmoveto(userPath, XLOC, YLOC); } } closePath(userPath); /* count=0; * PSnewpath(); * PSmoveto(XLOC,YLOC); * for(count=1;count < numCorners; count++) { * PSlineto(XLOC,YLOC); * } * PSclosepath(); * PSeofill(); */ /* draw it */ //endUserPath(userPath, dps_ustroke); endUserPath(userPath, drawOp); sendUserPath(userPath); return self; } - oneStep { int count; for (count = 0; count < numCorners; count++) { XLOC += XVEL; YLOC += YVEL; /* * Detect collision with sides; if we collide, bounce back in some * random fashion. */ if (XLOC >= bounds.size.width) { XLOC = bounds.size.width-1; XVEL = -1-RANDINT(MAXVEL); } else if (XLOC < bounds.origin.x) { XLOC = bounds.origin.x; XVEL = 1+RANDINT(MAXVEL); } if (YLOC >= bounds.size.height) { YLOC = bounds.size.height-1; YVEL = -1-RANDINT(MAXVEL); } else if (YLOC < bounds.origin.y) { YLOC = bounds.origin.y; YVEL = 1+RANDINT(MAXVEL); } } [self drawSelf:&bounds :1]; return self; } - free { freeUserPath(userPath); return [super free]; } - inspector:sender { char blah[256]; if (!linesInspector) { [NXBundle getPath:blah forResource:"lines" ofType:"nib" inDirectory:[sender moduleDirectory:"Lines"] withVersion:0]; [NXApp loadNibFile:blah owner:self withNames:NO]; } return linesInspector; } - setDrawOp: sender { int newOp=[[sender selectedCell] tag]; switch(newOp) { case 0: drawOp = dps_ustroke; break; case 1: drawOp = dps_ufill; break; case 2: drawOp = dps_ueofill; break; } return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.