changeset 273:95e2ef31e714

Hit "down" to interact with things.
author Jeremy Thurgood <firxen@gmail.com>
date Fri, 08 Apr 2011 19:09:09 +0200
parents 630ebb87b38a
children bcdfd2be2eb4
files data/levels/temple.json skaapsteker/levelscene.py skaapsteker/physics.py skaapsteker/sprites/base.py skaapsteker/sprites/player.py
diffstat 5 files changed, 35 insertions(+), 43 deletions(-) [+]
line wrap: on
line diff
--- a/data/levels/temple.json	Fri Apr 08 17:32:50 2011 +0200
+++ b/data/levels/temple.json	Fri Apr 08 19:09:09 2011 +0200
@@ -29,7 +29,7 @@
         {"type": "RedOni", "pos": [15, 11], "direction": "right" }
     ],
     "doorways": {
-        "starting": {"type": "StartingDoorway", "pos": [4, 17], "facing": "right"},
+        "starting": {"type": "StartingDoorway", "pos": [4, 16], "facing": "right"},
         "to_level2": {"type": "Doorway", "pos": [17, 16], "facing": "left", "leadsto": "level2.to_temple"}
     }
 }
--- a/skaapsteker/levelscene.py	Fri Apr 08 17:32:50 2011 +0200
+++ b/skaapsteker/levelscene.py	Fri Apr 08 19:09:09 2011 +0200
@@ -42,6 +42,7 @@
         self._world.add(self._player)
 
         self._build_action_map()
+        self._key_sequence = []
 
     def setup_player(self):
         doorway = self._level.doorways[self.game_state.world.player.doorway]
@@ -181,8 +182,6 @@
             self._key_sequence = []
             return False
 
