changeset 20:347667c941de

Hook up area.
author Simon Cross <hodgestar@gmail.com>
date Sun, 01 Sep 2013 15:18:11 +0200
parents 113f31bd9d49
children 1b048d2a8411
files nagslang/engine.py nagslang/events.py nagslang/screens/area.py nagslang/screens/base.py nagslang/screens/menu.py
diffstat 5 files changed, 66 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/nagslang/engine.py	Sun Sep 01 14:50:12 2013 +0200
+++ b/nagslang/engine.py	Sun Sep 01 15:18:11 2013 +0200
@@ -4,6 +4,8 @@
 
 from nagslang import constants
 from nagslang.screens.menu import MenuScreen
+from nagslang.screens.area import AreaScreen
+from nagslang.events import ScreenChange
 
 
 class Engine(object):
@@ -11,7 +13,19 @@
         self._surface = surface
         self._clock = pygame.time.Clock()
         self._fps = constants.FPS
-        self._current_area = MenuScreen()
+        self._world = None  # TODO: create the world
+        self._current_screen = None
+        self._screens = {
+            'menu': MenuScreen,
+            'level1': AreaScreen,
+        }
+        self.change_screen('menu')
+
+    def change_screen(self, new_screen):
+        if self._current_screen is not None:
+            self._current_screen.teardown()
+        self._current_screen = self._screens[new_screen]()
+        self._current_screen.setup(self._world)
 
     def run(self):
         running = True
@@ -19,8 +33,10 @@
             for ev in pygame.event.get():
                 if ev.type == pygame.locals.QUIT:
                     running = False
+                elif ScreenChange.matches(ev):
+                    self.change_screen(ev.screen)
                 else:
-                    self._current_area.handle_event(ev)
-            self._current_area.render(self._surface)
+                    self._current_screen.handle_event(ev)
+            self._current_screen.render(self._surface)
             pygame.display.flip()
             self._clock.tick(self._fps)
--- a/nagslang/events.py	Sun Sep 01 14:50:12 2013 +0200
+++ b/nagslang/events.py	Sun Sep 01 15:18:11 2013 +0200
@@ -1,7 +1,6 @@
 """Events to post."""
 
-from pygame import event
-import pygame.locals as pyl
+import pygame
 
 
 class Event(object):
@@ -9,9 +8,32 @@
 
     @classmethod
     def post(cls, **data):
-        ev = event.Event(cls.TYPE, **data)
-        event.post(ev)
+        ev = pygame.event.Event(cls.TYPE, **data)
+        pygame.event.post(ev)
+
+    @classmethod
+    def matches(cls, ev):
+        return ev.type == cls.TYPE
 
 
 class QuitEvent(Event):
-    TYPE = pyl.QUIT
+    TYPE = pygame.locals.QUIT
+
+
+class UserEvent(Event):
+    TYPE = pygame.locals.USEREVENT
+
+    @classmethod
+    def post(cls, **data):
+        super(UserEvent, cls).post(user_type=cls.__name__, **data)
+
+    @classmethod
+    def matches(cls, ev):
+        return (super(UserEvent, cls).matches(ev)
+                and ev.user_type == cls.__name__)
+
+
+class ScreenChange(UserEvent):
+    @classmethod
+    def post(cls, new_screen):
+        super(ScreenChange, cls).post(screen=new_screen)
--- a/nagslang/screens/area.py	Sun Sep 01 14:50:12 2013 +0200
+++ b/nagslang/screens/area.py	Sun Sep 01 15:18:11 2013 +0200
@@ -1,11 +1,16 @@
 """Display a game area."""
 
+import pygame
+
 from nagslang.screens.base import Screen
+from nagslang.events import ScreenChange
 
 
 class AreaScreen(Screen):
     def handle_event(self, ev):
-        pass
+        if ev.type == pygame.locals.KEYDOWN:
+            if ev.key == pygame.locals.K_ESCAPE:
+                ScreenChange.post('menu')
 
     def render(self, surface):
-        pass
+        surface.fill(pygame.color.Color(0, 0, 0))
--- a/nagslang/screens/base.py	Sun Sep 01 14:50:12 2013 +0200
+++ b/nagslang/screens/base.py	Sun Sep 01 15:18:11 2013 +0200
@@ -9,6 +9,13 @@
     def __init__(self):
         self.space = pymunk.Space()
 
+    def setup(self, world):
+        """Perform setup based on the world state."""
+        pass
+
+    def teardown(self):
+        pass
+
     def post_event(self, ev):
         event.post(ev)
 
--- a/nagslang/screens/menu.py	Sun Sep 01 14:50:12 2013 +0200
+++ b/nagslang/screens/menu.py	Sun Sep 01 15:18:11 2013 +0200
@@ -3,15 +3,17 @@
 import pygame
 
 from nagslang.screens.base import Screen
-from nagslang.events import QuitEvent
+from nagslang.events import QuitEvent, ScreenChange
 
 
 class MenuScreen(Screen):
 
     def handle_event(self, ev):
-        if (ev.type == pygame.locals.KEYDOWN
-                and ev.key == pygame.locals.K_ESCAPE):
-            QuitEvent.post()
+        if ev.type == pygame.locals.KEYDOWN:
+            if ev.key == pygame.locals.K_ESCAPE:
+                QuitEvent.post()
+            elif ev.key == pygame.locals.K_1:
+                ScreenChange.post('level1')
 
     def render(self, surface):
         color = pygame.color.Color(255, 0, 0)