Advertisement
Windspar

Pygame SceneManager

Oct 25th, 2019
354
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.90 KB | None | 0 0
  1. import pygame
  2. import os
  3.  
  4. class Scene:
  5.     # SceneManager Interface
  6.     def scene_draw(self, surface):
  7.         self.on_draw(surface)
  8.  
  9.     def scene_drop(self):
  10.         self.on_drop()
  11.  
  12.     def scene_event(self):
  13.         for event in pygame.event.get():
  14.             if event.type == pygame.QUIT:
  15.                 self.on_quit()
  16.             else:
  17.                 self.on_event(event)
  18.  
  19.     def scene_focus(self, *args, **kwargs):
  20.         self.on_focus(*args, **kwargs)
  21.  
  22.     def scene_new(self,*args, **kwargs):
  23.         self.on_new(*args, **kwargs)
  24.  
  25.     def scene_update(self, delta):
  26.         self.on_update(delta)
  27.  
  28.     def flip(self, scene, *args, **kwargs):
  29.         SceneManager.flip(scene, *args, **kwargs)
  30.  
  31.     def flip_new(self, scene, *args, **kwargs):
  32.         SceneManager.flip_new(scene, *args, **kwargs)
  33.  
  34.     def on_quit(self):
  35.         SceneManager.quit()
  36.  
  37.     # Scene Interface
  38.     def on_draw(self, surface): pass
  39.     def on_drop(self): pass
  40.     def on_event(self, event): pass
  41.     def on_focus(self): pass
  42.     def on_new(self): pass
  43.     def on_update(self, delta): pass
  44.  
  45. class SceneManager:
  46.     @classmethod
  47.     def create(cls, title, width, height, center=False):
  48.         if center is True:
  49.             os.environ['SDL_VIDEO_CENTERED'] = '1'
  50.         elif center:
  51.             os.environ['SDL_VIDEO_WINDOW_POS'] = '{0}, {1}'.format(*center)
  52.  
  53.         # Basic pygame setup
  54.         pygame.display.set_caption(title)
  55.         cls.surface = pygame.display.set_mode((width, height))
  56.         cls.rect = cls.surface.get_rect()
  57.         cls.clock = pygame.time.Clock()
  58.         cls.running = False
  59.         cls.delta = 0
  60.         cls.fps = 60
  61.  
  62.         # Scene handling
  63.         cls._scene = Scene()
  64.         cls.scenes = {}
  65.  
  66.         cls.extension = []
  67.  
  68.     @classmethod
  69.     def add_scene(cls, scene, name=None):
  70.         if name is None:
  71.             name = scene.__class__.__name__
  72.  
  73.         cls.scenes[name] = scene
  74.  
  75.     @classmethod
  76.     def _flip(cls, scene):
  77.         cls._scene.scene_drop()
  78.         if isinstance(scene, Scene):
  79.             cls._scene = scene
  80.         else:
  81.             # String: Load live scene
  82.             cls._scene = cls.scenes[scene]
  83.  
  84.     @classmethod
  85.     def flip(cls, scene, *args, **kwargs):
  86.         cls._flip(scene)
  87.         cls._scene.scene_focus(*args, **kwargs)
  88.  
  89.     @classmethod
  90.     def flip_new(cls, scene, *args, **kwargs):
  91.         cls._flip(scene)
  92.         cls._scene.scene_new(*args, **kwargs)
  93.  
  94.     @classmethod
  95.     def mainloop(cls):
  96.         cls.running = True
  97.         while cls.running:
  98.             cls._scene.scene_event()
  99.             cls._scene.scene_update(cls.delta)
  100.             cls._scene.scene_draw(cls.surface)
  101.             for extension in cls.extension:
  102.                 extension(cls)
  103.  
  104.             pygame.display.flip()
  105.             cls.delta = cls.clock.tick(cls.fps)
  106.  
  107.     @classmethod
  108.     def quit(cls):
  109.         cls.running = False
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement