This is Rocket.m in view mode; [Download] [Up]
#import "Rocket.h" #import "ActorMgr.h" #import "SoundMgr.h" #import "Explosion.h" #import "Xoxeroids.h" #import "Thinker.h" @implementation Rocket - activate:sender :(int)tag { NXSize tsize = {42,42}; NXSize tsize2 = {21,21}; Actor *dude = (Actor *)sender; float ttheta = (135. * (PI/180.) * (tag%8)); [super activate:sender :tag]; [self reinitWithImage:"rocket1" frameSize:&tsize numFrames:24 // shape: LINEARRAY shape: RECTCIRC alliance: EVIL radius: 21 buffered: YES x: dude->x - (sin(ttheta) * (dude->radius + 10)) y: dude->y + cos(ttheta) * (dude->radius + 10) theta: ttheta vel: randBetween(10,16) interval: 50 distToCorner: &tsize2]; hits = 0; turnRate = randBetween(0.8,1.2) * PI/30.0; wobbleRate = randBetween(0.8,1.2) * (2.0*PI) / 10.0; thrustState = timeInMS; chicken = tag & 1; pointValue = 100; return self; } + initialize { [super initialize]; [[NXApp delegate] addImageResource:"rocket1" for: self]; [[NXApp delegate] addImageResource:"rocket2" for: self]; return self; } - init { [super init]; r1 = [self findImageNamed:"rocket1"]; r2 = [self findImageNamed:"rocket2"]; return self; } - calcDxDy:(NXPoint *)dp { if (timeInMS >= moveChangeTime) { float aimX, aimY, desiredAngle, desiredChange; float dx,dy, dist; moveChangeTime = timeInMS + 100; dx = gx-x; dy=gy-y; dist = sqrt(dx*dx+dy*dy); wobble += wobbleRate; aimX = gx + .75 * dist * sin(wobble); aimY = gy - .75 * dist * cos(wobble); // desiredAngle = atan2(x - aimX, aimY - y); desiredAngle = atan2(aimX - x, y - aimY); desiredChange = theta - desiredAngle; if (desiredChange < PI) desiredChange += 2.0 * PI; if (desiredChange >= PI) desiredChange -= 2.0 * PI; if (desiredChange < PI) desiredChange += 2.0 * PI; if (desiredChange >= PI) desiredChange -= 2.0 * PI; if (desiredChange < -turnRate) desiredChange = -turnRate; if (desiredChange > turnRate) desiredChange = turnRate; theta += desiredChange; xv = vel * -sin(theta); yv = vel * cos(theta); } [super calcDxDy:dp]; return self; } - positionChanged { float t_theta; if (timeInMS > changeTime) { changeTime = timeInMS + interval; if (++thrustState & 1) image = r1; else image = r2; } while (theta < 0) theta += (2*PI); while (theta >= (2*PI)) theta -= (2*PI); t_theta = theta + (7.5 * PI / 180.0); if (t_theta >= 2.0*PI) t_theta -= 2.0*PI; frame = (t_theta/(15.0 * PI / 180.0)); [self wrapAtDistance: (3*xOffset) :(3*yOffset)]; return self; } - performCollisionWith:(Actor *) dude { id ret = self; if (++hits >= 4) { [soundMgr playSound: (EXP2SND) at:0.5]; [actorMgr newActor:xx_explosion for:self tag:1]; ret = [super performCollisionWith: dude]; } else { theta = atan2(dude->xv, -dude->yv); if (chicken) theta += PI; moveChangeTime = timeInMS; [soundMgr playSound: FUTILITYSND at:0.5]; } return ret; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.