Mercurial > nagslang
changeset 276:3153196517fc
Move protagonist to the world
author | Neil Muller <drnlmuller@gmail.com> |
---|---|
date | Thu, 05 Sep 2013 13:09:14 +0200 |
parents | 2abb61878bb1 |
children | 56e42c00da25 |
files | nagslang/engine.py nagslang/events.py nagslang/game_object.py nagslang/protagonist.py nagslang/screens/area.py nagslang/screens/base.py nagslang/screens/menu.py nagslang/world.py |
diffstat | 8 files changed, 26 insertions(+), 19 deletions(-) [+] |
line wrap: on
line diff
--- a/nagslang/engine.py Thu Sep 05 12:04:14 2013 +0200 +++ b/nagslang/engine.py Thu Sep 05 13:09:14 2013 +0200 @@ -24,17 +24,17 @@ 'level2': AreaScreen, } self._world.load() - self.change_screen('menu', None) + self.change_screen('menu') # Dummy resize event, to force us to realise our real size # http://stackoverflow.com/q/16442573/8629 pygame.event.post(pygame.event.Event(pgl.VIDEORESIZE, size=(0, 0), w=0, h=0)) - def change_screen(self, new_screen, player): + def change_screen(self, new_screen): if self._current_screen is not None: self._current_screen.teardown() screen_cls = self._screens[new_screen] - self._current_screen = screen_cls(new_screen, player, self._world) + self._current_screen = screen_cls(new_screen, self._world) self._current_screen.setup() def run(self): @@ -50,7 +50,7 @@ elif ScreenChange.matches(ev): self._world.save() self._surface.fill(pygame.color.Color(0, 0, 0)) - self.change_screen(ev.screen, ev.player) + self.change_screen(ev.screen) else: self._current_screen.handle_event(ev) self._current_screen.tick(self._dt)
--- a/nagslang/events.py Thu Sep 05 12:04:14 2013 +0200 +++ b/nagslang/events.py Thu Sep 05 13:09:14 2013 +0200 @@ -37,7 +37,7 @@ class ScreenChange(UserEvent): @classmethod def post(cls, new_screen, player=None): - super(ScreenChange, cls).post(screen=new_screen, player=player) + super(ScreenChange, cls).post(screen=new_screen) class DoorEvent(UserEvent):
--- a/nagslang/game_object.py Thu Sep 05 12:04:14 2013 +0200 +++ b/nagslang/game_object.py Thu Sep 05 13:09:14 2013 +0200 @@ -27,6 +27,9 @@ def get_space(self): return self._space + def set_space(self, new_space): + self._space = new_space + def set_game_object(self, game_object): self.game_object = game_object
--- a/nagslang/protagonist.py Thu Sep 05 12:04:14 2013 +0200 +++ b/nagslang/protagonist.py Thu Sep 05 13:09:14 2013 +0200 @@ -85,6 +85,11 @@ def _get_image(self, name, *transforms): return resources.get_image('creatures', name, transforms=transforms) + def change_space(self, new_space): + self.physicser.remove_from_space() + self.physicser.set_space(new_space) + self.physicser.add_to_space() + def _make_renderer(self): return ProtagonistFormSelectionRenderer({ self.HUMAN_FORM: render.FacingSelectionRenderer(
--- a/nagslang/screens/area.py Thu Sep 05 12:04:14 2013 +0200 +++ b/nagslang/screens/area.py Thu Sep 05 13:09:14 2013 +0200 @@ -7,7 +7,6 @@ from nagslang.constants import COLLISION_TYPE_PLAYER, CALLBACK_COLLIDERS from nagslang.events import ScreenChange, DoorEvent, FireEvent from nagslang.level import Level -from nagslang.protagonist import Protagonist from nagslang.screens.base import Screen from nagslang.game_object import Bullet from nagslang.sound import sound @@ -73,14 +72,7 @@ self._drawables = Drawables() self.add_walls() self._add_collision_handlers() - if self.protagonist is not None: - # We do things this way to avoid extra pymunk - # juggling to move objects between spaces - old_protagonist = self.protagonist - self.add_protagonist() - self.protagonist.copy_state(old_protagonist) - else: - self.add_protagonist() + self.add_protagonist() self.add_game_objects() sound.play_music("POL-cyber-factory-short.ogg") @@ -123,7 +115,8 @@ self._drawables.add(drawable) def add_protagonist(self): - self.protagonist = Protagonist(self.space, (350, 300)) + self.protagonist = self.world.protagonist + self.protagonist.change_space(self.space) self._drawables.add(self.protagonist) def handle_event(self, ev): @@ -142,7 +135,7 @@ # Go to anther screen self._disable_render = True self.world.rooms += 1 - ScreenChange.post(ev.destination, self.protagonist) + ScreenChange.post(ev.destination) return # else we're teleporting within the screen, and just the # position change is enough
--- a/nagslang/screens/base.py Thu Sep 05 12:04:14 2013 +0200 +++ b/nagslang/screens/base.py Thu Sep 05 13:09:14 2013 +0200 @@ -6,10 +6,9 @@ class Screen(object): - def __init__(self, name, player, world): + def __init__(self, name, world): self.name = name self.world = world - self.protagonist = player self.space = pymunk.Space() def setup(self):
--- a/nagslang/screens/menu.py Thu Sep 05 12:04:14 2013 +0200 +++ b/nagslang/screens/menu.py Thu Sep 05 13:09:14 2013 +0200 @@ -46,7 +46,7 @@ widget.draw(surface) def play(self): - ScreenChange.post('level1', None) + ScreenChange.post('level1') def restart(self): self.world.reset()
--- a/nagslang/world.py Thu Sep 05 12:04:14 2013 +0200 +++ b/nagslang/world.py Thu Sep 05 13:09:14 2013 +0200 @@ -5,7 +5,10 @@ import os import sys +import pymunk + from nagslang.yamlish import dump, load +from nagslang.protagonist import Protagonist class World(object): @@ -18,6 +21,7 @@ self.transformations = 0 self.kills = 0 self.rooms = 0 + self.protagonist = Protagonist(pymunk.Space(), (350, 300)) def _save_location(self): app = 'nagslang' @@ -37,6 +41,9 @@ value = getattr(self, attr) if hasattr(value, '__name__'): continue + # Hack until we save protagonist state + if hasattr(value, 'animate'): + continue data[attr] = value fn = self._save_location()