# HG changeset patch # User Simon Cross # Date 1378047006 -7200 # Node ID 2995723e8ccf692a20e52a3137166b3c9e486148 # Parent d9b65cf72db478b5d6f267295f04eda699283d83 Move and hold. diff -r d9b65cf72db4 -r 2995723e8ccf nagslang/screens/area.py --- a/nagslang/screens/area.py Sun Sep 01 16:44:04 2013 +0200 +++ b/nagslang/screens/area.py Sun Sep 01 16:50:06 2013 +0200 @@ -10,9 +10,27 @@ from nagslang.events import ScreenChange +class ControlKeys(object): + def __init__(self): + self.keys_down = set() + + def key_down(self, key): + self.keys_down.add(key) + + def key_up(self, key): + self.keys_down.discard(key) + + def handle_event(self, ev): + if ev.type == pygame.locals.KEYDOWN: + self.key_down(ev.key) + elif ev.type == pygame.locals.KEYUP: + self.key_up(ev.key) + + class AreaScreen(Screen): def setup(self, world): + self.keys = ControlKeys() self.add_walls(world) self.add_protagonist(world) @@ -30,27 +48,37 @@ def add_protagonist(self, world): self.protagonist_body = pymunk.Body(100, 1000) self.protagonist_body.position = (400, 300) + self.protagonist_body.velocity_limit = 5000 self.protagonist = pymunk.Circle(self.protagonist_body, 30) self.space.add(self.protagonist_body, self.protagonist) - def protagonist_move(self, dx, dy, angle): - self.protagonist_body.angle = angle - self.protagonist_body.apply_impulse((dx * 2000, dy * 2000)) + def protagonist_move(self, dx, dy): + vec = pymunk.Vec2d((dx, dy)) + self.protagonist_body.angle = vec.angle + self.protagonist_body.apply_impulse((dx * 1000, dy * 1000)) def handle_event(self, ev): if ev.type == pygame.locals.KEYDOWN: if ev.key == pygame.locals.K_ESCAPE: ScreenChange.post('menu') - elif ev.key == pygame.locals.K_UP: - self.protagonist_move(0, 1, math.pi / 2) - elif ev.key == pygame.locals.K_DOWN: - self.protagonist_move(0, -1, -math.pi / 2) - elif ev.key == pygame.locals.K_LEFT: - self.protagonist_move(-1, 0, math.pi) - elif ev.key == pygame.locals.K_RIGHT: - self.protagonist_move(1, 0, 0) + self.keys.handle_event(ev) def render(self, surface): surface.fill(pygame.color.Color(0, 0, 0)) pymunk.pygame_util.draw(surface, *self.walls) pymunk.pygame_util.draw(surface, self.protagonist) + + def tick_protagonist(self): + dx, dy = 0, 0 + for key, tx, ty in [ + (pygame.locals.K_UP, 0, 1), (pygame.locals.K_DOWN, 0, -1), + (pygame.locals.K_LEFT, -1, 0), (pygame.locals.K_RIGHT, 1, 0) + ]: + if key in self.keys.keys_down: + dx += tx + dy += ty + self.protagonist_move(dx, dy) + + def tick(self, seconds): + self.tick_protagonist() + super(AreaScreen, self).tick(seconds) diff -r d9b65cf72db4 -r 2995723e8ccf nagslang/screens/base.py --- a/nagslang/screens/base.py Sun Sep 01 16:44:04 2013 +0200 +++ b/nagslang/screens/base.py Sun Sep 01 16:50:06 2013 +0200 @@ -25,6 +25,6 @@ def render(self, surface): pass - def tick(self, step): + def tick(self, seconds): """Step the given amount of time.""" - self.space.step(step) + self.space.step(seconds)