Mercurial > nagslang
changeset 47:82036437ebf6
Better movement and swap between werewolf and human form with 'w' (hodgestar, decoy).
author | Simon Cross <hodgestar@gmail.com> |
---|---|
date | Sun, 01 Sep 2013 18:22:46 +0200 |
parents | e53b76df0fe7 |
children | bcaa3b7a0890 |
files | nagslang/screens/area.py |
diffstat | 1 files changed, 63 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/nagslang/screens/area.py Sun Sep 01 18:21:12 2013 +0200 +++ b/nagslang/screens/area.py Sun Sep 01 18:22:46 2013 +0200 @@ -25,6 +25,60 @@ self.key_up(ev.key) +class Protagonist(object): + def __init__(self, position): + self.body = pymunk.Body(10, 10000) + self.body.position = position + self.body.velocity_func = self.velocity_func + + self.shape = pymunk.Circle(self.body, 30) + self.shape.elasticity = 1.0 + self.shape.friction = 10.0 + + self.go_human() + + def add_space(self, space): + space.add(self.body, self.shape) + + def velocity_func(self, body, gravity, damping, dt): + return pymunk.Body.update_velocity(body, gravity, self.damping, dt) + + def render(self, surface): + pymunk.pygame_util.draw(surface, self.shape) + + def go_werewolf(self): + self.werewolf = True + self.body.mass = 100 + self.body.moment = 10000 + self.body.velocity_limit = 1000 + self.shape.color = pygame.color.THECOLORS['red'] + self.impulse_factor = 4000 + self.damping = 0.9 + + def go_human(self): + self.werewolf = False + self.body.mass = 10 + self.body.moment = 1000 + self.body.velocity_limit = 1000 + self.shape.color = pygame.color.THECOLORS['blue'] + self.impulse_factor = 200 + self.damping = 0.8 + + def set_direction(self, dx, dy): + if (dx, dy) == (0, 0): + return + vec = pymunk.Vec2d((dx, dy)) + self.body.angle = vec.angle + self.body.apply_impulse( + (dx * self.impulse_factor, dy * self.impulse_factor)) + + def toggle_form(self): + if self.werewolf: + self.go_human() + else: + self.go_werewolf() + + class AreaScreen(Screen): def setup(self): @@ -39,32 +93,28 @@ corners = [(-200, -150), (-200, 150), (200, 150), (200, -150)] corner = corners[-1] for next_corner in corners: - self.walls.append(pymunk.Segment(body, corner, next_corner, 5)) + wall = pymunk.Segment(body, corner, next_corner, 50) + wall.elasticity = 1.0 + self.walls.append(wall) corner = next_corner self.space.add(*self.walls) def add_protagonist(self): - self.protagonist_body = pymunk.Body(100, 1000) - self.protagonist_body.position = (400, 300) - self.protagonist_body.velocity_limit = 5000 - self.protagonist = pymunk.Circle(self.protagonist_body, 30) - self.space.add(self.protagonist_body, self.protagonist) - - def protagonist_move(self, dx, dy): - vec = pymunk.Vec2d((dx, dy)) - self.protagonist_body.angle = vec.angle - self.protagonist_body.apply_impulse((dx * 1000, dy * 1000)) + self.protagonist = Protagonist((400, 300)) + self.protagonist.add_space(self.space) def handle_event(self, ev): if ev.type == pygame.locals.KEYDOWN: if ev.key == pygame.locals.K_ESCAPE: ScreenChange.post('menu') + if ev.key == pygame.locals.K_w: + self.protagonist.toggle_form() self.keys.handle_event(ev) def render(self, surface): surface.fill(pygame.color.Color(0, 0, 0)) pymunk.pygame_util.draw(surface, *self.walls) - pymunk.pygame_util.draw(surface, self.protagonist) + self.protagonist.render(surface) def tick_protagonist(self): dx, dy = 0, 0 @@ -75,7 +125,7 @@ if key in self.keys.keys_down: dx += tx dy += ty - self.protagonist_move(dx, dy) + self.protagonist.set_direction(dx, dy) def tick(self, seconds): self.tick_protagonist()