Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Simple Menu Example. Still can be improved.
- import os
- import pygame
- import itertools
- from pygame.sprite import Sprite, Group
- class Scene:
- def on_draw(self, surface): pass
- def on_event(self, event): pass
- def on_update(self, delta): pass
- class Manager:
- def __init__(self, caption, width, height, center=True):
- if center:
- os.environ['SDL_VIDEO_CENTERED'] = '1'
- # Basic pygame setup
- pygame.display.set_caption(caption)
- self.surface = pygame.display.set_mode((width, height))
- self.rect = self.surface.get_rect()
- self.clock = pygame.time.Clock()
- self.running = False
- self.delta = 0
- self.fps = 60
- # Scene Interface
- self.scene = Scene()
- def mainloop(self):
- self.running = True
- while self.running:
- for event in pygame.event.get():
- self.scene.on_event(event)
- self.scene.on_update(self.delta)
- self.scene.on_draw(self.surface)
- pygame.display.flip()
- self.delta = self.clock.tick(self.fps)
- def quit(self):
- self.running = False
- class MenuEntry(Sprite):
- identity = 0
- @classmethod
- def load_defaults(cls):
- cls.font = pygame.font.Font(None, 32)
- cls.color = pygame.Color('white')
- cls.highlight_color = pygame.Color('dodgerblue')
- def __init__(self, text, callback):
- Sprite.__init__(self)
- self.text = text
- self.hover = False
- self.callback = callback
- self.render()
- self.update_image()
- self.rect = self.image.get_rect()
- self.identity = MenuEntry.identity
- MenuEntry.identity += 1
- def render(self):
- color = MenuEntry.color
- highlight_color = MenuEntry.highlight_color
- self._image = MenuEntry.font.render(self.text, 1, color)
- self._hover = MenuEntry.font.render(self.text, 1, highlight_color)
- def on_mousemotion(self, event):
- self.hover = self.rect.collidepoint(event.pos)
- self.update_image()
- def on_mousebuttondown(self, event):
- if self.hover:
- if event.button == 1:
- self.callback()
- def update_image(self):
- if self.hover:
- self.image = self._hover
- else:
- self.image = self._image
- class MenuScene(Scene):
- def __init__(self, manager):
- self.menu = Group(
- MenuEntry("Resume Game", self.on_resume_game),
- MenuEntry("Goto Title Screen", self.on_goto_title),
- MenuEntry("Exit Program", self.on_exit)
- )
- centerx = manager.rect.centerx
- y = itertools.count(50, 40)
- for sprite in self.menu:
- sprite.rect.centerx = centerx
- sprite.rect.y = next(y)
- self.manager = manager
- self.select = 0
- self.on_select()
- def on_draw(self, surface):
- self.menu.draw(surface)
- def on_event(self, event):
- if event.type == pygame.QUIT:
- self.manager.quit()
- elif event.type == pygame.KEYDOWN:
- if event.key == pygame.K_DOWN:
- self.select = (self.select + 1) % len(self.menu)
- self.on_select()
- elif event.key == pygame.K_UP:
- self.select = (self.select - 1) % len(self.menu)
- self.on_select()
- elif event.key == pygame.K_RETURN:
- for sprite in self.menu:
- if sprite.identity == self.select:
- sprite.callback()
- elif event.type == pygame.MOUSEMOTION:
- for sprite in self.menu:
- sprite.on_mousemotion(event)
- if sprite.hover:
- self.select = sprite.identity
- self.on_select()
- elif event.type == pygame.MOUSEBUTTONDOWN:
- for sprite in self.menu:
- sprite.on_mousebuttondown(event)
- def on_exit(self):
- self.manager.quit()
- def on_goto_title(self):
- print("going to title screen")
- def on_resume_game(self):
- print("resuming game")
- def on_select(self):
- for sprite in self.menu:
- sprite.hover = sprite.identity == self.select
- sprite.update_image()
- def main():
- pygame.init()
- manager = Manager("Menu Example", 800, 600)
- MenuEntry.load_defaults()
- manager.scene = MenuScene(manager)
- manager.mainloop()
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement