This is SwarmView.m in view mode; [Download] [Up]
/* ** XSwarm ** ====== ** ** Purpose: Display a swarm of bees chasing a wasp. ** ** Features: uses only integer math ** has no redeeming social value ** ** Comments: Most of this program is greatly rewritten by me, but the ** initial math and update stuff is left over from the older ** program. Much of the NeXT related stuff is from LizardSaver. ** ** Created: by Jeff Butterworth on 7/11/90 ** butterwo@cs.unc.edu ** ** NeXTPoRT: Kurt Werle ** frsvnsvn!kurt@crash.cts.com ** ** Updated: by Kurt Werle on 10/28/91 ** */ /* Standard Includes */ #import "Thinker.h" #import <appkit/NXImage.h> #import <appkit/Panel.h> // for NXRunAlertPanel() //#import <appkit/appkit.h> #import <dpsclient/wraps.h> #import <libc.h> #import <math.h> /* For those of you who want to know what version you are using. */ /* Includes for this project. */ #import "SwarmView.h" @implementation SwarmView - initFrame:(NXRect *)frameRect { [super initFrame:frameRect]; [self newSize]; [NXApp loadNibSection:"SwarmPrefs.nib" owner:self]; winNum=[[self window] windowNum]; return self; } - sizeTo:(NXCoord)width :(NXCoord)height { [super sizeTo:width :height]; mywidth = width; myheight = height; return self; } - newSize { int b; /* Get the random number generator ready. */ srandom(getpid()); times = TIMES; /* number of time steps recorded */ newbees = bees = BEES; /* number of bees */ wasp_vel = WASPVEL; /* maximum wasp speed */ bee_vel = BEEVEL; /* maximum bee speed */ wasp_acc = WASPACC; /* maximum wasp acceleration */ bee_acc = BEEACC; /* bee acceleration */ timeout = 0; /* time in seconds before screen saving */ border = BORDER; /* border limiting wasp travel */ verbose = FALSE; /* display settings if TRUE */ stay_in_front = FALSE; /* Try to stay in clear area of the screen. */ root = FALSE; /* display in root window */ cursortime = 0; /* Number of updates to follow the cursor */ /*alloc the mem*/ x = (int *) malloc(sizeof(int) * MAXBEES * times); y = (int *) malloc(sizeof(int) * MAXBEES * times); xv = (int *) malloc(sizeof(int) * MAXBEES); yv = (int *) malloc(sizeof(int) * MAXBEES); /* wasp */ wx[0] = BORDER + random() % (int) (mywidth - 2*BORDER); wy[0] = BORDER + random() % (int) (myheight - 2*BORDER); wx[1] = wx[0]; wy[1] = wy[0]; wxv = 0; wyv = 0; /* set up bees */ for (b = 0 ; b < MAXBEES ; b++) { X(0,b) = random() % 1000; /* Fudge */ /*X(0,b) = random() % mywidth; Why can't I use this?*/ X(1,b) = X(0,b); Y(0,b) = random() % 1000; /* Fudge */ /*Y(0,b) = random() % myheight; Why can't I use this?*/ Y(1,b) = Y(0,b); xv[b] = RAND(7); yv[b] = RAND(7); /* Initialize point positions, velocities, etc. */ } return self; } /* Animate() */ /* Move the swarm around. */ - oneStep { int b; /* bee index */ int dx,dy,distance; bees = newbees; /* These variables are related to mouse control of the wasp. */ /* <=- Wasp -=> */ /* Age the position arrays. */ wx[2] = wx[1]; wx[1] = wx[0]; wy[2] = wy[1]; wy[1] = wy[0]; PScurrentmouse(winNum, &curX, &curY); if (cursortime) /* If there's time left on the cursor count */ { wx[0] = (int) curX; wy[0] = (int) curY; } else { /* Accelerate */ wxv += RAND(wasp_acc); wyv += RAND(wasp_acc); /* Speed Limit Checks */ if (wxv > wasp_vel) wxv = wasp_vel; if (wxv < -wasp_vel) wxv = -wasp_vel; if (wyv > wasp_vel) wyv = wasp_vel; if (wyv < -wasp_vel) wyv = -wasp_vel; /* Move */ wx[0] = wx[1] + wxv; wy[0] = wy[1] + wyv; /* Bounce Checks */ if ((wx[0] < border)) { wxv = abs(wxv); } if ((wy[0] < border)) { wyv = abs(wyv); } if ((wx[0] > mywidth-border-1)) { wxv = -(abs(wxv)); } if ((wy[0] > myheight-border-1)) { wyv = -(abs(wyv)); } } /* Test the cursor */ if (mywidth - curX + myheight - curY <= 10.0) [self show]; /* Don't let things settle down. */ xv[random() % bees] += RAND(3); yv[random() % bees] += RAND(3); /* <=- Bees -=> */ for (b = 0 ; b < bees ; b++) { /* Age the arrays. */ X(2,b) = X(1,b); X(1,b) = X(0,b); Y(2,b) = Y(1,b); Y(1,b) = Y(0,b); /* Accelerate */ dx = wx[1] - X(1,b); dy = wy[1] - Y(1,b); distance = abs(dx)+abs(dy); /* approximation */ if (distance == 0) distance = 1; xv[b] += (dx*bee_acc)/distance; yv[b] += (dy*bee_acc)/distance; /* Speed Limit Checks */ if (xv[b] > bee_vel) xv[b] = bee_vel; if (xv[b] < -bee_vel) xv[b] = -bee_vel; if (yv[b] > bee_vel) yv[b] = bee_vel; if (yv[b] < -bee_vel) yv[b] = -bee_vel; /* Move */ X(0,b) = X(1,b) + xv[b]; Y(0,b) = Y(1,b) + yv[b]; } /* Erase previous, draw current, sync for smoothness. */ /* Draw Wasp */ if (1) { /*NXRect myrect = {0, 0, mywidth, myheight}; PSsetgray(0); NXRectFill(&myrect);*/ PSsetgray(1.0); PSmoveto(wx[0], wy[0]); PSlineto(wx[1], wy[1]); PSstroke(); /**/PSsetgray(0.0); PSmoveto(wx[1], wy[1]); PSlineto(wx[2], wy[2]); PSstroke();/**/ } /* Draw Bees */ { PSsetgray(1.0); for (b = 0 ; b < bees ; b++) { PSmoveto(X(0,b), Y(0,b)); PSlineto(X(1,b), Y(1,b)); } PSstroke(); PSsetgray(0.0); for (b = 0 ; b < bees ; b++) { PSmoveto(X(1,b), Y(1,b)); PSlineto(X(2,b), Y(2,b)); } PSstroke();/**/ } return self; } - (BOOL) useBufferedWindow { return NO; } - show { [myPrefWindow orderFront:nil]; return self; } - setNumberBees: sender { NXRect aRect = {0, 0, mywidth, myheight}; newbees = [sender intValue]; [beeText takeIntValueFrom:sender]; [self lockFocus]; PSsetgray(0.0); NXRectFill(&aRect); [self unlockFocus]; return self; } - setFollow: sender { cursortime = [sender intValue]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.