class EzMenu(): def __init__(self, options, scene): """Initialise the EzMenu! options should be a sequence of lists in the format of [option_name, option_function]""" self.scene = scene self.options = options self.x = 0 self.y = 0 self.hx = 0 self.hy = 0 self.centerx = 0 self.centery = 0 self.font = pygame.font.Font(None, 18) self.option = 0 self.width = 1 self.color = [0, 0, 0] self.hcolor = [255, 0, 0] self.height = len(self.options) * self.font.get_height() self.font.set_italic(True) self.help_text = DrawableFontObject("", self.font) self.font.set_italic(False) self.font_list = [] self.scene.addObject(self.help_text) for o in self.options: ren = self.font.render(o[0], 1, self.color) self.font_list.append(DrawableFontObject(o[0], self.font)) if self.width < ren.get_width(): self.width = ren.get_width() self.scene.addObjects(self.font_list) def draw(self): """Draw the menu to the surface.""" i = 0 help_txt = "" for o in self.options: if i == self.option: clr = self.hcolor help_txt = o[2] else: clr = self.color text = o[0] self.font_list[i].changeText(text, clr) self.font_list[i].setPosition(self.x, self.y + i * self.font.get_height()) i += 1 # Help Text self.help_text.changeText(help_txt, self.color) self.help_text.setPosition(self.hx + 5, self.hy) def update(self, event): """Update the menu and get input for the menu.""" return_val = False if event.type == pygame.KEYDOWN: if event.key == pygame.K_DOWN: self.option += 1 return_val = True elif event.key == pygame.K_UP: self.option -= 1 return_val = True elif event.key == pygame.K_RETURN: self.options[self.option][1]() return_val = True if self.option > len(self.options) - 1: self.option = 0 elif self.option < 0: self.option = len(self.options) - 1 return return_val def set_pos(self, x, y): """Set the topleft of the menu at x,y""" self.x = x self.y = y def set_font(self, font): """Set the font used for the menu.""" self.font = font def set_highlight_color(self, color): """Set the highlight color""" self.hcolor = color def set_normal_color(self, color): """Set the normal color""" self.color = color def center_at(self, x, y): """Center the center of the menu at x,y""" self.x = x - (self.width / 2) self.y = y - (self.height / 2) self.centerx = x self.centery = y def help_text_at(self, x, y): self.hx = x self.hy = y def clear_menu(self): for dfo in self.font_list: self.scene.removeObject(dfo) self.scene.removeObject(self.help_text)
class BattleMenuHolder(GameEngineElement): def __init__(self, callback): GameEngineElement.__init__(self, has_draw=True, has_event=False) self.menu = None self.callback = callback self.background = DrawableObject( [pygame.image.load(MENU_PATH + "battleMenubackground.gif")], '') self.font = pygame.font.SysFont("cmr10", 18, False, False) self.disp = DrawableFontObject("", self.font) self.sec_disp = DrawableFontObject("", self.font) self.add_to_scene([self.background]) self.add_to_scene([self.disp]) self.add_to_scene([self.sec_disp]) def set_disp(self, msg): self.disp.changeText(msg, (0, 0, 0)) def set_sec_disp(self, msg): self.sec_disp.changeText(msg, (0, 0, 0)) def remove_from_engine(self): super(BattleMenuHolder, self).remove_from_engine() self.clear_menu() def draw(self): self.background.setPosition(0, 286) self.disp.setPosition(250, 340) self.sec_disp.setPosition(237, 375) def menu_called(self, id): self.callback(id, self) def clear_menu(self): if self.menu: self.menu.clear() self.menu.remove_from_engine() self.menu = None def show_menu(self, id): if self.is_in_engine(): self.clear_menu() else: self.add_to_engine() y_offset = 0 if id == "selection": menu_type = NORMAL_MENU menu_options = [ [_("Attack"), lambda: self.menu_called("attack_show"), 140, 1], [_('Special'), lambda: self.show_menu("special"), 140, 1], [_('Magic'), lambda: self.show_menu("magic"), 140, 1], [_('Scan'), lambda: self.menu_called("scan"), 140, 1], ] elif id == "attack": y_offset = 50 menu_type = GRID_MENU menu_options = [ ['1', lambda: self.menu_called('1'), 44, 1], ['2', lambda: self.menu_called('2'), 44, 1], ['3', lambda: self.menu_called('3'), 44, 1], ['4', lambda: self.menu_called('4'), 44, 1], ['5', lambda: self.menu_called('5'), 44, 1], ['6', lambda: self.menu_called('6'), 44, 1], ['7', lambda: self.menu_called('7'), 44, 1], ['8', lambda: self.menu_called('8'), 44, 1], ['9', lambda: self.menu_called('9'), 44, 1], [_("C"), lambda: self.menu_called('clear'), 44, 1], ['0', lambda: self.menu_called('0'), 44, 1], [_("E"), lambda: self.menu_called('enter'), 44, 1], ] elif id == "special": menu_type = NORMAL_MENU menu_options = [[ _("Back"), lambda: self.show_menu("selection"), 140, 1 ]] elif id == "magic": menu_type = NORMAL_MENU menu_options = [ [_("Fire"), lambda: self.menu_called("fire"), 140, 1], [ _("Lightning"), lambda: self.menu_called("lightning"), 140, 1 ], [_("Missile"), lambda: self.menu_called("missile"), 140, 1], [_("Heal"), lambda: self.menu_called("heal"), 140, 1], [_("Back"), lambda: self.show_menu("selection"), 140, 1] ] else: print "Invalid Menu", id return self.menu = BattleMenu(menu_options, 237, 375 + y_offset, menu_type)
class EzMenu(): def __init__(self, options, scene): """Initialise the EzMenu! options should be a sequence of lists in the format of [option_name, option_function]""" self.scene = scene self.options = options self.x = 0 self.y = 0 self.hx = 0 self.hy = 0 self.centerx = 0 self.centery = 0 self.font = pygame.font.Font(None, 18) self.option = 0 self.width = 1 self.color = [0, 0, 0] self.hcolor = [255, 0, 0] self.height = len(self.options)*self.font.get_height() self.font.set_italic( True ) self.help_text = DrawableFontObject("", self.font) self.font.set_italic( False ) self.font_list = [] self.scene.addObject(self.help_text) for o in self.options: ren = self.font.render( o[0], 1, self.color) self.font_list.append(DrawableFontObject(o[0], self.font)) if self.width < ren.get_width(): self.width = ren.get_width() self.scene.addObjects(self.font_list) def draw(self): """Draw the menu to the surface.""" i=0 help_txt = "" for o in self.options: if i==self.option: clr = self.hcolor help_txt = o[2] else: clr = self.color text = o[0] self.font_list[i].changeText(text, clr) self.font_list[i].setPosition( self.x, self.y + i*self.font.get_height() ) i+=1 # Help Text self.help_text.changeText(help_txt, self.color) self.help_text.setPosition(self.hx+5, self.hy) def update(self, event): """Update the menu and get input for the menu.""" return_val = False if event.type == pygame.KEYDOWN: if event.key == pygame.K_DOWN: self.option += 1 return_val = True elif event.key == pygame.K_UP: self.option -= 1 return_val = True elif event.key == pygame.K_RETURN: self.options[self.option][1]() return_val = True if self.option > len(self.options)-1: self.option = 0 elif self.option < 0: self.option = len(self.options)-1 return return_val def set_pos(self, x, y): """Set the topleft of the menu at x,y""" self.x = x self.y = y def set_font(self, font): """Set the font used for the menu.""" self.font = font def set_highlight_color(self, color): """Set the highlight color""" self.hcolor = color def set_normal_color(self, color): """Set the normal color""" self.color = color def center_at(self, x, y): """Center the center of the menu at x,y""" self.x = x-(self.width/2) self.y = y-(self.height/2) self.centerx = x self.centery = y def help_text_at(self, x, y): self.hx = x self.hy = y def clear_menu(self): for dfo in self.font_list: self.scene.removeObject(dfo) self.scene.removeObject(self.help_text)
class BattleMenuHolder( GameEngineElement ): def __init__(self, callback): GameEngineElement.__init__(self, has_draw=True, has_event=False) self.menu = None self.callback = callback self.background = DrawableObject([pygame.image.load( MENU_PATH + "battleMenubackground.gif")], '') self.font = pygame.font.SysFont("cmr10",18,False,False) self.disp = DrawableFontObject("", self.font) self.sec_disp = DrawableFontObject("", self.font) self.add_to_scene([self.background]) self.add_to_scene([self.disp]) self.add_to_scene([self.sec_disp]) def set_disp(self, msg): self.disp.changeText(msg, (0,0,0)) def set_sec_disp(self, msg): self.sec_disp.changeText(msg, (0,0,0)) def remove_from_engine(self): super( BattleMenuHolder, self ).remove_from_engine() self.clear_menu() def draw(self): self.background.setPosition(0,286) self.disp.setPosition(250,340) self.sec_disp.setPosition(237, 375) def menu_called(self, id): self.callback(id, self) def clear_menu(self): if self.menu: self.menu.clear() self.menu.remove_from_engine() self.menu = None def show_menu(self,id): if self.is_in_engine(): self.clear_menu() else: self.add_to_engine() y_offset = 0 if id == "selection": menu_type = NORMAL_MENU menu_options = [ [_("Attack"), lambda: self.menu_called("attack_show"), 140,1], [_('Special'), lambda: self.show_menu("special"), 140,1], [_('Magic'), lambda: self.show_menu("magic"), 140,1], [_('Scan'), lambda: self.menu_called("scan"), 140,1], ] elif id == "attack": y_offset = 50 menu_type = GRID_MENU menu_options = [ ['1', lambda: self.menu_called('1'),44,1], ['2', lambda: self.menu_called('2'),44,1], ['3', lambda: self.menu_called('3'),44,1], ['4', lambda: self.menu_called('4'),44,1], ['5', lambda: self.menu_called('5'),44,1], ['6', lambda: self.menu_called('6'),44,1], ['7', lambda: self.menu_called('7'),44,1], ['8', lambda: self.menu_called('8'),44,1], ['9', lambda: self.menu_called('9'),44,1], [_("C"), lambda: self.menu_called('clear'),44,1], ['0', lambda: self.menu_called('0'),44,1], [_("E"), lambda: self.menu_called('enter'),44,1], ] elif id == "special": menu_type = NORMAL_MENU menu_options = [ [_("Back"), lambda: self.show_menu("selection"),140,1] ] elif id == "magic": menu_type = NORMAL_MENU menu_options = [ [_("Fire"), lambda: self.menu_called("fire"), 140, 1], [_("Lightning"), lambda: self.menu_called("lightning"), 140, 1], [_("Missile"), lambda: self.menu_called("missile"), 140, 1], [_("Heal"), lambda: self.menu_called("heal"), 140, 1], [_("Back"), lambda: self.show_menu("selection"), 140, 1] ] else: print "Invalid Menu", id return self.menu = BattleMenu(menu_options, 237, 375+y_offset, menu_type)