This is Warp1.m in view mode; [Download] [Up]
#import "Warp1.h"
#import "Thinker.h"
#define PI (3.141592653589)
@implementation Warp1
- init
{
[super init];
return self;
}
// Every module should have a first state
//since class info only gets loaded once
- setFirstState
{
int ii = 0;
starCounter = 0;
if(soundEnabled){
[pwrUpSnd play];
}
firstState = YES;
currentCycle = 1;
[self setCenter];
[starsObject setStarsStopped]; //put out all stars at once
[starsObject startStars];
starsStopped = NO;
starsStopping = NO;
totalStopped = 0;
for(ii = 0;ii < MAXLINES;ii++){
lines[ii].toggle = 1;
lines[ii].stopped = 0;
[self newLine:ii];
lines[ii].delay = randBetween(0.0,5.0); //override set value
}
return self;
}
- (BOOL)doUntilDone
{
int ii;
BOOL done;
done = NO;
if(!starsStopped || totalStopped < MAXLINES){
for(ii = 0;ii < MAXLINES;ii++){
if(lines[ii].delay < 0){
if(!lines[ii].toggle){ //erase line
[self eraseLine:ii];
if((lines[ii].dist1 > ceil(radius)) && !lines[ii].stopped){
//add new one
if(!starsStopping){
starCounter++;
lines[ii].toggle = 1;
[self newLine:ii];
//bring new one on screen
[self drawLine:ii];
}
else{
lines[ii].stopped = 1;
totalStopped++;
}
}
else {
if(!lines[ii].stopped)
[self newDist:ii];
}
}
else{ //draw line
[self drawLine:ii];
[self newDist:ii];
if((lines[ii].dist1) > ceil(radius)){
lines[ii].dist1 = lines[ii].oldDist1 =
lines[ii].startDist;
lines[ii].length = lines[ii].oldLength = 1;
lines[ii].toggle = 0;
}
}
}
else
lines[ii].delay--;
}
if(!starsStopping){
if(starCounter > MAXLINES){
currentCycle++;
starCounter = 0;
}
if(currentCycle > cycles){
if(soundEnabled)
[pwrDownSnd play];
[starsObject stopStars];
for(ii = 0;ii < MAXLINES;ii++){
lines[ii].delay = 0;
}
totalStopped = 0;
starsStopping = YES;
}
}
}
else{ //stars are stopping
if(starsStopped){
PSsetlinewidth(0.0); //reset
done = YES;
}
}
return done;
}
//takes theta and distance and stuffs it into point x & y
- convertToXY:(float)dist :(NXPoint *)point :(float)theta
{
point->x = floor(centerOfScreen.x + (dist * cos(theta)));
point->y = floor(centerOfScreen.y + (dist * sin(theta)));
return self;
}
//calculates new length and updates everything
- newDist:(int)index
{
lines[index].oldDist1 = lines[index].dist1;
lines[index].oldLength = lines[index].length;
if(lines[index].toggle)
lines[index].dist1 = lines[index].dist1 + lines[index].length;
else //erasing
lines[index].dist1 = lines[index].dist1 + lines[index].length;
lines[index].length = lines[index].length
+ objectSpeed;
if(lines[index].dist1 + lines[index].length > radius)
lines[index].length = radius - lines[index].dist1 + 5;
lines[index].r = randBetween(0,1); //random colors
lines[index].g = randBetween(0,1);
lines[index].b = randBetween(0,1);
return self;
}
//generate new line values
- newLine:(int)index
{
lines[index].dist1 = lines[index].oldDist1 = randBetween(0,radius);
lines[index].startDist = lines[index].dist1 - 2;
if(lines[index].startDist < 0.0)
lines[index].startDist = 0.0;
lines[index].length = lines[index].oldLength = 1.0;
lines[index].delay = floor(randBetween(30,startInterval));
lines[index].theta = randBetween(0,(2*PI));
lines[index].r = 1.0; //start out as white
lines[index].g = 1.0;
lines[index].b = 1.0;
return self;
}
//between 1 - 2
- setStarSpeed:sender
{
starSpeed = ([sender floatValue]);
return self;
}
// between 0-500
- setStartInterval: (Slider *)sender;
{
startInterval = [sender intValue];
return self;
}
//between 1 - 200
- setObjectSpeed: (Slider *)sender
{
objectSpeed =[sender floatValue];
return self;
}
- setBoundsRect:(NXRect *)r
{
bounds.origin.x = r->origin.x;
bounds.origin.y = r->origin.y;
bounds.size.width = r->size.width;
bounds.size.height = r->size.height;
return self;
}
- setCenter
{
float x,y;
centerOfScreen.x = (bounds.size.width / 2) + bounds.origin.x;
centerOfScreen.y = bounds.size.height / 2 + bounds.origin.y;
x = bounds.size.width;
y = bounds.size.height;
radius = (sqrt(x*x + y*y))/2;
return self;
}
- drawLine:(int)index
{
NXPoint p1,p2;
PSsetlinewidth(0.0);
[self convertToXY:lines[index].dist1 :&p1 :lines[index].theta];
[self convertToXY:(lines[index].dist1+lines[index].length)
:&p2 :lines[index].theta];
PSDrawLine(p1.x,p1.y,p2.x,p2.y,lines[index].r,
lines[index].g,lines[index].b);
return self;
}
- eraseLine:(int)index
{
NXPoint p1,p2;
PSsetlinewidth(4.0);
[self convertToXY:lines[index].dist1 :&p1 :lines[index].theta];
[self convertToXY:(lines[index].dist1+lines[index].length)
:&p2 :lines[index].theta];
PSDrawLine(p1.x,p1.y,p2.x,p2.y,0.0,0.0,0.0);
return self;
}
- setPwrDownSnd:(Sound *)theSound
{
pwrDownSnd = theSound;
return self;
}
- setPwrUpSnd:(Sound *)theSound;
{
pwrUpSnd = theSound;
return self;
}
- starsStopped
{
starsStopped = YES;
return self;
}
- setStarsOutlet:(id)starsOutlet;
{
starsObject = starsOutlet;
return self;
}
- (int)setCycleValue:(int)value;
{
int mutiplier;
// since this one cycles very fast, make it 9 times the slider value
// could be zero
mutiplier = 9;
if(!value)
value = 1;
else
value *= mutiplier;
cycles = value;
currentCycle = 1;
return mutiplier;
}
- windowSizeChanged
{
int ii;
[self setCenter];
starsStopped = NO;
starsStopping = NO;
totalStopped = 0;
for(ii = 0;ii < MAXLINES;ii++){
lines[ii].toggle = 1;
lines[ii].stopped = 0;
[self newLine:ii];
lines[ii].delay = randBetween(0.0,5.0); //override set value
}
return self;
}
- freeResources
{//not used in this module
return self;
}
- setSoundEnabled:(BOOL)enabled
{
soundEnabled = enabled;
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.