# HG changeset patch # User Jeremy Thurgood # Date 1378299993 -7200 # Node ID 9e2ef2f150358b07a60aeceab49dea933aa1ee02 # Parent d98daba73055c9f371bdf3df2572a2d117caefee Better rendering and movement detection. diff -r d98daba73055 -r 9e2ef2f15035 nagslang/enemies.py --- a/nagslang/enemies.py Wed Sep 04 14:53:37 2013 +0200 +++ b/nagslang/enemies.py Wed Sep 04 15:06:33 2013 +0200 @@ -33,6 +33,7 @@ class PatrollingAlien(Enemy): + is_moving = True # Always walking. def __init__(self, space, position, end_position): # An enemy that patrols between the two points diff -r d98daba73055 -r 9e2ef2f15035 nagslang/game_object.py --- a/nagslang/game_object.py Wed Sep 04 14:53:37 2013 +0200 +++ b/nagslang/game_object.py Wed Sep 04 15:06:33 2013 +0200 @@ -117,6 +117,7 @@ """ zorder = ZORDER_LOW + is_moving = False # `True` if a movement animation should play. def __init__(self, physicser, renderer, puzzler=None, overlay=None): self.physicser = physicser @@ -149,13 +150,6 @@ def animate(self): self.renderer.animate() - def is_moving(self): - """Returns `True` if this object is moving. - - This is mostly for movement-based animation renderers to look at. - """ - return self.physicser.get_velocity().length > 0 - def collide_with_protagonist(self): """Called as a `pre_solve` collision callback with the protagonist. diff -r d98daba73055 -r 9e2ef2f15035 nagslang/protagonist.py --- a/nagslang/protagonist.py Wed Sep 04 14:53:37 2013 +0200 +++ b/nagslang/protagonist.py Wed Sep 04 15:06:33 2013 +0200 @@ -26,6 +26,11 @@ return self._form_shapes[self.game_object.form] +class ProtagonistFormSelectionRenderer(render.RendererSelectionRenderer): + def select_renderer(self): + return self.game_object.render_form + + class Protagonist(GameObject): """Representation of our fearless protagonist. @@ -39,13 +44,14 @@ def __init__(self, space, position): physicser = self._make_physics(space, position) - self._setup_renderers() + renderer = self._make_renderer() self.inventory = {} self.form = self.HUMAN_FORM self.render_form = self.HUMAN_FORM + self.angle = 0 + self.is_moving = False - super(Protagonist, self).__init__( - physicser, self._renderers[self.form]) + super(Protagonist, self).__init__(physicser, renderer) self.zorder = ZORDER_MID self.go_human() @@ -78,9 +84,8 @@ def _get_image(self, name, *transforms): return resources.get_image('creatures', name, transforms=transforms) - def _setup_renderers(self): - self.angle = 0 - self._renderers = { + def _make_renderer(self): + return ProtagonistFormSelectionRenderer({ self.HUMAN_FORM: render.FacingSelectionRenderer( { 'left': render.MovementAnimatedRenderer( @@ -117,9 +122,7 @@ [self._get_image('werewolf_back_1.png', FLIP_H), self._get_image('werewolf_back_2.png', FLIP_H)], 3), }), - } - for renderer in self._renderers.values(): - renderer.set_game_object(self) + }) @classmethod def from_saved_state(cls, saved_state): @@ -143,7 +146,6 @@ self.render_form = self.WOLF_FORM_BACK else: self.render_form = self.WOLF_FORM - self.renderer = self._renderers[self.render_form] def go_human(self): self.physicser.switch_form(self.form, self.HUMAN_FORM) @@ -156,25 +158,24 @@ self.render_form = self.HUMAN_FORM_BACK else: self.render_form = self.HUMAN_FORM - self.renderer = self._renderers[self.render_form] def _switch_to_back(self): if self.render_form == self.HUMAN_FORM: self.render_form = self.HUMAN_FORM_BACK elif self.render_form == self.WOLF_FORM: self.render_form = self.WOLF_FORM_BACK - self.renderer = self._renderers[self.render_form] def _switch_to_front(self): if self.render_form == self.HUMAN_FORM_BACK: self.render_form = self.HUMAN_FORM elif self.render_form == self.WOLF_FORM_BACK: self.render_form = self.WOLF_FORM - self.renderer = self._renderers[self.render_form] def set_direction(self, dx, dy): if (dx, dy) == (0, 0): + self.is_moving = False return + self.is_moving = True old_angle = self.angle self.angle = pymunk.Vec2d((dx, dy)).angle # If we've gone from quadrants 2 & 3 to 1 & 4 (or vice versa) @@ -200,7 +201,6 @@ self.angle = old_protagonist.angle self.render_form = old_protagonist.render_form self.inventory = old_protagonist.inventory - self.renderer = self._renderers[self.render_form] def toggle_form(self): if self.form == self.WOLF_FORM: diff -r d98daba73055 -r 9e2ef2f15035 nagslang/render.py --- a/nagslang/render.py Wed Sep 04 14:53:37 2013 +0200 +++ b/nagslang/render.py Wed Sep 04 15:06:33 2013 +0200 @@ -99,7 +99,7 @@ class MovementAnimatedRenderer(TimedAnimatedRenderer): def animate(self): - if self.game_object.is_moving(): + if self.game_object.is_moving: self.advance_tick() else: self.reset()