-        print ev
-
         if ev.type is KEYUP:
             if (not self._key_sequence
                 or ev.key != self._key_sequence[-1]
--- a/skaapsteker/physics.py	Fri Apr 08 17:32:50 2011 +0200
+++ b/skaapsteker/physics.py	Fri Apr 08 19:09:09 2011 +0200
@@ -174,6 +174,8 @@
         self._mobiles = pygame.sprite.Group()
         self._gravitators = pygame.sprite.Group()
         self._updaters = pygame.sprite.Group()
+        self._actionables = pygame.sprite.Group()
+        self._actors = pygame.sprite.Group()
         self._collision_groups = { None: pygame.sprite.Group() }
         self._last_time = None
 
@@ -199,6 +201,10 @@
         if sprite.wants_updates:
             self._updaters.add(sprite)
             sprite.collision_group = self._collision_groups[sprite.collision_layer]
+        if getattr(sprite, 'player_action', None) is not None:
+            self._actionables.add(sprite)
+        if getattr(sprite, 'add_actionable', None) is not None:
+            self._actors.add(sprite)
 
     def _add_collision_group(self, layer):
         if layer in self._collision_groups:
@@ -287,6 +293,14 @@
         # call update methods
         self._updaters.update()
 
+        # Action stuff.
+        # Happens after updates, because we only want it for the next frame.
+        for sprite in self._actors:
+            for other in self._actionables:
+                if sprite.collide_rect.colliderect(other.collide_rect):
+                    sprite.add_actionable(other)
+
+
     def draw(self, surface):
         self._all.draw(surface)
         if options['debug_rects']:
--- a/skaapsteker/sprites/base.py	Fri Apr 08 17:32:50 2011 +0200
+++ b/skaapsteker/sprites/base.py	Fri Apr 08 19:09:09 2011 +0200
@@ -192,30 +192,22 @@
 class NPC(AnimatedGameSprite):
 
     collision_layer = NPC_LAYER
-    collides_with = set([PC_LAYER])
 
     debug_color = (240, 240, 240)
     bounce_factor = (0, 0)    #  NPC's don't bounce by default
 
     block = False
+    actionable = True
 
     def __init__(self, pos, **opts):
         AnimatedGameSprite.__init__(self, pos, **opts)
         self._layer = Layers.PLAYER
-        self._ticks_before_interact = 0
 
     def setup(self, name, world, dsm, state):
         self.dsm = dialogue.DSM(name, world, dsm, state)
 
-    def collided_player(self, player):
-        if self._ticks_before_interact == 0:
-            self._ticks_before_interact = 120
-            OpenDialog.post(self)
-
-    def update(self):
-        super(NPC, self).update()
-        if self._ticks_before_interact > 0:
-            self._ticks_before_interact -= 1
+    def player_action(self, player):
+        OpenDialog.post(self)
 
 
 class Projectile(GameSprite):
@@ -226,10 +218,10 @@
     mobile = False
     gravitates = False
 
-    collision_layer = MONSTER_LAYER
-    collides_with = set([PC_LAYER])
+    collision_layer = NPC_LAYER
 
     portable = True
+    actionable = True
 
     def __init__(self, pos, **opts):
         GameSprite.__init__(self, pos, **opts)
@@ -247,7 +239,7 @@
         return (0, 0, 240)
 
 
-    def collided_player(self, player):
+    def player_action(self, player):
         print "Player touched %s" % self
         player.take_item(self)
 
@@ -258,6 +250,7 @@
     gravitates = False
     collides_with = set([PC_LAYER, MONSTER_LAYER, NPC_LAYER])
     is_ground = True
+    actionable = False
     bounce_factor = (0.0, 0.0)
 
     def __init__(self, pos, image):
@@ -282,19 +275,12 @@
 class Doorway(GameSprite):
     mobile = False
     gravitates = False
-    collides_with = set([PC_LAYER])
-    wants_updates = True
 
     blocks = False
+    actionable = True
 
     image_file = 'torii.png'
 
-    debug_color = (120, 240, 120)
-
-    def __init__(self, pos, **opts):
-        GameSprite.__init__(self, pos, **opts)
-        self._ticks_before_interact = 120
-
 
     def setup_image_data(self, pos):
         super(Doorway, self).setup_image_data(pos)
@@ -309,16 +295,7 @@
         print leadsto
 
 
-    def update(self):
-        super(Doorway, self).update()
-        if self._ticks_before_interact > 0:
-            self._ticks_before_interact -= 1
-
-
-    def collided_player(self, player):
-        if self._ticks_before_interact != 0:
-            return
-        self._ticks_before_interact = 120
+    def player_action(self, player):
         print "Player touched %s" % self
         from .. import engine, levelscene
         engine.ChangeScene.post((levelscene.LevelScene, self.leadsto))
@@ -326,7 +303,7 @@
 
 
 class StartingDoorway(Doorway):
-    collides_with = set()
+    actionable = False
 
     def setup_image_data(self, pos):
         self.image = pygame.Surface((0, 0))
@@ -338,12 +315,6 @@
         Doorway.setup(self, facing, None)
 
 
-    def collided_player(self, player):
-        print "Player touched %s" % self
-        from .. import engine, levelscene
-        engine.ChangeScene.post((levelscene.LevelScene, self.leadsto))
-
-
 
 def find_sprite(descr, mod_name=None):
     """Create a sprite object from a dictionary describing it."""
--- a/skaapsteker/sprites/player.py	Fri Apr 08 17:32:50 2011 +0200
+++ b/skaapsteker/sprites/player.py	Fri Apr 08 19:09:09 2011 +0200
@@ -71,6 +71,7 @@
         self.init_pos()
 
     def update(self):
+        self._touching_actionables = []
         v_x, v_y = self.velocity
         # Never animate slower than !7 fps, never faster than ~15 fps
         if self.attacking > 0:
@@ -225,7 +226,10 @@
             self.on_solid = False
 
     def action_down(self):
-        self.deltav((0.0, 100.0))
+        print self._touching_actionables
+        for actionable in self._touching_actionables[:1]:
+            actionable.player_action(self)
+
 
     def action_fire1(self):
         # FIXME: Use the correct tail properties for this
@@ -296,3 +300,7 @@
         self.the_world.fox.item = item.name
         item.kill()
         print "took", item
+
+
+    def add_actionable(self, actionable):
+        self._touching_actionables.append(actionable)