62
|
1
|
59
|
2
|
|
3 class Physicser(object):
|
|
4 def add_to_space(self, space):
|
|
5 raise NotImplementedError()
|
|
6
|
|
7 def remove_from_space(self, space):
|
|
8 raise NotImplementedError()
|
|
9
|
|
10 def render_position(self):
|
|
11 raise NotImplementedError()
|
|
12
|
|
13
|
|
14 class NullPhysicser(Physicser):
|
|
15 def add_to_space(self, space):
|
|
16 pass
|
|
17
|
|
18 def remove_from_space(self, space):
|
|
19 pass
|
|
20
|
|
21 def render_position(self):
|
|
22 return (0, 0)
|
|
23
|
|
24
|
|
25 class SingleShapePhysicser(Physicser):
|
|
26 def __init__(self, shape):
|
|
27 self._shape = shape
|
|
28
|
|
29 def add_to_space(self, space):
|
|
30 space.add(self._shape, self._shape.body)
|
|
31
|
|
32 def remove_from_space(self, space):
|
|
33 space.remove(self._shape, self._shape.body)
|
|
34
|
|
35 def render_position(self, surface):
|
|
36 pos = self._shape.body.position
|
|
37 import pymunk.pygame_util
|
|
38 return pymunk.pygame_util.to_pygame(pos, surface)
|
|
39 return (int(pos.x), int(pos.y))
|
|
40
|
|
41
|
|
42 class Renderer(object):
|
|
43 def render(self, surface, pos):
|
|
44 raise NotImplementedError()
|
|
45
|
|
46
|
|
47 class ImageRenderer(Renderer):
|
|
48 def __init__(self, image):
|
|
49 self._image = image
|
|
50
|
|
51 def render(self, surface, pos):
|
|
52 surface.blit(self._image, pos)
|
|
53
|
|
54
|
|
55 class ShapeRenderer(Renderer):
|
|
56 def __init__(self, shape):
|
|
57 self._shape = shape
|
|
58
|
|
59 def render(self, surface, pos):
|
|
60 import pymunk.pygame_util
|
|
61 pymunk.pygame_util.draw(surface, self._shape)
|
|
62
|
|
63
|
|
64 class GameObject(object):
|
|
65 """A representation of a thing in the game world.
|
|
66
|
|
67 This has a rendery thing, physicsy things and maybe some other things.
|
|
68 """
|
|
69
|
|
70 def __init__(self, renderer, physicser=None):
|
|
71 self.renderer = renderer
|
|
72 if physicser is None:
|
|
73 physicser = NullPhysicser()
|
|
74 self.physicser = physicser
|
|
75
|
|
76 def add_to_space(self, space):
|
|
77 self.physicser.add_to_space(space)
|
|
78
|
|
79 def render(self, surface):
|
60
|
80 return self.renderer.render(
|
|
81 surface, self.physicser.render_position(surface))
|