This is Cannon.m in view mode; [Download] [Up]
#import "Cannon.h" #import "ActorMgr.h" #import "SoundMgr.h" #import "Explosion.h" #import "Xoxeroids.h" @implementation Cannon - activate:sender :(int)tag { NXSize tsize = {48,48}; NXSize tsize2 = {24,24}; [super activate:sender :tag]; [self reinitWithImage:"cannon1" frameSize:&tsize numFrames:4 shape: CIRCLE alliance: EVIL radius: tsize2.width buffered: YES x: randBetween(gx+xOffset/2, gx+5.5*xOffset) y: randBetween(gy+yOffset/2, gy+5.5*yOffset) theta: randBetween(0,2*PI) vel: randBetween(1,4) interval: 100 distToCorner: &tsize2]; hits = 0; frameDir = 1; pointValue = 125; return self; } - positionChanged { if (timeInMS > changeTime) { changeTime = timeInMS + interval; frame += frameDir; if (frame >= numFrames-1) frameDir = -1; else if (frame <= 0) frameDir = 1; } [self wrapAtDistance: (3*xOffset) :(3*yOffset)]; return self; } - calcDxDy:(NXPoint *)dp { if (timeInMS > moveChangeTime) { float dx, dy, dist; moveChangeTime = timeInMS + 1000; dx = gx-x; dy=gy-y; dist = sqrt(dx*dx+dy*dy); xv = vel * dx/dist; yv = vel * dy/dist; } [super calcDxDy:dp]; return self; } - performCollisionWith:(Actor *) dude { id ret = self; if (++hits >= 6) { [soundMgr playSound: (EXP3SND) at:0.5]; [actorMgr newActor:xx_explosion for:self tag:0]; ret = [super performCollisionWith: dude]; } else { [soundMgr playSound: FUTILITYSND at:0.5]; if ((timeInMS < panicTime) || !((hits-1)%3)) [self fire]; } panicTime = timeInMS+220; return ret; } - fire { lastFireTime = timeInMS; [actorMgr newActor:xx_cannonball for:self tag: ++currentCannon]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.