Mercurial > nagslang
diff nagslang/game_object.py @ 59:b412704a6737
Start of game object stuff.
author | Jeremy Thurgood <firxen@gmail.com> |
---|---|
date | Sun, 01 Sep 2013 18:48:55 +0200 |
parents | |
children | 34a87ec12124 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nagslang/game_object.py Sun Sep 01 18:48:55 2013 +0200 @@ -0,0 +1,79 @@ + +class Physicser(object): + def add_to_space(self, space): + raise NotImplementedError() + + def remove_from_space(self, space): + raise NotImplementedError() + + def render_position(self): + raise NotImplementedError() + + +class NullPhysicser(Physicser): + def add_to_space(self, space): + pass + + def remove_from_space(self, space): + pass + + def render_position(self): + return (0, 0) + + +class SingleShapePhysicser(Physicser): + def __init__(self, shape): + self._shape = shape + + def add_to_space(self, space): + space.add(self._shape, self._shape.body) + + def remove_from_space(self, space): + space.remove(self._shape, self._shape.body) + + def render_position(self, surface): + pos = self._shape.body.position + import pymunk.pygame_util + return pymunk.pygame_util.to_pygame(pos, surface) + return (int(pos.x), int(pos.y)) + + +class Renderer(object): + def render(self, surface, pos): + raise NotImplementedError() + + +class ImageRenderer(Renderer): + def __init__(self, image): + self._image = image + + def render(self, surface, pos): + surface.blit(self._image, pos) + + +class ShapeRenderer(Renderer): + def __init__(self, shape): + self._shape = shape + + def render(self, surface, pos): + import pymunk.pygame_util + pymunk.pygame_util.draw(surface, self._shape) + + +class GameObject(object): + """A representation of a thing in the game world. + + This has a rendery thing, physicsy things and maybe some other things. + """ + + def __init__(self, renderer, physicser=None): + self.renderer = renderer + if physicser is None: + physicser = NullPhysicser() + self.physicser = physicser + + def add_to_space(self, space): + self.physicser.add_to_space(space) + + def render(self, surface): + return self.renderer.render(surface, self.physicser.render_position(surface))