changeset 59:b412704a6737

Start of game object stuff.
author Jeremy Thurgood <firxen@gmail.com>
date Sun, 01 Sep 2013 18:48:55 +0200
parents cee0b845dedc
children 34a87ec12124
files nagslang/game_object.py nagslang/screens/area.py
diffstat 2 files changed, 89 insertions(+), 6 deletions(-) [+]
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))
--- a/nagslang/screens/area.py	Sun Sep 01 18:57:16 2013 +0200
+++ b/nagslang/screens/area.py	Sun Sep 01 18:48:55 2013 +0200
@@ -5,6 +5,9 @@
 import pymunk
 import pymunk.pygame_util
 
+from nagslang.resources import resources
+from nagslang.game_object import (
+    GameObject, SingleShapePhysicser, ImageRenderer)
 from nagslang.screens.base import Screen
 from nagslang.level import Level
 from nagslang.events import ScreenChange
@@ -29,7 +32,7 @@
             self.key_up(ev.key)
 
 
-class Protagonist(object):
+class Protagonist(GameObject):
     def __init__(self, position):
         self.body = pymunk.Body(10, 10000)
         self.body.position = position
@@ -39,15 +42,16 @@
         self.shape.elasticity = 1.0
         self.shape.friction = 10.0
 
-        self.go_human()
+        super(Protagonist, self).__init__(
+            ImageRenderer(resources.get_image('creatures', 'werewolf_1.png')),
+            SingleShapePhysicser(self.shape))
 
-    def add_space(self, space):
-        space.add(self.body, self.shape)
+        self.go_human()
 
     def velocity_func(self, body, gravity, damping, dt):
         return pymunk.Body.update_velocity(body, gravity, self.damping, dt)
 
-    def render(self, surface):
+    def render_TODO(self, surface):
         if self.werewolf:
             pos = pymunk.pygame_util.to_pygame(self.body.position, surface)
             transforms = ()
@@ -120,7 +124,7 @@
 
     def add_protagonist(self):
         self.protagonist = Protagonist((400, 300))
-        self.protagonist.add_space(self.space)
+        self.protagonist.add_to_space(self.space)
 
     def handle_event(self, ev):
         if ev.type == pygame.locals.KEYDOWN: