This is SWMeteor.m in view mode; [Download] [Up]
#import "SWMeteor.h" #import "SpaxeWars.h" #import "ActorMgr.h" #import "SoundMgr.h" @implementation SWMeteor static int wobble; - activate:sender :(int)tag { NXSize tsize = {37,35}; NXSize t2 = {18,18}; wobble = (++wobble) & 1; [super activate:sender :tag]; [self reinitWithImage:"swmeteor" frameSize:&tsize numFrames:1 shape: CIRCLE alliance: DESTROYALL radius: 18 buffered: YES x: randBetween(wobble?xOffset:-xOffset,xOffset+2) y: randBetween(wobble?-yOffset:yOffset,yOffset+2) theta: randBetween(0,2*PI) vel: randBetween(5,10) interval: 1000000 distToCorner: &t2]; [self wrapAtDistance: (xOffset+1) :(yOffset+1)]; [self bounceAtDistance: (xOffset) :(yOffset)]; hits = 0; return self; } - killAndReplace { Actor *dude = (Actor *)[actorMgr newActor:xx_explosion for:self tag:1]; [dude setXvYv:xv :yv sync:NO]; [soundMgr playSound: EXP1SND at:0.5]; [actorMgr destroyActor:self]; [actorMgr newActor:(int)[self class] for:self tag:1]; return self; } - positionChanged { if ((x < 10) && (x > -10) && (y < 10) && (y > -10)) { [self killAndReplace]; return self; } if (sw_bounce) [self bounceAtDistance: (xOffset) :(yOffset)]; else [self wrapAtDistance: (xOffset+10) :(yOffset+10)]; [super positionChanged]; return self; } #define MAXV 30 - calcDxDy:(NXPoint *)dp { x *=2; y*=2; if (sw_gravity) [self swApplyGravity]; x/=2; y/=2; if (xv > MAXV) xv = MAXV; else if (xv < -MAXV) xv = -MAXV; if (yv > MAXV) yv = MAXV; else if (yv < -MAXV) yv = -MAXV; return [super calcDxDy:(NXPoint *)dp]; } - performCollisionWith:(Actor *) dude { if (++hits < 5) return self; [self killAndReplace]; return nil; } - (BOOL) doYouHurt:sender { Actor *dude = (Actor *)sender; if (dude->actorType == xx_swbullet) { xv += dude->xv * .12; yv += dude->yv * .12; } return YES; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.