|
|
1.1 ! root 1: /* ! 2: * BreakApp.m, subclass of Application for BreakApp. ! 3: * Author: Ali Ozer ! 4: * Written for 1.0 July 89. ! 5: * Modified for 2.0 Sept 90; separated the panels into their own .nib files. ! 6: * Modified for 3.0 March 92 ! 7: * ! 8: * This class manages the windows & such for the BreakApp application. ! 9: * ! 10: * You may freely copy, distribute and reuse the code in this example. ! 11: * NeXT disclaims any warranty of any kind, expressed or implied, ! 12: * as to its fitness for any particular use. ! 13: */ ! 14: ! 15: #import <appkit/appkit.h> ! 16: #import <libc.h> ! 17: ! 18: #import "BreakApp.h" ! 19: #import "BreakView.h" ! 20: ! 21: ! 22: @implementation BreakApp ! 23: ! 24: + new ! 25: { ! 26: self = [super new]; ! 27: [self setDelegate:self]; // For appDidHide: ! 28: return self; ! 29: } ! 30: ! 31: // appDidInit is called as the first thing in the run loop of the ! 32: // application. At this point, everything is created, but we haven't entered ! 33: // the event loop yet. appDidInit: initializes a few things and ! 34: // calls the gotoFirstLevel: method of the BreakView instance to get ! 35: // started on a new game. ! 36: ! 37: - appDidInit:app ! 38: { ! 39: NXRect gameWindowFrame, controlWindowFrame; ! 40: ! 41: [gameWindow setDelegate:self]; // For windowDidMiniaturize: ! 42: [gameWindow setExcludedFromWindowsMenu:YES]; // We do this by hand (in IB) ! 43: [controlWindow removeFromEventMask:NX_KEYDOWNMASK|NX_KEYUPMASK]; ! 44: ! 45: // Put the control window right next to the game window (game window is ! 46: // set to come up "right" automatically on different sized screens). ! 47: [gameWindow getFrame:&gameWindowFrame]; ! 48: [controlWindow getFrame:&controlWindowFrame]; ! 49: NX_Y(&controlWindowFrame) = NX_MAXY(&gameWindowFrame) - NX_HEIGHT(&controlWindowFrame); ! 50: NX_X(&controlWindowFrame) = NX_X(&gameWindowFrame) - NX_WIDTH(&controlWindowFrame) - 2.0; ! 51: [controlWindow moveTo:NX_X(&controlWindowFrame) :NX_Y(&controlWindowFrame)]; ! 52: ! 53: [game gotoFirstLevel:self]; ! 54: ! 55: [controlWindow orderFront:self]; ! 56: [gameWindow makeKeyAndOrderFront:self]; ! 57: ! 58: return self; ! 59: } ! 60: ! 61: // appDidHide is called when the application is hidden. It doesn't ! 62: // make sense to run the game while the application is running, also, ! 63: // in case the boss walks by you want to be able to hit just Command-h and ! 64: // have the game hide and pause at the same time. This way the boss won't ! 65: // ask where "ping-ping" noises are coming from and you will not have lost ! 66: // a high-score game. ! 67: ! 68: - appDidHide:app ! 69: { ! 70: [game stop:self]; ! 71: return self; ! 72: } ! 73: ! 74: // We do pretty much the same if the user miniaturizes the game window. ! 75: ! 76: - windowDidMiniaturize:window ! 77: { ! 78: if (window == gameWindow) [game stop:self]; ! 79: return self; ! 80: } ! 81: ! 82: // printGame: allows us to print the game window. We could've just connected ! 83: // the "Print..." menu item to the window's smartPrintPSCode:; however, we ! 84: // wanted to be able to change the title to reflect the status. ! 85: ! 86: - printGame:sender ! 87: { ! 88: char *savedTitle = NXCopyStringBuffer([gameWindow title]); ! 89: char statusString[100]; ! 90: ! 91: sprintf (statusString, NXLocalString ("Score: %d Level: %d", NULL, "Score and level to be shown when the game window is printed"), [game score], [game level]); ! 92: [gameWindow setTitle:statusString]; ! 93: [gameWindow smartPrintPSCode:sender]; ! 94: [gameWindow setTitle:savedTitle]; ! 95: free (savedTitle); ! 96: ! 97: return self; ! 98: } ! 99: ! 100: ! 101: // Method to load the .nib file for the info panel. ! 102: ! 103: - showInfo:sender ! 104: { ! 105: if (!infoPanel) { ! 106: [self loadNibSection:"Info.nib" owner:self withNames:NO]; ! 107: } ! 108: [infoPanel makeKeyAndOrderFront:sender]; ! 109: return self; ! 110: } ! 111: ! 112: ! 113: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.