This is Bullet.m in view mode; [Download] [Up]
#import "Bullet.h" #import "ActorMgr.h" #import "SoundMgr.h" #import "DisplayManager.h" #import "Xoxeroids.h" @implementation Bullet static int lastBulletSound; - activate:sender :(int)tag { NXSize tsize = {3,2}; NXSize t2 = {1.5, 1.0}; Actor *dude = (Actor *)sender; float xfactor = -sin(dude->theta), yfactor = cos(dude->theta); [super activate:sender :tag]; speed = (tag & BUL_SLOW) ? 22: 24; [self reinitWithImage:"bullets1" frameSize:&tsize numFrames:8 shape: RECTCIRC alliance: dude->alliance radius: 1.5 buffered: NO x: dude->x + dude->radius * xfactor y: dude->y + dude->radius * yfactor theta: dude->theta vel: dude->vel + speed interval: 80 distToCorner: &t2]; xv = dude->xv + xfactor * speed; yv = dude->yv + yfactor * speed; expireTime = timeInMS + 2200; if (timeInMS > (lastBulletSound + 125)) { lastBulletSound = timeInMS + (timeInMS & 0xf); [soundMgr playSound: BULLET1SND at:0.5]; } [self setBulletImage:tag]; return self; } - setBulletImage:(int)tag { switch (tag & BUL_CORN) { case BUL_SPIN: min_frame = 0; max_frame = 3; break; case BUL_PLUS: interval = 3000; min_frame = max_frame = 4; break; case BUL_RECT: interval = 3000; min_frame = max_frame = 5; break; case BUL_CORN: interval = 120; min_frame = 6; max_frame = 7; break; } if (!(tag & BUL_IMAGE)) min_frame = -1; return self; } - positionChanged { if ((min_frame >= 0) && (timeInMS > changeTime)) { changeTime = timeInMS + interval; if (++frame > max_frame) frame = min_frame; } return self; } - calcDxDy:(NXPoint *)dp { if (timeInMS > expireTime) [actorMgr destroyActor:self]; dp->x = timeScale * xv; dp->y = timeScale * yv; return self; } // the default behavior composites, but the drawrect routine is faster. - draw { if (min_frame >= 0) return [super draw]; drawRect.size = frameSize; [displayMgr drawWhiteRect:&drawRect]; eraseRect = drawRect; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.