Jul-09-2018, 05:20 PM
Here another way.
example
example
import pygame pygame.init() class Scene: def blit(self, surface): pass def event(self, event): pass class Game: fps = 0 clock = None scenes = {} surface = None running = False next_scene = None current_scene = None @classmethod def setup(cls, caption, size): cls.clock = pygame.time.Clock() pygame.display.set_caption(caption) cls.surface = pygame.display.set_mode(size) @classmethod def loop(cls, intro_scene, fps=30): cls.fps = fps cls.running = True cls.next_scene = intro_scene while cls.running: if cls.next_scene: cls.current_scene = cls.scenes[cls.next_scene] cls.next_scene = None for event in pygame.event.get(): cls.current_scene.event(event) cls.current_scene.blit(cls.surface) pygame.display.flip() cls.clock.tick(cls.fps) class MenuItem: default_color = (0, 0 ,200) default_hcolor = (0, 200, 0) default_font = pygame.font.Font(None, 36) def __init__(self, name, callback, pydata=None): self.name = name self.hover = False self.pydata = pydata self.callback = callback def image(self, color=None, hcolor=None, font=None): self.hcolor = [hcolor, MenuItem.default_hcolor][hcolor is None] self.color = [color, MenuItem.default_color][color is None] self.font = [font, MenuItem.default_font][font is None] self.image = self.font.render(self.name, 1, self.color) self.hover_image = self.font.render(self.name, 1, self.hcolor) self.rect = self.image.get_rect() return self class Menu: def __init__(self, rect, spacing=4): self.rect = rect self.items = [] self.spacing = spacing self.location = 0 def add(self, item): self.items.append(item) def blit(self, surface): for item in self.items: if not item.hover: surface.blit(item.image, item.rect) else: surface.blit(item.hover_image, item.rect) def event(self, event): if event.type == pygame.MOUSEMOTION: for item in self.items: if item.rect.collidepoint(event.pos): item.hover = True else: item.hover = False elif event.type == pygame.MOUSEBUTTONDOWN: for item in self.items: if item.rect.collidepoint(event.pos): item.callback() # untested def align_left(self): x = self.rect.x + 1 down = 1 for item in self.items: item.rect.x = x item.rect.y = down down += item.font.get_linesize() def align_center(self): down = self.rect.height / 2 + self.rect.y for item in self.items: down -= (item.font.get_linesize() / 2 + self.spacing / 2) for item in self.items: item.rect.x = self.rect.x + self.rect.width / 2 - item.rect.width / 2 item.rect.y = down down += item.font.get_linesize() + self.spacing class Intro(Scene): def __init__(self): rect = Game.surface.get_rect() self.menu = Menu(rect.inflate(-100, -100)) self.menu.add(MenuItem('New Game', self.menu_newgame).image()) self.menu.add(MenuItem('Options', self.menu_options).image()) self.menu.add(MenuItem('Quit', self.menu_quit).image(color=(150,0,0), hcolor=(250,0,0))) self.menu.align_center() def blit(self, surface): surface.fill((0,0,0)) self.menu.blit(surface) def event(self, event): if event.type == pygame.QUIT: Game.running = False elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: Game.running = False else: self.menu.event(event) def menu_newgame(self): print('Menu New Game') def menu_options(self): print('Menu Options') def menu_quit(self): Game.running = False def main(): Game.setup('Menu', (800, 600)) Game.scenes['Intro'] = Intro() Game.loop('Intro') pygame.quit() if __name__ == '__main__': main()
99 percent of computer problems exists between chair and keyboard.