This is Cave.m in view mode; [Download] [Up]
#import "Cave.h" #import "ActorMgr.h" #import "SoundMgr.h" #import "Explosion.h" #import "Xoxeroids.h" #import "Bullet.h" extern int xx_ship; @implementation Cave - activate:sender :(int)tag { NXSize tsize = {150,150}; NXSize tsize2 = {75,75}; [super activate:sender :tag]; [self reinitWithImage:"cave" frameSize:&tsize numFrames:1 shape: LINEARRAY 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: 10000000 distToCorner: &tsize2]; // a cave is deconstructed into 8 lines for further collision testing complexShapeCnt = 8; mySmile = [actorMgr newActor:(int)[Smiley class] for:self tag:0]; return self; } - positionChanged { [super positionChanged]; [self wrapAtDistance: (3*xOffset) :(3*yOffset)]; [mySmile moveTo:(x-30) :(y-5)]; mySmile->xv = xv; mySmile->yv = yv; return self; } - performCollisionWith:(Actor *) dude { // [soundMgr playSound: FUTILITYSND at:0.5]; return self; } static XXLine myShape[] = { 99,148,0,118, 0,118,0,31, 0,31,78,0, 106,0,148,48, 108,128,15,100, 15,100,16,49, 16,49,90,13, 90,13,135,64 }; - constructComplexShape { int i; for (i=0; i<8; i++) { cave[i] = myShape[i]; cave[i].x1 += x - 75; cave[i].x2 += x - 75; cave[i].y1 += y - 75; cave[i].y2 += y - 75; } complexShapePtr = (NXRect *)(&cave[0]); return self; } - (BOOL) doYouHurt:sender { Actor *dude = (Actor *)sender; if (dude->actorType == xx_bullet) { [(Bullet *)dude setBulletImage:0]; // shots simply return dude->xv = -dude->xv; dude->yv = -dude->yv; dude->theta += PI; dude->alliance = DESTROYALL; return NO; } return YES; } @end @implementation Smiley - activate:sender :(int)tag { NXSize tsize = {40,40}; NXSize tsize2 = {20,20}; Actor *dude = (Actor *)sender; [super activate:sender :tag]; [self reinitWithImage:"smiley" frameSize:&tsize numFrames:4 shape: CIRCLE alliance: EVIL radius: tsize2.width buffered: YES x: dude->x - 30 y: dude->y - 5 theta: dude->theta vel: 0 interval: 200 distToCorner: &tsize2]; frameDir = 1; pointValue = 400; myCave = sender; hits = 0; 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; } - performCollisionWith:(Actor *) dude { id ret = self; if ((++hits % 6) == 0) [actorMgr newActor:(int)[Skull class] for:self tag:0]; if (hits >= 20) { [actorMgr destroyActor:myCave]; [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]; } return ret; } - (BOOL) doYouHurt:sender { Actor *dude = (Actor *)sender; if (dude->actorType == xx_ship) { [sender addToScore:pointValue for:self gen:0]; return NO; } return YES; } - moveBy:(float)dx :(float)dy { // just ignore, wait for the moveTo:: return self; } @end @implementation Skull - activate:sender :(int)tag { NXSize tsize = {48,48}; NXSize tsize2 = {24,24}; Actor *dude = (Actor *)sender; [super activate:sender :tag]; [self reinitWithImage:"skulls" frameSize:&tsize numFrames:2 shape: CIRCLE alliance: EVIL radius: tsize2.width buffered: YES x: dude->x y: dude->y theta: 1.6 * PI vel: randBetween(12,15) interval: 650 distToCorner: &tsize2]; hits = 0; pointValue = 125; velChange = randBetween(1.5,2); dirUpdate = (unsigned)randBetween(220,300); return self; } - calcDxDy:(NXPoint *)dp { if (timeInMS > moveChangeTime) { float dx, dy, dist, dxv, dyv; moveChangeTime = timeInMS + dirUpdate; dx = gx-x; dy=gy-y; dist = sqrt(dx*dx+dy*dy); dxv = vel * dx/dist; dyv = vel * dy/dist; if (dxv < xv) xv-=velChange; else if (dxv > xv) xv+=velChange; if (dyv < yv) yv-=velChange; else if (dyv > yv) yv+=velChange; } [super calcDxDy:dp]; return self; } - positionChanged { [super positionChanged]; [self wrapAtDistance: (3*xOffset) :(3*yOffset)]; return self; } - performCollisionWith:(Actor *) dude { id ret = self; if (++hits >=6) { [soundMgr playSound: (EXP2SND) at:0.5]; [actorMgr newActor:xx_explosion for:self tag:1]; ret = [super performCollisionWith: dude]; } else { [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.