This is StellaView.m in view mode; [Download] [Up]
/* Generated by Interface Builder */
#import "StellaView.h"
#import <appkit/appkit.h>
#import <dpsclient/dpsclient.h>
void RunStellaEntry(DPSTimedEntry te, double timeNow, void *data)
{
/* we set data to self so we can call this method from the timed entry */
[(StellaView *)data display];
}
@implementation StellaView
- showStar :(int)x :(int)y :(int)cycle
{
NXImage *myImage = NULL;
NXPoint myPoint;
switch(cycle)
{
case 0 : myImage = [NXImage findImageNamed:"Stella1"];break;
case 1 : myImage = [NXImage findImageNamed:"Stella2"];break;
case 2 : myImage = [NXImage findImageNamed:"Stella3"];break;
case 3 : myImage = [NXImage findImageNamed:"Stella4"];break;
case 4 : myImage = [NXImage findImageNamed:"Stella5"];break;
case 5 : myImage = [NXImage findImageNamed:"Stella6"];break;
case 6 : myImage = [NXImage findImageNamed:"Stella7"];break;
}
myPoint.x = x*STAR_WIDTH;
myPoint.y = y*STAR_HEIGHT;
[myImage composite:NX_COPY toPoint:&myPoint];
return self;
}
- deleteStar :(int)x :(int)y
{
NXRect myRect;
PSsetgray(0.0);
myRect.origin.x = x*STAR_WIDTH;
myRect.origin.y = y*STAR_HEIGHT;
myRect.size.width = STAR_WIDTH;
myRect.size.height = STAR_HEIGHT;
NXRectFill(&myRect);
return self;
}
- drawSelf:(const NXRect *)rects :(int)rectCount;
{
int count;
if(!flags.blankedscreen)
{
PSsetgray(0.0);
NXRectFill(&bounds);
flags.blankedscreen = TRUE;
}
// Show all the stars
for(count = 0; count < NUMBER_STARS; count++)
[self showStar :stars[count].x :stars[count].y :stars[count].cycle];
for(count = 0; count < NUMBER_STARS; count++)
{
if(!stars[count].forward)
stars[count].cycle--;
else
stars[count].cycle++;
if(stars[count].cycle == stars[count].magnitude)
stars[count].forward = !stars[count].forward;
if(stars[count].cycle == -1)
{
[self deleteStar :stars[count].x :stars[count].y];
[self makeMyStar:count];
}
}
return self;
}
- startAnimation
{
myTimedEntry =
DPSAddTimedEntry((float)0.1,
&RunStellaEntry,self,NX_BASETHRESHOLD);
return self;
}
- endAnimation
{
DPSRemoveTimedEntry(myTimedEntry);
return self;
}
- initFrame:(const NXRect *)frameRect
{
int count;
[super initFrame :frameRect];
flags.blankedscreen = FALSE;
width = frameRect->size.width/STAR_WIDTH;
height = frameRect->size.height/STAR_HEIGHT;
for(count = 0; count < NUMBER_STARS; count++)
stars[count].magnitude = 0;
for(count = 0; count < NUMBER_STARS; count++)
{
[self makeMyStar :count];
stars[count].cycle = random()%stars[count].magnitude;
stars[count].forward = random()%2;
}
return self;
}
- (BOOL)starExists :(int)x :(int)y
{
int count;
for(count = 0; count < NUMBER_STARS; count++)
if((stars[count].magnitude) && (stars[count].x == x) &&
(stars[count].y == y))
return TRUE;
return FALSE;
}
- makeMyStar :(int)number
{
int x,y;
do
{
x = random()%width;
y = random()%height;
}
while([self starExists :x :y]);
stars[number].x = x;
stars[number].y = y;
stars[number].cycle = 0;
stars[number].magnitude = random()%(MAX_MAGNITUDE-1)+1;
stars[number].forward = TRUE;
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.