Mercurial > nagslang
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: