Changeset 123:23b533d6f27e
- Timestamp:
- 09/02/13 14:43:15 (8 years ago)
- Branch:
- default
- Phase:
- public
- Location:
- nagslang
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
nagslang/game_object.py
r107 r123 30 30 self.glue = glue 31 31 32 def set_game_object(self, game_object): 33 self.game_object = game_object 34 32 35 def get_state(self): 33 36 raise NotImplementedError() … … 35 38 36 39 class FloorSwitchPuzzler(Puzzler): 37 def __init__(self, space, shape):38 self._space = space39 self._shape = shape40 41 40 def get_state(self): 42 for shape in self._space.shape_query(self._shape): 41 space = self.game_object.get_space() 42 for shape in space.shape_query(self.game_object.get_shape()): 43 43 if shape.collision_type in SWITCH_PUSHERS: 44 44 return True … … 56 56 class Physicser(object): 57 57 def __init__(self, space): 58 self.space = space 58 self._space = space 59 60 def get_space(self): 61 return self._space 62 63 def set_game_object(self, game_object): 64 self.game_object = game_object 65 66 def get_shape(self): 67 raise NotImplementedError() 59 68 60 69 def add_to_space(self): … … 79 88 self._shape = shape 80 89 90 def get_shape(self): 91 return self._shape 92 81 93 def add_to_space(self): 82 self. space.add(self._shape)94 self.get_space().add(self._shape) 83 95 if not self._shape.body.is_static: 84 self. space.add(self._shape.body)96 self.get_space().add(self._shape.body) 85 97 86 98 def remove_from_space(self): 87 self. space.remove(self._shape)99 self.get_space().remove(self._shape) 88 100 if not self._shape.body.is_static: 89 self. space.remove(self._shape.body)101 self.get_space().remove(self._shape.body) 90 102 91 103 def get_render_position(self, surface): … … 101 113 102 114 class Renderer(object): 103 def __init__(self, shape): 104 self._shape = shape 105 106 def _render_shape(self, surface, pos, angle): 115 def set_game_object(self, game_object): 116 self.game_object = game_object 117 118 def _render_shape(self, surface): 119 shape = self.game_object.get_shape() 107 120 # Less general that pymunk.pygame_util.draw, but also a lot less noisy. 108 color = getattr( 109 self._shape, 'color', pygame.color.THECOLORS['lightblue']) 121 color = getattr(shape, 'color', pygame.color.THECOLORS['lightblue']) 110 122 # We only explicitly draw Circle and Poly shapes. Everything else we 111 123 # forward to pymunk. 112 if isinstance(self._shape, pymunk.Circle): 113 centre = pymunk.pygame_util.to_pygame( 114 self._shape.body.position, surface) 115 radius = int(self._shape.radius) 124 if isinstance(shape, pymunk.Circle): 125 centre = pymunk.pygame_util.to_pygame(shape.body.position, surface) 126 radius = int(shape.radius) 116 127 pygame.draw.circle(surface, color, centre, radius, 2) 117 elif isinstance(s elf._shape, pymunk.Poly):128 elif isinstance(shape, pymunk.Poly): 118 129 # polygon bounding box 119 130 points = [pymunk.pygame_util.to_pygame(p, surface) 120 for p in s elf._shape.get_vertices()]131 for p in shape.get_vertices()] 121 132 pygame.draw.lines(surface, color, True, points, 2) 122 133 else: 123 pymunk.pygame_util.draw(surface, self._shape) 124 125 def render(self, surface, pos, angle): 134 pymunk.pygame_util.draw(surface, shape) 135 136 def render(self, surface): 137 pos = self.game_object.get_render_position(surface) 138 angle = self.game_object.get_render_angle() 126 139 if options.debug: 127 140 self._render_shape(surface, pos, angle) … … 134 147 135 148 class ImageRenderer(Renderer): 136 def __init__(self, shape, image): 137 super(ImageRenderer, self).__init__(shape) 149 def __init__(self, image): 138 150 self._image = image 139 151 140 def render(self, surface, pos, angle): 152 def render(self, surface): 153 pos = self.game_object.get_render_position(surface) 141 154 surface.blit(self._image, image_pos(self._image, pos)) 142 super(ImageRenderer, self).render(surface , pos, angle)155 super(ImageRenderer, self).render(surface) 143 156 144 157 145 158 class FacingImageRenderer(Renderer): 146 def __init__(self, shape, left_image, right_image): 147 super(FacingImageRenderer, self).__init__(shape) 159 def __init__(self, left_image, right_image): 148 160 self._images = { 149 161 'left': left_image, … … 156 168 return self._images['left'] 157 169 158 def render(self, surface, pos, angle): 159 image = self.get_image(angle) 170 def render(self, surface): 171 pos = self.game_object.get_render_position(surface) 172 image = self.get_image(self.game_object.get_render_angle()) 160 173 surface.blit(image, image_pos(image, pos)) 161 super(FacingImageRenderer, self).render(surface , pos, angle)174 super(FacingImageRenderer, self).render(surface) 162 175 163 176 164 177 class ShapeRenderer(Renderer): 165 def render(self, surface , pos, angle):166 self._render_shape(surface , pos, angle)167 super(ShapeRenderer, self).render(surface , pos, angle)178 def render(self, surface): 179 self._render_shape(surface) 180 super(ShapeRenderer, self).render(surface) 168 181 169 182 … … 176 189 def __init__(self, physicser, renderer, puzzler=None): 177 190 self.physicser = physicser 191 physicser.set_game_object(self) 178 192 self.physicser.add_to_space() 179 193 self.renderer = renderer 194 renderer.set_game_object(self) 180 195 self.puzzler = puzzler 196 if puzzler is not None: 197 puzzler.set_game_object(self) 181 198 self.zorder = ZORDER_LOW 199 200 def get_space(self): 201 return self.physicser.get_space() 202 203 def get_shape(self): 204 return self.physicser.get_shape() 182 205 183 206 def get_render_position(self, surface): … … 188 211 189 212 def render(self, surface): 190 return self.renderer.render( 191 surface, self.get_render_position(surface), 192 self.get_render_angle()) 213 return self.renderer.render(surface) 193 214 194 215 … … 202 223 super(FloorSwitch, self).__init__( 203 224 SingleShapePhysicser(space, self.shape), 204 ShapeRenderer( self.shape),205 FloorSwitchPuzzler( space, self.shape),225 ShapeRenderer(), 226 FloorSwitchPuzzler(), 206 227 ) 207 228 … … 223 244 super(FloorLight, self).__init__( 224 245 SingleShapePhysicser(space, self.shape), 225 ShapeRenderer( self.shape),246 ShapeRenderer(), 226 247 StateProxyPuzzler(state_source), 227 248 ) -
nagslang/protagonist.py
r107 r123 54 54 self._renderers = { 55 55 self.HUMAN_FORM: FacingImageRenderer( 56 self._shapes[self.HUMAN_FORM],57 56 self._get_image('human_1.png'), 58 57 self._get_image('human_1.png', FLIP_H)), 59 58 self.WOLF_FORM: FacingImageRenderer( 60 self._shapes[self.WOLF_FORM],61 59 self._get_image('werewolf_1.png'), 62 60 self._get_image('werewolf_1.png', FLIP_H)), 63 61 } 62 for renderer in self._renderers.values(): 63 renderer.set_game_object(self) 64 64 65 65 @classmethod
Note:
See TracChangeset
for help on using the changeset viewer.