Mercurial > nagslang
changeset 312:72aca01c87ed
Basic claw attack, stealing liberally from other people's code! ;)
author | David Sharpe |
---|---|
date | Fri, 06 Sep 2013 00:37:26 +0200 |
parents | efe28e9d510a |
children | 768e1d06155f |
files | nagslang/events.py nagslang/game_object.py nagslang/protagonist.py nagslang/screens/area.py |
diffstat | 4 files changed, 61 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/nagslang/events.py Fri Sep 06 00:38:05 2013 +0200 +++ b/nagslang/events.py Fri Sep 06 00:37:26 2013 +0200 @@ -59,3 +59,10 @@ def post(cls, position, enemy_type): super(EnemyDeathEvent, cls).post(position=position, enemy_type=enemy_type) + +class ClawEvent(UserEvent): + @classmethod + def post(cls, source, vector, source_collision_type): + super(ClawEvent, cls).post(source=source, vector=vector, + source_collision_type=source_collision_type) +
--- a/nagslang/game_object.py Fri Sep 06 00:38:05 2013 +0200 +++ b/nagslang/game_object.py Fri Sep 06 00:37:26 2013 +0200 @@ -2,6 +2,7 @@ import pymunk.pygame_util import math +import time from nagslang import environment from nagslang import puzzle @@ -9,7 +10,8 @@ from nagslang.mutators import FLIP_H from nagslang.constants import ( SWITCH_PUSHERS, COLLISION_TYPE_SWITCH, COLLISION_TYPE_BOX, ZORDER_LOW, - ZORDER_FLOOR, COLLISION_TYPE_DOOR, COLLISION_TYPE_PROJECTILE) + ZORDER_FLOOR, COLLISION_TYPE_DOOR, COLLISION_TYPE_PROJECTILE, + COLLISION_TYPE_WEREWOLF_ATTACK) from nagslang.resources import resources from nagslang.events import DoorEvent @@ -404,3 +406,37 @@ space, 'gun', self.shape, render.ImageRenderer(resources.get_image('objects', 'bullet.png')), ) + + +class ClawAttack(GameObject): + def __init__(self, space, position, vector, source_collision_type): + body = make_body(1, pymunk.inf, position) + self.last_position = position + self.shape = pymunk.Circle(body, 30) + self.shape.sensor = True + self.shape.collision_type = COLLISION_TYPE_WEREWOLF_ATTACK + self.source_collision_type = source_collision_type + super(ClawAttack, self).__init__( + SingleShapePhysicser(space, self.shape), + render.ImageRenderer(resources.get_image + ('objects', 'werewolf_SW_claw_attack.png')), + ) + self.time_created = time.time() + + def animate(self): + super(ClawAttack, self).animate() + position = (self.physicser.position.x, self.physicser.position.y) + r = self.get_space().segment_query(self.last_position, position) + self.last_position = position + for collision in r: + shape = collision.shape + if (shape.collision_type == self.source_collision_type + or shape == self.physicser.get_shape() + or shape.sensor): + continue + if hasattr(shape, 'physicser'): + shape.physicser.game_object.hit(self) + if time.time() - self.time_created > 0.2: + self.physicser.remove_from_space() + self.remove = True +
--- a/nagslang/protagonist.py Fri Sep 06 00:38:05 2013 +0200 +++ b/nagslang/protagonist.py Fri Sep 06 00:37:26 2013 +0200 @@ -6,8 +6,8 @@ from nagslang.constants import ( COLLISION_TYPE_PLAYER, ZORDER_MID, WEREWOLF_SOAK_FACTOR, PROTAGONIST_HEALTH_MIN_LEVEL, PROTAGONIST_HEALTH_MAX_LEVEL, - NON_GAME_OBJECT_COLLIDERS) -from nagslang.events import FireEvent + NON_GAME_OBJECT_COLLIDERS, COLLISION_TYPE_WEREWOLF_ATTACK) +from nagslang.events import FireEvent,ClawEvent from nagslang.game_object import GameObject, Physicser, make_body from nagslang.mutators import FLIP_H from nagslang.resources import resources @@ -252,7 +252,7 @@ """Attempt to hurt something. """ if self.in_wolf_form(): - pass + self.claw() else: self.shoot() @@ -264,6 +264,14 @@ vec.length = 1000 FireEvent.post(self.physicser.position, vec, 10, COLLISION_TYPE_PLAYER) + def claw(self): + vec = Vec2d.unit() + vec.angle = self.angle + vec.length = 100 + ClawEvent.post(self.physicser.position, vec, + COLLISION_TYPE_WEREWOLF_ATTACK) + print "Claw", self.physicser.position, vec + def in_wolf_form(self): return self.form == self.WOLF_FORM
--- a/nagslang/screens/area.py Fri Sep 06 00:38:05 2013 +0200 +++ b/nagslang/screens/area.py Fri Sep 06 00:37:26 2013 +0200 @@ -7,10 +7,10 @@ from nagslang.constants import ( COLLISION_TYPE_WALL, COLLISION_TYPE_PLAYER, CALLBACK_COLLIDERS) from nagslang.enemies import DeadEnemy -from nagslang.events import ScreenChange, DoorEvent, FireEvent, EnemyDeathEvent +from nagslang.events import ScreenChange, DoorEvent, FireEvent, EnemyDeathEvent, ClawEvent from nagslang.level import Level from nagslang.screens.base import Screen -from nagslang.game_object import Bullet +from nagslang.game_object import Bullet, ClawAttack from nagslang.sound import sound @@ -156,6 +156,10 @@ dead_enemy = DeadEnemy(self.space, self.world, ev.position, ev.enemy_type) self._drawables.add(dead_enemy) + elif ClawEvent.matches(ev): + claw_attack = ClawAttack(self.space, ev.source, ev.vector, + ev.source_collision_type) + self._drawables.add(claw_attack) self.keys.handle_event(ev) def _calc_viewport(self, level_surface, display_surface):