changeset 596:5496dcd16a84 pyntnclick

Add pyntnclick.engine, based on mamba
author Stefano Rivera <stefano@rivera.za.net>
date Sat, 11 Feb 2012 18:22:57 +0200
parents 59f1ee3f5632
children c0e0b3d5730c
files pyntnclick/engine.py pyntnclick/main.py
diffstat 2 files changed, 68 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pyntnclick/engine.py	Sat Feb 11 18:22:57 2012 +0200
@@ -0,0 +1,67 @@
+"""Game engine and top-level game loop."""
+
+import pygame
+import pygame.event
+import pygame.display
+import pygame.time
+from pygame.locals import QUIT, USEREVENT
+
+
+class Engine(object):
+    def __init__(self, game_description):
+        self._screen = None
+        self._game_description = game_description
+
+    def set_screen(self, screen):
+        if self._screen is not None:
+            self._screen.on_exit()
+        self._screen = screen
+        if self._screen is not None:
+            self._screen.on_enter()
+
+    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 ScreenChangeEvent.matches(ev):
+                    self.set_habitat(ev.habitat)
+                else:
+                    self._screen.dispatch(ev)
+            surface = pygame.display.get_surface()
+            self._habitat.draw(surface)
+            flip()
+            self._fps = 1000.0 / clock.tick(
+                    self.game_description.constants.fps)
+
+
+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):
+        super(ScreenChangeEvent, cls).post(screen=screen)
--- a/pyntnclick/main.py	Sat Feb 11 18:18:59 2012 +0200
+++ b/pyntnclick/main.py	Sat Feb 11 18:22:57 2012 +0200
@@ -34,7 +34,7 @@
         self.menu_screen = MenuScreen(self, game_description)
         self.game_screen = GameScreen(self, game_description)
         self.end_screen = EndScreen(self, game_description)
-        self.set_timer(game_description.constants.frame_rate)
+        #self.set_timer(game_description.constants.frame_rate)
         self.show_screen(self.menu_screen)