Mercurial > nagslang
comparison nagslang/game_object.py @ 63:7f038ee778ad
Put werewolf facing direction magic back.
author | Jeremy Thurgood <firxen@gmail.com> |
---|---|
date | Sun, 01 Sep 2013 19:18:12 +0200 |
parents | 1d67a8c9861d |
children | a1b4d09e6f23 |
comparison
equal
deleted
inserted
replaced
62:1d67a8c9861d | 63:7f038ee778ad |
---|---|
1 import math | |
1 | 2 |
2 | 3 |
3 class Physicser(object): | 4 class Physicser(object): |
4 def add_to_space(self, space): | 5 def add_to_space(self, space): |
5 raise NotImplementedError() | 6 raise NotImplementedError() |
6 | 7 |
7 def remove_from_space(self, space): | 8 def remove_from_space(self, space): |
8 raise NotImplementedError() | 9 raise NotImplementedError() |
9 | 10 |
10 def render_position(self): | 11 def render_position(self, surface): |
12 raise NotImplementedError() | |
13 | |
14 def render_angle(self): | |
11 raise NotImplementedError() | 15 raise NotImplementedError() |
12 | 16 |
13 | 17 |
14 class NullPhysicser(Physicser): | 18 class NullPhysicser(Physicser): |
15 def add_to_space(self, space): | 19 def add_to_space(self, space): |
18 def remove_from_space(self, space): | 22 def remove_from_space(self, space): |
19 pass | 23 pass |
20 | 24 |
21 def render_position(self): | 25 def render_position(self): |
22 return (0, 0) | 26 return (0, 0) |
27 | |
28 def render_angle(self): | |
29 return 0 | |
23 | 30 |
24 | 31 |
25 class SingleShapePhysicser(Physicser): | 32 class SingleShapePhysicser(Physicser): |
26 def __init__(self, shape): | 33 def __init__(self, shape): |
27 self._shape = shape | 34 self._shape = shape |
34 | 41 |
35 def render_position(self, surface): | 42 def render_position(self, surface): |
36 pos = self._shape.body.position | 43 pos = self._shape.body.position |
37 import pymunk.pygame_util | 44 import pymunk.pygame_util |
38 return pymunk.pygame_util.to_pygame(pos, surface) | 45 return pymunk.pygame_util.to_pygame(pos, surface) |
39 return (int(pos.x), int(pos.y)) | 46 |
47 def render_angle(self): | |
48 return self._shape.body.angle | |
40 | 49 |
41 | 50 |
42 class Renderer(object): | 51 class Renderer(object): |
43 def render(self, surface, pos): | 52 def render(self, surface, pos, angle): |
44 raise NotImplementedError() | 53 raise NotImplementedError() |
54 | |
55 | |
56 def image_pos(image, pos): | |
57 return (pos[0] - image.get_width() / 2, | |
58 pos[1] - image.get_height() / 2) | |
45 | 59 |
46 | 60 |
47 class ImageRenderer(Renderer): | 61 class ImageRenderer(Renderer): |
48 def __init__(self, image): | 62 def __init__(self, image): |
49 self._image = image | 63 self._image = image |
50 | 64 |
51 def render(self, surface, pos): | 65 def render(self, surface, pos, angle): |
52 surface.blit(self._image, pos) | 66 surface.blit(self._image, image_pos(self._image, pos)) |
67 | |
68 | |
69 class FacingImageRenderer(Renderer): | |
70 def __init__(self, left_image, right_image): | |
71 self._images = { | |
72 'left': left_image, | |
73 'right': right_image, | |
74 } | |
75 | |
76 def get_image(self, angle): | |
77 if abs(angle) < math.pi / 2: | |
78 return self._images['right'] | |
79 return self._images['left'] | |
80 | |
81 def render(self, surface, pos, angle): | |
82 image = self.get_image(angle) | |
83 surface.blit(image, image_pos(image, pos)) | |
53 | 84 |
54 | 85 |
55 class ShapeRenderer(Renderer): | 86 class ShapeRenderer(Renderer): |
56 def __init__(self, shape): | 87 def __init__(self, shape): |
57 self._shape = shape | 88 self._shape = shape |
58 | 89 |
59 def render(self, surface, pos): | 90 def render(self, surface, pos, angle): |
60 import pymunk.pygame_util | 91 import pymunk.pygame_util |
61 pymunk.pygame_util.draw(surface, self._shape) | 92 pymunk.pygame_util.draw(surface, self._shape) |
62 | 93 |
63 | 94 |
64 class GameObject(object): | 95 class GameObject(object): |
76 def add_to_space(self, space): | 107 def add_to_space(self, space): |
77 self.physicser.add_to_space(space) | 108 self.physicser.add_to_space(space) |
78 | 109 |
79 def render(self, surface): | 110 def render(self, surface): |
80 return self.renderer.render( | 111 return self.renderer.render( |
81 surface, self.physicser.render_position(surface)) | 112 surface, self.physicser.render_position(surface), |
113 self.physicser.render_angle()) |