"Game Menu handler. Handles the attract mode and the start/credits/quit menu." import pygame from pygame.locals import * import random import game, gfx, input, snd from sprites import objmenu from sprites.objtextmessage import * from sprites.objsstext import SubsurfaceText from gameengine import GameEngine from gameplay import GamePlay from gamecredits import GameCredits from gamecheat import GameCheat menuitems = [GamePlay,GameCredits,None] VERSION_RECT = (0,510,100,20) def load_game_resources(): pass class GameMenu(GameEngine): def __init__(self, prevhandler): GameEngine.__init__(self, prevhandler) # for transition to game start self.gamestart_timer = 0 # for our simulated keypresses self.move_interval = 10 self.move_timer = 0 # for random movement self.lastmove = self.player.cmd_right self.move_array = [self.player.cmd_up, self.player.cmd_down, self.player.cmd_left, self.player.cmd_right] # override the default handler self.input_mapping = { input.END: (self.userquit, []), input.UP: (self.do_nothing, []), input.DOWN: (self.do_nothing, []), input.LEFT: (self.prev_item, []), input.RIGHT: (self.next_item, []), input.PRESS: (self.do_nothing, []), input.RELEASE:(self.do_nothing, []), input.FIRE: (self.select_item,[]), input.PAUSE: (self.pause,[]), input.DEBUG: (self.toggle_debug,[]), input.SELECT: (self.select_item,[]), input.CHEAT: (self.cheat_mode,[]) } self.title = TextMessage(gfx.surface,gfx.background,'FarBlazer',fontsize=130,fontcolor=RED) self.title.rect.centery = gfx.rect.centery - 100 self.menu = objmenu.Menu(gfx.surface,gfx.background) vmrect = pygame.Rect(VERSION_RECT) self.version_message = SubsurfaceText(gfx.surface,gfx.background,game.version_message,vmrect, fontpath=None,fontsize=FONTSIZE_TINY,fontcolor=GREY) self.changestate('gamestart') # override the default way to get events- we need regular keypresses here def get_events(self): events = pygame.event.get() return events # override the normal tick, so we can add a computer player def normal_tick(self): # do all the normal stuff... GameEngine.normal_tick(self) self.move_timer += 1 if self.move_timer % self.move_interval == 0: if random.randrange(0,6) == 0: move = self.move_array[random.randrange(0,4)] self.lastmove = move else: move = self.lastmove move() if random.randrange(0,10) == 0: self.player.cmd_fire() # override level start so we can draw the menu def levelstart_start(self): # do the regular init GameEngine.levelstart_start(self) # draw title & menu self.title.draw() self.menu.draw() self.version_message.draw() # set this so menu knows it's ok to quit self.titledrawn = 1 # override game over routines def gameover_start(self): self.timer = game.state_transition_time self.scoredisplay.update(game.score,game.fuel,game.bombs,game.lives) def final_game_end(self): self.changestate('gamestart') # add some new states for setting up menu correctly def menustart_start(self): # this is so we wait at least one frame, so we don't start the new game before player starts self.menustart_timer = 0 def menustart_tick(self): pygame.event.get() self.menustart_timer += 1 if self.menustart_timer > 1: self.changestate('gamestart') def menustart_end(self): pass # menu functionality # override userquit also def userquit(self): self.menu.set_item(objmenu.menu_quit) self.menu.erase() self.menu.draw() gfx.update() self.select_item() # add new methods for menu def next_item(self): self.menu.next_item() self.menu.erase() self.menu.draw() def prev_item(self): self.menu.prev_item() self.menu.erase() self.menu.draw() def select_item(self): # don't quit until we've at least drawn the title if not hasattr(self,'titledrawn'): return handlerclass = menuitems[self.menu.get_item()] self.change_handler(handlerclass) def cheat_mode(self): # don't change until we've at least drawn the title if not hasattr(self,'titledrawn'): return handlerclass = GameCheat self.change_handler(handlerclass) def change_handler(self,handlerclass): # change handler pygame.time.delay(300) # clean up objects self.playerdie_end() gfx.update() # remove title & menu objects self.title.erase() self.menu.erase() # change our state to start so we come back to the right place self.changestate('menustart') if handlerclass != None: nexthandler = handlerclass(self) else: nexthandler = handlerclass game.handler = nexthandler