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))