Advertisement
Windspar

Pygame Diablo Like Menu

Nov 28th, 2019
528
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.50 KB | None | 0 0
  1. # Simple Menu Example. Still can be improved.
  2.  
  3. import os
  4. import pygame
  5. import itertools
  6. from pygame.sprite import Sprite, Group
  7.  
  8. class Scene:
  9.     def on_draw(self, surface): pass
  10.     def on_event(self, event): pass
  11.     def on_update(self, delta): pass
  12.  
  13. class Manager:
  14.     def __init__(self, caption, width, height, center=True):
  15.         if center:
  16.             os.environ['SDL_VIDEO_CENTERED'] = '1'
  17.  
  18.         # Basic pygame setup
  19.         pygame.display.set_caption(caption)
  20.         self.surface = pygame.display.set_mode((width, height))
  21.         self.rect = self.surface.get_rect()
  22.         self.clock = pygame.time.Clock()
  23.         self.running = False
  24.         self.delta = 0
  25.         self.fps = 60
  26.  
  27.         # Scene Interface
  28.         self.scene = Scene()
  29.  
  30.     def mainloop(self):
  31.         self.running = True
  32.         while self.running:
  33.             for event in pygame.event.get():
  34.                 self.scene.on_event(event)
  35.  
  36.             self.scene.on_update(self.delta)
  37.             self.scene.on_draw(self.surface)
  38.             pygame.display.flip()
  39.             self.delta = self.clock.tick(self.fps)
  40.  
  41.     def quit(self):
  42.         self.running = False
  43.  
  44. class MenuEntry(Sprite):
  45.     identity = 0
  46.  
  47.     @classmethod
  48.     def load_defaults(cls):
  49.         cls.font = pygame.font.Font(None, 32)
  50.         cls.color = pygame.Color('white')
  51.         cls.highlight_color = pygame.Color('dodgerblue')
  52.  
  53.     def __init__(self, text, callback):
  54.         Sprite.__init__(self)
  55.         self.text = text
  56.         self.hover = False
  57.         self.callback = callback
  58.         self.render()
  59.         self.update_image()
  60.         self.rect = self.image.get_rect()
  61.         self.identity = MenuEntry.identity
  62.         MenuEntry.identity += 1
  63.  
  64.     def render(self):
  65.         color = MenuEntry.color
  66.         highlight_color = MenuEntry.highlight_color
  67.         self._image = MenuEntry.font.render(self.text, 1, color)
  68.         self._hover = MenuEntry.font.render(self.text, 1, highlight_color)
  69.  
  70.     def on_mousemotion(self, event):
  71.         self.hover = self.rect.collidepoint(event.pos)
  72.         self.update_image()
  73.  
  74.     def on_mousebuttondown(self, event):
  75.         if self.hover:
  76.             if event.button == 1:
  77.                 self.callback()
  78.  
  79.     def update_image(self):
  80.         if self.hover:
  81.             self.image = self._hover
  82.         else:
  83.             self.image = self._image
  84.  
  85. class MenuScene(Scene):
  86.     def __init__(self, manager):
  87.         self.menu = Group(
  88.             MenuEntry("Resume Game", self.on_resume_game),
  89.             MenuEntry("Goto Title Screen", self.on_goto_title),
  90.             MenuEntry("Exit Program", self.on_exit)
  91.         )
  92.  
  93.         centerx = manager.rect.centerx
  94.         y = itertools.count(50, 40)
  95.         for sprite in self.menu:
  96.             sprite.rect.centerx = centerx
  97.             sprite.rect.y = next(y)
  98.  
  99.         self.manager = manager
  100.         self.select = 0
  101.         self.on_select()
  102.  
  103.     def on_draw(self, surface):
  104.         self.menu.draw(surface)
  105.  
  106.     def on_event(self, event):
  107.         if event.type == pygame.QUIT:
  108.             self.manager.quit()
  109.         elif event.type == pygame.KEYDOWN:
  110.             if event.key == pygame.K_DOWN:
  111.                 self.select = (self.select + 1) % len(self.menu)
  112.                 self.on_select()
  113.             elif event.key == pygame.K_UP:
  114.                 self.select = (self.select - 1) % len(self.menu)
  115.                 self.on_select()
  116.             elif event.key == pygame.K_RETURN:
  117.                 for sprite in self.menu:
  118.                     if sprite.identity == self.select:
  119.                         sprite.callback()
  120.         elif event.type == pygame.MOUSEMOTION:
  121.             for sprite in self.menu:
  122.                 sprite.on_mousemotion(event)
  123.                 if sprite.hover:
  124.                     self.select = sprite.identity
  125.                     self.on_select()
  126.  
  127.         elif event.type == pygame.MOUSEBUTTONDOWN:
  128.             for sprite in self.menu:
  129.                 sprite.on_mousebuttondown(event)
  130.  
  131.     def on_exit(self):
  132.         self.manager.quit()
  133.  
  134.     def on_goto_title(self):
  135.         print("going to title screen")
  136.  
  137.     def on_resume_game(self):
  138.         print("resuming game")
  139.  
  140.     def on_select(self):
  141.         for sprite in self.menu:
  142.             sprite.hover = sprite.identity == self.select
  143.             sprite.update_image()
  144.  
  145. def main():
  146.     pygame.init()
  147.     manager = Manager("Menu Example", 800, 600)
  148.     MenuEntry.load_defaults()
  149.     manager.scene = MenuScene(manager)
  150.     manager.mainloop()
  151.  
  152. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement