root/Alpha/menu.py @ 116

Revision 116, 11.4 KB (checked in by mmurphy, 2 years ago)

The high score file now holds an object, rather than just an array. It is now stored as a member variable of MenuHandler?, rather than in the constants.py file. Also, now the high scores are split into Campaign and Survival.

Line 
1"""
2    Containts the hierarchy of menu classes
3"""
4
5import pygame, cPickle
6from pygame.locals import *
7from gameobject import *
8from constants import BBUILDER
9import globalVars
10
11class MenuHandler:
12    """Highest level class for Menu mode. Contains all MenuPages.
13        There is only a single global MenuHandler"""
14    def __init__(self, currentPage = "page0"):
15        """initializes the menuHandler"""
16        try:
17            self.highScores = cPickle.load( open( "scores.txt", "rb" ) )
18        except:
19            self.highScores = HighScores()
20        self.pageLibrary = {}
21        self.currentPage = currentPage
22        self.nextPage = None
23        self.menuInitialize()
24       
25    def menuInitialize(self):
26        """initializes all menu elements using constants.py"""
27        menuButton00 = MenuButton(BBUILDER.BUTTON_0, (400,245),
28                                  (200,50), "Play Game", "page1")
29        menuButton01 = MenuButton(BBUILDER.BUTTON_0, (400,310),
30                                  (200,50), "High Scores", "scorePage")
31        menuButton02 = MenuButton(BBUILDER.BUTTON_0, (400,375),
32                                  (200,50), "Exit", "exit")
33       
34        page0cursor = "cursor0.png"
35        page0 = MenuPage(page0cursor, [
36            menuButton00, menuButton01, menuButton02], [])
37
38        page1buttons = [MenuButton(BBUILDER.BUTTON_0, (400,245),
39                                (200,50), "Campaign", "page2"),
40                        MenuButton(BBUILDER.BUTTON_0, (400,310),
41                                (200,50), "Survival", "page3"),
42                        MenuButton(BBUILDER.BUTTON_0, (400,375),
43                                (200,50), "Back", "page0")]
44       
45        page1 = MenuPage(page0cursor, page1buttons, [])
46       
47        page2buttons = [MenuButton(BBUILDER.BUTTON_0, (400,245),
48                                (200,50), "Easy", "playGameEasy"),
49                        MenuButton(BBUILDER.BUTTON_0, (400,310),
50                                (200,50), "Medium", "playGameMedium"),
51                        MenuButton(BBUILDER.BUTTON_0, (400,375),
52                                (200,50), "Hard", "playGameHard"),
53                        MenuButton(BBUILDER.BUTTON_0, (400,440),
54                                (200,50), "Back", "page1")]
55                               
56        page2 = MenuPage(page0cursor, page2buttons, [])
57                               
58        page3buttons = [MenuButton(BBUILDER.BUTTON_0, (400,245),
59                                (200,50), "Easy", "playSurvivalEasy"),
60                        MenuButton(BBUILDER.BUTTON_0, (400,310),
61                                (200,50), "Medium", "playSurvivalMedium"),
62                        MenuButton(BBUILDER.BUTTON_0, (400,375),
63                                (200,50), "Hard", "playSurvivalHard"),
64                        MenuButton(BBUILDER.BUTTON_0, (400,440),
65                                (200,50), "Back", "page1")]
66                               
67        page3 = MenuPage(page0cursor, page3buttons, [])
68
69        self.updateScorePage()
70
71        submitButton = MenuButton(BBUILDER.BUTTON_0, (400,400),
72                                (200,50), "Submit!", "scorePage")
73        enterName = InputScorePage(page0cursor, [submitButton], [])
74       
75        self.pageLibrary['page0'] = page0
76        self.pageLibrary['page1'] = page1
77        self.pageLibrary['page2'] = page2
78        self.pageLibrary['page3'] = page3
79        self.pageLibrary['enterName'] = enterName
80       
81    def updateScores(self, name, score, mode):
82        """updates the high score table"""
83        self.highScores.addScore(score, name, mode)
84        cPickle.dump( self.highScores, open( "scores.txt", "wb" ) )
85               
86    def updateScorePage(self):
87        """updates the high score page with a new table"""
88       
89        highScoreTxt = self.highScores.getTextItems()
90        scorePageTxt = MenuText(pygame.Color("black"), (400, 160),
91                                40,"High Scores")
92        backToMenuButton = MenuButton(BBUILDER.BUTTON_0, (400, 500),
93                                  (200,50), "Back to Menu", "page0")
94
95        page0cursor = "cursor0.png"
96        scorePage = MenuPage(page0cursor, [backToMenuButton], [scorePageTxt] +
97                             highScoreTxt)
98       
99        self.pageLibrary['scorePage'] = scorePage         
100
101    def draw(self):
102        """draws the current background and MenuPage."""
103        globalVars.graphics.drawImage(BBUILDER.MENU_BG_LIST[self.currentPage],
104                                      (0,0))
105        self.pageLibrary[self.currentPage].draw()
106
107class MenuPage:
108    """Class containing data for MenuPages. Held by MenuHandler."""
109    def __init__(self, cursor, menuButtonList, textList):
110        """initializes a MenuPage"""
111        self.cursor = cursor
112        self.menuButtonList = menuButtonList
113        self.textList = textList
114        self.selectedButton = None
115
116       
117    def selectButton(self, intNextButton):
118        """changes location of cursor. Called by EventHandler."""
119        if self.selectedButton == None:
120            self.selectedButton = 0
121        else:
122            self.selectedButton = (self.selectedButton + intNextButton) % \
123                                        len(self.menuButtonList)
124
125
126    def draw(self):
127        """draws a MenuPage and all associated elements"""
128        for buttonNum in range(len(self.menuButtonList)):
129            button = self.menuButtonList[buttonNum]
130            button.draw()
131            if buttonNum == self.selectedButton:
132                globalVars.graphics.drawImage(self.cursor,
133                                              (button.x-50, button.y))
134        for textItem in self.textList:
135            textItem.draw()
136
137'''A class to hold the user's high scores'''
138class HighScores():
139    def __init__(self):
140        self.story = []
141        self.survival = []
142
143    def addScore(self, name, score, mode):
144        if mode == "Story":
145            self.story.append((score, name));
146            self.story.sort(reverse=True);
147            if len(self.story) > 10:
148                self.story = self.story[:10]
149        elif mode == "Survival":
150            self.survival.append((score, name));
151            self.survival.sort(reverse=True);
152            if len(self.survival) > 10:
153                self.survival = self.survival[:10]
154
155
156    '''Gets the text items to display'''
157    def getTextItems(self):
158
159        storyScoresTxt = []
160        survivalScoresTxt = []
161
162        headers = [MenuText(pygame.Color("black"), (180, 180),
163                                20,"Campaign Mode"),
164                   MenuText(pygame.Color("black"), (580, 180),
165                                20,"Survival Mode")]
166
167        for (scoreList, xx, result) in [(self.story, 100, storyScoresTxt),
168                                        (self.survival, 500, survivalScoresTxt)]:
169
170            if scoreList == []:
171                noScore = MenuText(pygame.Color("black"), (xx+70, 220),
172                                20,"No Scores to List!")
173                result.append(noScore)
174            else:
175                name = MenuText(pygame.Color("black"), (xx, 200),30,"Name")
176                score = MenuText(pygame.Color("black"), (xx+150, 200),30,"Score")
177                result.append(name)
178                result.append(score)
179           
180                for scorePairNum in range(len(scoreList)):
181                    scorePair = scoreList[scorePairNum]
182               
183                    (x, y) = (xx, 230 + (20 * scorePairNum))
184               
185                    name = MenuText(pygame.Color("black"),
186                                (x,y), 20, str(scorePair[0]))
187               
188                    score = MenuText(pygame.Color("black"),
189                                 (x+150,y),20,
190                                 str(scorePair[1]))
191
192                    result += [name,score]
193       
194        return headers + storyScoresTxt + survivalScoresTxt
195   
196
197class InputScorePage(MenuPage):
198    '''MenuPage that responds to typing inputs to register score'''
199    def __init__(self, cursor, menuButtonList, textList):
200        MenuPage.__init__(self, cursor, menuButtonList, textList)
201        self.inputStr = ""
202        self.score = 0
203        self.modeStr = ""
204        self.textList.append(MenuText(pygame.Color("green"), (400, 160),
205                                60,"Complete!"))
206        self.textList.append(MenuText(pygame.Color("black"), (400, 220),
207                        40,"Your score is "+str(self.score)))
208        self.textList.append(MenuText(pygame.Color("black"), (400, 270),
209                        40,"Enter name:"))
210        self.textList.append(MenuText(pygame.Color("orange"), (400, 325),
211                        50,self.inputStr))
212       
213    def registerScore(self):
214        """registers score with name and mode"""
215        globalVars.menuHandler.updateScores(self.inputStr, self.score,
216                                            self.modeStr)
217        globalVars.menuHandler.updateScorePage()
218
219    def updateInput(self, inputKey, caps):
220        """updates page based on inputKey"""
221        if inputKey == "backspace":
222            if len(self.inputStr) != 0:
223                self.inputStr = self.inputStr[:-1]
224            else:
225                self.inputStr = ''
226        elif len(self.inputStr) < 12:
227            if inputKey == "space":
228                self.inputStr += ' '
229            elif caps:
230                self.inputStr += self.caps(inputKey)
231            else:
232                self.inputStr += inputKey.lower()
233        self.textList[3].text = self.inputStr
234
235    def caps(self, inputKey):
236        """returns the version of inputKey when shift is held"""
237        if inputKey in "abcdefghijklmnopqrstuvwxyz":
238            return inputKey.upper()
239        elif inputKey in "0123456789":
240            print inputKey
241            return [')', '!', '@', '#', '$', '%', '^', '&', '*', '('][int(inputKey)]
242        else:
243            try:
244                return BBUILDER.CAPSDICT[inputKey]
245            except:
246                return inputKey
247
248    def draw(self):
249        """draws a MenuPage and all associated elements"""
250        MenuPage.draw(self)
251
252class MenuText:
253    """ used to display non-clickable text in the menu"""
254    def __init__(self, textColor, pos, font, text):
255        self.active = False
256        self.text = text
257        self.textSize = font
258        self.textColor = textColor
259        self.x = pos[0]
260        self.y = pos[1]
261    def draw(self):
262        """Draws the text in the menu"""
263        globalVars.graphics.drawText(self.text, self.x, self.y,
264                                     self.textSize, self.textColor, "center")
265   
266class MenuButton(GameObject):
267    """used by MenuPages. Represents a button that can be clicked."""
268    def __init__(self, image, pos, size, text, dest):
269        """initializes a MenuButton"""
270        GameObject.__init__(self, image, pos, size) 
271        self.active = False
272        self.text = text
273        self.textSize = BBUILDER.BUTTON_TEXT_SIZE
274        self.textColor = BBUILDER.BUTTON_TEXT_COLOR
275        self.dest = dest
276    def draw(self):
277        """draws a MenuButton"""
278        text = pygame.font.Font(None, self.textSize).render(self.text, 1,
279                                                            self.textColor)
280        globalVars.graphics.drawObject(self, text)
281       
Note: See TracBrowser for help on using the browser.