# HG changeset patch # User Simon Cross # Date 1378041491 -7200 # Node ID 347667c941deb12cd0ded7377fb16c298b097dce # Parent 113f31bd9d49c2e909b47b34d23e9d57d6c14c6e Hook up area. diff -r 113f31bd9d49 -r 347667c941de nagslang/engine.py --- 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) diff -r 113f31bd9d49 -r 347667c941de nagslang/events.py --- 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) diff -r 113f31bd9d49 -r 347667c941de nagslang/screens/area.py --- 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)) diff -r 113f31bd9d49 -r 347667c941de nagslang/screens/base.py --- 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) diff -r 113f31bd9d49 -r 347667c941de nagslang/screens/menu.py --- 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)