# HG changeset patch # User Neil Muller # Date 1378158744 -7200 # Node ID 94a2456696af5216002569d3989b396d9288263d # Parent b455873020be37a4d3fbe5faacfc6c2b23fcb4ae front and back views diff -r b455873020be -r 94a2456696af nagslang/protagonist.py --- a/nagslang/protagonist.py Mon Sep 02 23:49:27 2013 +0200 +++ b/nagslang/protagonist.py Mon Sep 02 23:52:24 2013 +0200 @@ -1,6 +1,8 @@ import pymunk import pymunk.pygame_util +import math + from nagslang.constants import COLLISION_TYPE_PLAYER, ZORDER_MID from nagslang.game_object import ( GameObject, SingleShapePhysicser, AnimatedFacingImageRenderer, make_body) @@ -15,13 +17,16 @@ """ HUMAN_FORM = 'human' + HUMAN_FORM_BACK = 'human_back' WOLF_FORM = 'wolf' + WOLF_FORM_BACK = 'wolf_back' def __init__(self, space, position): self._setup_physics(space, position) self._setup_renderers() self.inventory = {} self.form = self.HUMAN_FORM + self.render_form = self.HUMAN_FORM super(Protagonist, self).__init__( self._physicsers[self.form], self._renderers[self.form]) @@ -63,6 +68,19 @@ self._get_image('human_2.png', FLIP_H), self._get_image('human_2.png', FLIP_H), self._get_image('human_2.png', FLIP_H))), + self.HUMAN_FORM_BACK: AnimatedFacingImageRenderer( + (self._get_image('human_back_1.png'), + self._get_image('human_back_1.png'), + self._get_image('human_back_1.png'), + self._get_image('human_back_2.png'), + self._get_image('human_back_2.png'), + self._get_image('human_back_2.png')), + (self._get_image('human_back_1.png', FLIP_H), + self._get_image('human_back_1.png', FLIP_H), + self._get_image('human_back_1.png', FLIP_H), + self._get_image('human_back_2.png', FLIP_H), + self._get_image('human_back_2.png', FLIP_H), + self._get_image('human_back_2.png', FLIP_H))), self.WOLF_FORM: AnimatedFacingImageRenderer( (self._get_image('werewolf_1.png'), self._get_image('werewolf_1.png'), @@ -76,6 +94,19 @@ self._get_image('werewolf_2.png', FLIP_H), self._get_image('werewolf_2.png', FLIP_H), self._get_image('werewolf_2.png', FLIP_H))), + self.WOLF_FORM_BACK: AnimatedFacingImageRenderer( + (self._get_image('werewolf_back_1.png'), + self._get_image('werewolf_back_1.png'), + self._get_image('werewolf_back_1.png'), + self._get_image('werewolf_back_2.png'), + self._get_image('werewolf_back_2.png'), + self._get_image('werewolf_back_2.png')), + (self._get_image('werewolf_back_1.png', FLIP_H), + self._get_image('werewolf_back_1.png', FLIP_H), + self._get_image('werewolf_back_1.png', FLIP_H), + self._get_image('werewolf_back_2.png', FLIP_H), + self._get_image('werewolf_back_2.png', FLIP_H), + self._get_image('werewolf_back_2.png', FLIP_H))), } for renderer in self._renderers.values(): renderer.set_game_object(self) @@ -99,7 +130,13 @@ self._body.velocity_limit = 1000 self.impulse_factor = 4000 self._body.damping = 0.9 - self.renderer = self._renderers[self.form] + 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 + self.renderer = self._renderers[self.render_form] def go_human(self): self._physicsers[self.form].remove_from_space() @@ -109,13 +146,43 @@ self._body.velocity_limit = 1000 self.impulse_factor = 500 self._body.damping = 0.8 - self.renderer = self._renderers[self.form] + 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 + 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.renderer.stop() return + 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._body.apply_impulse( (dx * self.impulse_factor, dy * self.impulse_factor)) self.renderer.start()