This is Fish.m in view mode; [Download] [Up]
#ifndef NS3x #import "Thinker.h" #import <defaults/defaults.h> #else #import "Thinker3.h" #endif #import "Fish.h" #import "FishBrain.h" #import <appkit/Application.h> #import "RotImage.h" #import <dpsclient/wraps.h> #import <appkit/View.h> #import <stdio.h> #import <libc.h> #import <math.h> #include <sys/stat.h> #define FISHPICTS 20 // Maximum number without recompile #define NUMBER_OF_FRAMES 1 // Need more frames eventually @implementation Fish - init:sender { NXRect bufferRect; struct stat statbuf; char appDirectory[MAXPATHLEN], *lastSlash, fishfile[MAXPATHLEN]; aquarium = sender; sizeOfAquar.width = 700; sizeOfAquar.height = 700; srandom(currentTimeInMs()); do { #ifndef NS3x strcpy(appDirectory,NXArgv[0]); lastSlash = rindex(appDirectory,'/'); strcpy((lastSlash?lastSlash+1:appDirectory),"FishFolder"); sprintf(fishfile,"%s/fish.%d.tiff",appDirectory,random() % FISHPICTS + 1); #else sprintf(fishfile,"%s/FishFolder/fish.%d.tiff",[BSThinker() moduleDirectory:"Aquarium"],(int)(random() % FISHPICTS + 1)); #endif } while(stat(fishfile,&statbuf) == -1); fish = [[RotImage allocFromZone:[self zone]] initFromFile:fishfile]; [fish getSize:&bufferRect.size]; bufferRect.size.width /= (NUMBER_OF_FRAMES); WIDTH=bufferRect.size.width; HEIGHT=bufferRect.size.height; brain = [[FishBrain allocFromZone:[self zone]] init:&sizeOfAquar fishSize:&bufferRect.size owner:fish]; bufferRect.size.width += MAX_X_SPEED; bufferRect.size.height += MAX_Y_SPEED; buffer = [[NXImage alloc] initSize:&bufferRect.size]; if ([buffer lockFocus]) { [self clearBuffer]; [buffer unlockFocus]; } return self; } - move:listOfFish { NXRect tmpRect, myRect = {0,0,0,0}; NXPoint otherTo = {0,0}; NXRect new; int x = 0; id tmpObject; new.origin.x = [brain getXPos]; new.origin.y = [brain getYPos]; new.size.width = WIDTH + (MAX_X_SPEED/2); new.size.height = HEIGHT + (MAX_Y_SPEED/2); [buffer lockFocus]; [self clearBuffer]; /* * The semantics that I'm using for this is that the lower indices are * 'behind' this fish. The one after it in the list are in 'front' of it. */ while((tmpObject = [listOfFish objectAt:x++]) != self) { tmpRect = [tmpObject getRect]; if (NXIntersectsRect(&tmpRect,&new)) { otherTo.x = tmpRect.origin.x - new.origin.x + (MAX_X_SPEED/2); otherTo.y = tmpRect.origin.y - new.origin.y + (MAX_Y_SPEED/2); [tmpObject simpleDraw:&otherTo]; } } // Draw me. myRect.origin.x += (MAX_X_SPEED/2); myRect.origin.y += (MAX_Y_SPEED/2); [self simpleDraw:&myRect.origin]; // Here is where to draw other fish in front of this one. while((tmpObject = [listOfFish objectAt:x++]) != self && tmpObject != nil) { tmpRect = [tmpObject getRect]; if (NXIntersectsRect(&tmpRect,&new)) { otherTo.x = tmpRect.origin.x - new.origin.x + (MAX_X_SPEED/2); otherTo.y = tmpRect.origin.y - new.origin.y + (MAX_Y_SPEED/2); [tmpObject simpleDraw:&otherTo]; } } [buffer unlockFocus]; [buffer composite:NX_COPY toPoint:&new.origin]; old = new; return self; } - viewDidResize; { NXSize imageSize; NXRect rect; // old.l = old.r = old.b = old.t = fishTo.x = fishTo.y = 0; [aquarium getFrame:&rect]; sizeOfAquar = rect.size; [fish getSize:&imageSize]; [brain viewDidResize:&sizeOfAquar]; return self; } -(NXRect)getRect { NXRect tmp; tmp = old; tmp.size.width += (2*MAX_X_SPEED) + 1; tmp.size.height += (2*MAX_Y_SPEED) + 1; return tmp; } -simpleDraw:(NXPoint *)point { [fish composite:NX_SOVER toPoint:point]; return self; } -clearBuffer { // Buffer must have already have the focus locked on it for this to work. NXRect tmp = {0,0,0,0}; [buffer getSize:&tmp.size]; PSsetgray(NX_BLACK); NXRectFill(&tmp); return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.