This is PlayerUpView.m in view mode; [Download] [Up]
// PlayerUpView.m - see header file for more info #import <gamekit/gamekit.h> // Header file @implementation PlayerUpView - initFrame:(const NXRect *)frm // designated initializer for a view { [super initFrame:frm]; margin = 2.0; // "margin" around the player image numUp = 0; // start with zero; up to game to set properly at start return self; } - setImage:anImage { image = anImage; return self; } - (int)numUp { return numUp; } - setMargin:(NXCoord)newMargin { margin = newMargin; return self; } - setImageFrame:(NXRect *)aRect { NXSetRect(&imageFrame, NX_X(aRect), NX_Y(aRect), NX_WIDTH(aRect), NX_HEIGHT(aRect)); return self; } - incNumUp:sender { numUp++; [self update]; #ifdef NOISYDEBUG fprintf(stderr, "Inc number of one ups to %d.\n", numUp); #endif if ([delegate respondsTo:@selector(oneUpAdded)]) [delegate oneUpAdded]; return self; } - setNumUp:(int)newNumUp { if (numUp == newNumUp) return self; // no change so leave. numUp = newNumUp; #ifdef NOISYDEBUG fprintf(stderr, "Set number of one ups to %d.\n", numUp); #endif // this message usually comes at start of game, so assume // that we should reset the extra man bonus points... [extraManBonusTracker resetBonus]; return [self update]; } - (BOOL)decNumUp:sender // returns NO if player has no xtra men left. { if (numUp) { numUp--; [self update]; #ifdef NOISYDEBUG fprintf(stderr, "Dec number of one ups to %d.\n", numUp); #endif if ([delegate respondsTo:@selector(oneUpUsed)]) [delegate oneUpUsed]; return YES; } if ([delegate respondsTo:@selector(allOneUpsGone)]) [delegate allOneUpsGone]; return NO; } - drawSelf:(NXRect *)rects :(int)rectCount // redraws the view. { // this is inefficient; I always redraw the entire view... // Since this View is redrawn so little, I don't care-it's good enough. int baseCount = numUp; // counts down to zero to fill view int x, y; NXPoint pos; // where we'll splat the base in the view PSsetgray(NX_LTGRAY); // opaque background NXRectFill(&bounds); if (baseCount > 0) { // start at bottom row; move up y = 0; pos.y = (imageFrame.size.height + margin * 2) * y + margin; while ((pos.y < bounds.size.height) && baseCount) { // y loop // start at left, move right x = 0; pos.x = (imageFrame.size.width + margin * 2) * x + margin; while ((pos.x < bounds.size.width) && baseCount) { // x loop // splat the base on the screen [image composite:NX_SOVER fromRect:&imageFrame toPoint:&pos]; baseCount--; // update vars x++; pos.x = (imageFrame.size.width + margin * 2) * x + margin; } y++; pos.y = (imageFrame.size.height + margin * 2) * y + margin; } } return self; } - read:(NXTypedStream *)stream { [super read:stream]; NXReadTypes(stream, "if", &numUp, &margin); NXReadRect(stream, &imageFrame); image = NXReadObject(stream); return self; } - write:(NXTypedStream *)stream // you must call NXWriteRootObject to { // invoke this method [super write:stream]; NXWriteTypes(stream, "if", &numUp, &margin); NXWriteRect(stream, &imageFrame); NXWriteObjectReference(stream, image); return self; } - scoreChangedFrom:(int)oldScore to:(int)newScore { // use a bonus tracker to give out extra guys...we need to be the score // keeper's delegate for this to work! (GameBrain will do that for us) #ifdef NOISYDEBUG fprintf(stderr, "Score change from %d to %d, xtra man at %d. ", oldScore, newScore, [extraManBonusTracker bonusValue]); #endif if (!extraManBonusTracker) return self; // no bonuses given... if (([extraManBonusTracker bonusValue] >= oldScore) && ([extraManBonusTracker bonusValue] <= newScore)) { // crossed it! [extraManBonusTracker advanceBonus]; [self incNumUp:self]; if ([delegate respondsTo:@selector(oneUpAwarded)]) [delegate oneUpAwarded]; #ifdef NOISYDEBUG fprintf(stderr, "Bonus awarded."); #endif } #ifdef NOISYDEBUG fprintf(stderr, "\n"); #endif return self; } - setExtraManBonusTracker:tracker { id oldExtraManBonusTracker = extraManBonusTracker; if ([tracker isKindOf:[BonusTracker class]]) { // make sure right class extraManBonusTracker = tracker; return oldExtraManBonusTracker; } return nil; } - extraManBonusTracker { return extraManBonusTracker; } - delegate { return delegate; } - setDelegate:anObject { id oldDelegate = delegate; delegate = anObject; return oldDelegate; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.