# HG changeset patch # User Jeremy Thurgood # Date 1378312800 -7200 # Node ID 329b3044ddefe019af66e3c92995406b2c5e0c55 # Parent 316cff60a3099b73e328c7b343f44807902e900f Much better facing renderers. diff -r 316cff60a309 -r 329b3044ddef data/images/creatures/human_NW_1.png Binary file data/images/creatures/human_NW_1.png has changed diff -r 316cff60a309 -r 329b3044ddef data/images/creatures/human_NW_2.png Binary file data/images/creatures/human_NW_2.png has changed diff -r 316cff60a309 -r 329b3044ddef data/images/creatures/human_N_1.png Binary file data/images/creatures/human_N_1.png has changed diff -r 316cff60a309 -r 329b3044ddef data/images/creatures/human_N_2.png Binary file data/images/creatures/human_N_2.png has changed diff -r 316cff60a309 -r 329b3044ddef data/images/creatures/human_SW_1.png Binary file data/images/creatures/human_SW_1.png has changed diff -r 316cff60a309 -r 329b3044ddef data/images/creatures/human_SW_2.png Binary file data/images/creatures/human_SW_2.png has changed diff -r 316cff60a309 -r 329b3044ddef data/images/creatures/human_W_1.png Binary file data/images/creatures/human_W_1.png has changed diff -r 316cff60a309 -r 329b3044ddef data/images/creatures/human_W_2.png Binary file data/images/creatures/human_W_2.png has changed diff -r 316cff60a309 -r 329b3044ddef data/images/creatures/werewolf_NW_1.png Binary file data/images/creatures/werewolf_NW_1.png has changed diff -r 316cff60a309 -r 329b3044ddef data/images/creatures/werewolf_NW_2.png Binary file data/images/creatures/werewolf_NW_2.png has changed diff -r 316cff60a309 -r 329b3044ddef data/images/creatures/werewolf_SW_1.png Binary file data/images/creatures/werewolf_SW_1.png has changed diff -r 316cff60a309 -r 329b3044ddef data/images/creatures/werewolf_SW_2.png Binary file data/images/creatures/werewolf_SW_2.png has changed diff -r 316cff60a309 -r 329b3044ddef data/images/creatures/werewolf_W_1.png Binary file data/images/creatures/werewolf_W_1.png has changed diff -r 316cff60a309 -r 329b3044ddef data/images/creatures/werewolf_W_2.png Binary file data/images/creatures/werewolf_W_2.png has changed diff -r 316cff60a309 -r 329b3044ddef nagslang/enemies.py --- a/nagslang/enemies.py Wed Sep 04 18:37:43 2013 +0200 +++ b/nagslang/enemies.py Wed Sep 04 18:40:00 2013 +0200 @@ -1,3 +1,5 @@ +import math + import pymunk import pymunk.pygame_util @@ -65,7 +67,15 @@ }) def get_render_angle(self): - return self.angle + # No image rotation when rendering, please. + return 0 + + def get_facing_direction(self): + # Enemies can face left or right. + if - math.pi / 2 < self.angle <= math.pi / 2: + return 'right' + else: + return 'left' def _switch_direction(self): if self._direction == 'away': diff -r 316cff60a309 -r 329b3044ddef nagslang/game_object.py --- a/nagslang/game_object.py Wed Sep 04 18:37:43 2013 +0200 +++ b/nagslang/game_object.py Wed Sep 04 18:40:00 2013 +0200 @@ -117,6 +117,11 @@ def get_render_angle(self): return self.physicser.get_angle() + def get_facing_direction(self): + """Used by rendererd that care what direction an object is facing. + """ + return None + def render(self, surface): return self.renderer.render(surface) diff -r 316cff60a309 -r 329b3044ddef nagslang/protagonist.py --- a/nagslang/protagonist.py Wed Sep 04 18:37:43 2013 +0200 +++ b/nagslang/protagonist.py Wed Sep 04 18:40:00 2013 +0200 @@ -1,5 +1,6 @@ import pymunk import pymunk.pygame_util +from pymunk.vec2d import Vec2d import math @@ -28,7 +29,7 @@ class ProtagonistFormSelectionRenderer(render.RendererSelectionRenderer): def select_renderer(self): - return self.game_object.render_form + return self.game_object.form class Protagonist(GameObject): @@ -38,16 +39,13 @@ """ HUMAN_FORM = 'human' - HUMAN_FORM_BACK = 'human_back' WOLF_FORM = 'wolf' - WOLF_FORM_BACK = 'wolf_back' def __init__(self, space, position): physicser = self._make_physics(space, position) renderer = self._make_renderer() self.inventory = {} self.form = self.HUMAN_FORM - self.render_form = self.HUMAN_FORM self.angle = 0 self.is_moving = False @@ -88,39 +86,57 @@ return ProtagonistFormSelectionRenderer({ self.HUMAN_FORM: render.FacingSelectionRenderer( { - 'left': render.MovementAnimatedRenderer( - [self._get_image('human_1.png'), - self._get_image('human_2.png')], 3), - 'right': render.MovementAnimatedRenderer( - [self._get_image('human_1.png', FLIP_H), - self._get_image('human_2.png', FLIP_H)], 3), - }), - self.HUMAN_FORM_BACK: render.FacingSelectionRenderer( - { - 'left': render.MovementAnimatedRenderer( - [self._get_image('human_back_1.png'), - self._get_image('human_back_2.png')], 3), - 'right': render.MovementAnimatedRenderer( - [self._get_image('human_back_1.png', FLIP_H), - self._get_image('human_back_2.png', FLIP_H)], 3), + 'N': render.MovementAnimatedRenderer( + [self._get_image('human_N_1.png'), + self._get_image('human_N_2.png')], 3), + 'S': render.MovementAnimatedRenderer( + [self._get_image('human_S_1.png'), + self._get_image('human_S_2.png')], 3), + 'W': render.MovementAnimatedRenderer( + [self._get_image('human_W_1.png'), + self._get_image('human_W_2.png')], 3), + 'E': render.MovementAnimatedRenderer( + [self._get_image('human_W_1.png', FLIP_H), + self._get_image('human_W_2.png', FLIP_H)], 3), + 'NW': render.MovementAnimatedRenderer( + [self._get_image('human_NW_1.png'), + self._get_image('human_NW_2.png')], 3), + 'NE': render.MovementAnimatedRenderer( + [self._get_image('human_NW_1.png', FLIP_H), + self._get_image('human_NW_2.png', FLIP_H)], 3), + 'SW': render.MovementAnimatedRenderer( + [self._get_image('human_SW_1.png'), + self._get_image('human_SW_2.png')], 3), + 'SE': render.MovementAnimatedRenderer( + [self._get_image('human_SW_1.png', FLIP_H), + self._get_image('human_SW_2.png', FLIP_H)], 3), }), self.WOLF_FORM: render.FacingSelectionRenderer( { - 'left': render.MovementAnimatedRenderer( - [self._get_image('werewolf_1.png'), - self._get_image('werewolf_2.png')], 3), - 'right': render.MovementAnimatedRenderer( - [self._get_image('werewolf_1.png', FLIP_H), - self._get_image('werewolf_2.png', FLIP_H)], 3), - }), - self.WOLF_FORM_BACK: render.FacingSelectionRenderer( - { - 'left': render.MovementAnimatedRenderer( - [self._get_image('werewolf_back_1.png'), - self._get_image('werewolf_back_2.png')], 3), - 'right': render.MovementAnimatedRenderer( - [self._get_image('werewolf_back_1.png', FLIP_H), - self._get_image('werewolf_back_2.png', FLIP_H)], 3), + 'N': render.MovementAnimatedRenderer( + [self._get_image('werewolf_N_1.png'), + self._get_image('werewolf_N_2.png')], 3), + 'S': render.MovementAnimatedRenderer( + [self._get_image('werewolf_S_1.png'), + self._get_image('werewolf_S_2.png')], 3), + 'W': render.MovementAnimatedRenderer( + [self._get_image('werewolf_W_1.png'), + self._get_image('werewolf_W_2.png')], 3), + 'E': render.MovementAnimatedRenderer( + [self._get_image('werewolf_W_1.png', FLIP_H), + self._get_image('werewolf_W_2.png', FLIP_H)], 3), + 'NW': render.MovementAnimatedRenderer( + [self._get_image('werewolf_NW_1.png'), + self._get_image('werewolf_NW_2.png')], 3), + 'NE': render.MovementAnimatedRenderer( + [self._get_image('werewolf_NW_1.png', FLIP_H), + self._get_image('werewolf_NW_2.png', FLIP_H)], 3), + 'SW': render.MovementAnimatedRenderer( + [self._get_image('werewolf_SW_1.png'), + self._get_image('werewolf_SW_2.png')], 3), + 'SE': render.MovementAnimatedRenderer( + [self._get_image('werewolf_SW_1.png', FLIP_H), + self._get_image('werewolf_SW_2.png', FLIP_H)], 3), }), }) @@ -133,60 +149,44 @@ return obj def get_render_angle(self): - return self.angle + # No image rotation when rendering, please. + return 0 + + def get_facing_direction(self): + # It's easier to work with a vector than an angle here. + vec = Vec2d.unit() + vec.angle = self.angle + # We probably don't have exactly -1, 0, or 1 here. + x = int(round(vec.x)) + y = int(round(vec.y)) + + return { + (0, 1): 'N', + (0, -1): 'S', + (-1, 0): 'W', + (1, 0): 'E', + (1, 1): 'NE', + (1, -1): 'SE', + (-1, 1): 'NW', + (-1, -1): 'SW', + }[(x, y)] def go_werewolf(self): self.physicser.switch_form(self.form, self.WOLF_FORM) self.form = self.WOLF_FORM self.impulse_factor = 4000 - if self.render_form == self.HUMAN_FORM: - self.render_form = self.WOLF_FORM - elif self.render_form == self.HUMAN_FORM_BACK: - self.render_form = self.WOLF_FORM_BACK - else: - self.render_form = self.WOLF_FORM - def go_human(self): self.physicser.switch_form(self.form, self.HUMAN_FORM) self.form = self.HUMAN_FORM self.impulse_factor = 500 - if self.render_form == self.WOLF_FORM: - self.render_form = self.HUMAN_FORM - elif self.render_form == self.WOLF_FORM_BACK: - self.render_form = self.HUMAN_FORM_BACK - else: - self.render_form = self.HUMAN_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 - - 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 - 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) - # switch between front & back views - if self.angle != math.pi: - # == math.pi is going straight left, which can't - # trigger a front/back swap and simplifies these checks - if self.angle > 0 and old_angle != self.angle: - self._switch_to_back() - elif self.angle < 0 and old_angle != self.angle: - self._switch_to_front() self.physicser.apply_impulse( (dx * self.impulse_factor, dy * self.impulse_factor)) @@ -199,7 +199,6 @@ self.impulse_factor = old_protagonist.impulse_factor self.form = old_protagonist.form self.angle = old_protagonist.angle - self.render_form = old_protagonist.render_form self.inventory = old_protagonist.inventory def toggle_form(self): diff -r 316cff60a309 -r 329b3044ddef nagslang/render.py --- a/nagslang/render.py Wed Sep 04 18:37:43 2013 +0200 +++ b/nagslang/render.py Wed Sep 04 18:40:00 2013 +0200 @@ -134,22 +134,8 @@ class FacingSelectionRenderer(RendererSelectionRenderer): - def __init__(self, renderers): - for renderer in renderers.values(): - renderer.rotate = False - super(FacingSelectionRenderer, self).__init__(renderers) - self._face = 'left' - - def _update_facing(self, angle): - if abs(angle) < math.pi / 2: - self._face = 'right' - elif abs(angle) > math.pi / 2: - self._face = 'left' - def select_renderer(self): - angle = self.game_object.get_render_angle() - self._update_facing(angle) - return self._face + return self.game_object.get_facing_direction() class ShapeRenderer(Renderer):