This is GameView.m in view mode; [Download] [Up]
// GameView.m // (C) Copyright 1992 Jim Patterson #import <appkit/appkit.h> #import <objc/objc.h> #import "GameView.h" #import "LessonPlan.h" #import "ArcadeApp.h" #import "explosion1.h" #import "PerformanceEvaluator.h" @implementation GameView:View + standardNewFrame { NXRect aRect,viewFrame; float gray,strX,strY,strW,strH; int i; NXSetRect(&viewFrame, TA_GAMEVIEW_X,TA_GAMEVIEW_Y, TA_GAMEVIEW_W,TA_GAMEVIEW_H); self = [super newFrame:&viewFrame]; // create cacheWindow cacheWindow = [Window newContent:&viewFrame style:NX_PLAINSTYLE backing:NX_RETAINED buttonMask:0 defer:NO]; // setup rectangle for erasing characters NXSetRect(&clearingRect,0,0,TA_MAX_LETTER_WIDTH,TA_LINE_HEIGHT); [[cacheWindow contentView] lockFocus]; // ADD BACKGROUND TO PART WITH TEXT PSsetgray(NX_BLACK); NXSetRect(&aRect,TA_GAMEVIEW_X, TA_GAMEVIEW_Y + TA_GAMEVIEW_HEADER_H, TA_GAMEVIEW_W, TA_GAMEVIEW_TEXTPART_H); NXRectFill(&aRect); // ADD HEADER for (i=0; i< TA_GAMEVIEW_HEADER_H; i++) { gray = (1 - ((float) i) / ((float) TA_GAMEVIEW_HEADER_H)) * NX_LTGRAY; PSsetgray(gray); PSrectstroke(TA_GAMEVIEW_X, TA_GAMEVIEW_Y+i, TA_GAMEVIEW_W,1); } // SET TRAILER BACKGROUND PSsetgray(NX_LTGRAY); NXSetRect(&aRect, TA_GAMEVIEW_X, TA_GAMEVIEW_Y + TA_GAMEVIEW_TEXTPART_H + TA_GAMEVIEW_FADEPART_H + TA_GAMEVIEW_HEADER_H, TA_GAMEVIEW_W, TA_GAMEVIEW_TRAILER_H); NXRectFill(&aRect); // ADD FADING PART TO TRAILER for (i=0; i< TA_GAMEVIEW_FADEPART_H; i++) { gray = ((float) i) / ((float) TA_GAMEVIEW_FADEPART_H) * NX_LTGRAY; PSsetgray(gray); PSrectstroke(TA_GAMEVIEW_X, TA_GAMEVIEW_Y+ TA_GAMEVIEW_HEADER_H + TA_GAMEVIEW_TEXTPART_H+i, TA_GAMEVIEW_W,1); } // ADD GAME-OVER BOX TO TRAILER PSsetgray(0.5); NXSetRect(&aRect, TA_GAMEVIEW_X+TA_GAMEVIEW_TRAILER_XMARGIN, TA_GAMEVIEW_Y+TA_GAMEVIEW_TRAILER_YMARGIN + TA_GAMEVIEW_HEADER_H + TA_GAMEVIEW_TEXTPART_H + TA_GAMEVIEW_FADEPART_H, TA_GAMEVIEW_TRAILER_BOX_W, TA_GAMEVIEW_TRAILER_BOX_H); NXDrawGroove(&aRect,&aRect); PSstringwidth("Game Over",&strW,&strH); strX = aRect.origin.x + (aRect.size.width - strW)/2; strY = aRect.origin.y + (aRect.size.height - strH)/2; PSsetgray(NX_BLACK); PSmoveto(strX,strY); PSscale(1,-1); PSshow("GameOver"); // add letters PSsetgray(NX_WHITE); [self fillWithLetters]; lowestNonemptyRow = 0; [[cacheWindow contentView] unlockFocus]; return self; } - drawSelf:(NXRect *) tR: (int) count { int i; // Assumes: (1) Count is 1, which will always be true as it is used in TypingArcade // since we are only scrolling in one dimension. // (2) We are drawing (i.e. not printing, etc.). This is reasonable // since we will never be printing this object PScomposite(tR->origin.x, tR->origin.y,tR->size.width,tR->size.height, [cacheWindow gState], tR->origin.x,tR->origin.y,NX_COPY); return self; } - free { [cacheWindow free]; return self; } - fillWithLetters; { int lineNum,i; float xLoc,yLoc; char str[2]; PSscale(1,-1); // load font information gameFont = [Font newFont:"Times-Roman" size:18]; if (gameFont == nil) printf("ERROR: could not load font.\n"); else [gameFont set]; [[NXApp performanceEvaluator] reset]; // clear all statistics [[NXApp lessonPlan] compactKeyList]; for (lineNum=0; lineNum<TA_NUM_GAMEVIEW_LINES; lineNum++) { xLoc = [[NXApp lessonPlan] randomBetween:TA_SIDE_MARGIN :TA_GAMEVIEW_W - TA_SIDE_MARGIN]; yLoc = TA_GAMEVIEW_Y + TA_GAMEVIEW_HEADER_H + lineNum*TA_LINE_HEIGHT; gameLetters[lineNum] = [[NXApp lessonPlan] chooseChar]; [[NXApp performanceEvaluator] logOccurrence:gameLetters[lineNum]]; gameLetterXLocs[lineNum] = xLoc; str[0] = gameLetters[lineNum]; str[1] = '\0'; PSmoveto(xLoc,yLoc); PSscale(1,-1); PSsetgray(NX_WHITE); PSshow(str); PSscale(1,-1); if (gameLetters[lineNum] == '0') { PSmoveto(xLoc+1,yLoc); PSscale(1,-1); PSsetgray(NX_WHITE); PSshow("/"); PSscale(1,-1); } } } - lowestLetterWasHit:(int) gProgress { NXRect aRect; [self lockFocus]; clearingRect.origin.x = gameLetterXLocs[lowestNonemptyRow] - 8; clearingRect.origin.y = TA_GAMEVIEW_Y + TA_GAMEVIEW_HEADER_H - 4 + lowestNonemptyRow * TA_LINE_HEIGHT; PSsetgray(NX_BLACK); NXRectFill(&clearingRect); lowestNonemptyRow*TA_LINE_HEIGHT; PSsetgray(NX_WHITE); PSWexplosion(clearingRect.origin.x + 0.5 *TA_MAX_LETTER_WIDTH, clearingRect.origin.y + 0.5*TA_LINE_HEIGHT); [[cacheWindow contentView] lockFocus]; PSsetgray(NX_BLACK); NXRectFill(&clearingRect); lowestNonemptyRow*TA_LINE_HEIGHT; [[cacheWindow contentView] unlockFocus]; PSsetgray(NX_BLACK); PSWexplosion(clearingRect.origin.x + 0.5 *TA_MAX_LETTER_WIDTH, clearingRect.origin.y + 0.5*TA_LINE_HEIGHT); [self unlockFocus]; lowestNonemptyRow++; return self; } - (char) lowestLetter { return gameLetters[lowestNonemptyRow];} - (int) lowestNonemptyRow {return lowestNonemptyRow; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.