Mercurial > boomslang
diff pyntnclick/engine.py @ 854:79b5c1be9a5e default tip
Remove pyntnclick, it's its own library, now
author | Stefano Rivera <stefano@rivera.za.net> |
---|---|
date | Sat, 21 Jun 2014 22:06:09 +0200 |
parents | f95830b58336 |
children |
line wrap: on
line diff
--- a/pyntnclick/engine.py Sat Jun 21 22:04:35 2014 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,155 +0,0 @@ -"""Game engine and top-level game loop.""" - -import pygame -import pygame.event -import pygame.display -import pygame.time -from pygame.locals import QUIT, USEREVENT - -# We can't do this via our usual UserEvent trickey -# as it gets generated by pygame.music, which only -# takes an event type -MUSIC_ENDED = USEREVENT + 1 - - -class Engine(object): - def __init__(self, gd): - self._screen = None - self._gd = gd - self.screens = {} - - def set_screen(self, screen_name): - if self._screen is not None: - self._screen.on_exit() - self._screen = self.screens[screen_name] - if self._screen is not None: - self._screen.on_enter() - - def add_screen(self, name, screen): - self.screens[name] = screen - - def run(self): - """Game loop.""" - - get_events = pygame.event.get - flip = pygame.display.flip - clock = pygame.time.Clock() - while True: - events = get_events() - for ev in events: - if ev.type == QUIT: - return - elif ev.type == MUSIC_ENDED: - self._gd.sound.music_ended() - elif ScreenChangeEvent.matches(ev): - self.set_screen(ev.screen_name) - elif ScreenEvent.matches(ev): - self.screens[ev.screen_name].process_event(ev.event_name, - ev.data) - else: - self._screen.dispatch(ev) - # Ping the screen / scene - self._screen.animate() - surface = pygame.display.get_surface() - self._screen.draw(surface) - flip() - self._fps = 1000.0 / clock.tick( - self._gd.constants.frame_rate) - - -class Screen(object): - """A top level object for the screen being displayed""" - - def __init__(self, gd): - # Avoid import loop - from pyntnclick.widgets.base import Container - - self.gd = gd - self.resource = gd.resource - - self.surface_size = gd.constants.screen - self.surface = None - self.container = Container((0, 0), self.gd, self.surface_size) - self.setup() - - def on_enter(self): - """Called when this becomes the current screen.""" - # Create the surface here as flipping between editor and - # other things kills pygame.display - self.surface = pygame.Surface(self.surface_size) - - def on_exit(self): - """Called when this stops being the current screen.""" - self.surface = None - - def setup(self): - """Override for initialization""" - pass - - def dispatch(self, ev): - self.container.event(ev) - - def animate(self): - """Called every tick - used for peroidic events, etc. - - Interested classes are expected to override this""" - pass - - def draw_background(self): - self.surface.fill(pygame.Color('gray')) - - def draw(self, surface): - if self.surface: - self.draw_background() - self.container.draw(self.surface) - surface.blit(self.surface, self.surface.get_rect()) - - def display_dialog(self, dialog): - self.container.paused = True - self.container.add(dialog) - dialog.grab_focus() - - def change_screen(self, new_screen_name): - ScreenChangeEvent.post(new_screen_name) - - def screen_event(self, screen_name, event_name, data=None): - ScreenEvent.post(screen_name, event_name, data) - - def process_event(self, event_name, data): - pass - - -class UserEvent(object): - """A user event type allowing subclassing, - to provide an infinate number of user-defined events - """ - - TYPE = "UNKNOWN" - - @classmethod - def post(cls, **kws): - ev = pygame.event.Event(USEREVENT, utype=cls.TYPE, **kws) - pygame.event.post(ev) - - @classmethod - def matches(cls, ev): - return ev.type == USEREVENT and ev.utype == cls.TYPE - - -class ScreenChangeEvent(UserEvent): - - TYPE = "SCREEN_CHANGE" - - @classmethod - def post(cls, screen_name): - super(ScreenChangeEvent, cls).post(screen_name=screen_name) - - -class ScreenEvent(UserEvent): - - TYPE = "SCREEN_EVENT" - - @classmethod - def post(cls, screen_name, event_name, data): - super(ScreenEvent, cls).post(screen_name=screen_name, - event_name=event_name, data=data)