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