root/Alpha/menu.py @ 108

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