changeset 264:afd9256ad682

Move between doorways. (Still with hacky collision limiting.)
author Jeremy Thurgood <firxen@gmail.com>
date Fri, 08 Apr 2011 14:54:31 +0200
parents 44cd7cfd2de3
children 7628467eecd9
files data/game.json data/levels/level2.json data/levels/level3.json data/levels/level4.json data/levels/level5.json data/levels/temple.json data/levels/temple_grounds.json skaapsteker/engine.py skaapsteker/level.py skaapsteker/levelscene.py skaapsteker/menuscene.py skaapsteker/sprites/base.py
diffstat 12 files changed, 92 insertions(+), 41 deletions(-) [+]
line wrap: on
line diff
--- a/data/game.json	Fri Apr 08 11:47:33 2011 +0200
+++ b/data/game.json	Fri Apr 08 14:54:31 2011 +0200
@@ -31,5 +31,6 @@
         "level3" : "level3",
         "level4" : "level4",
         "level5" : "level5"
-    }
+    },
+    "player": {"level": "temple", "doorway": "starting"}
 }
--- a/data/levels/level2.json	Fri Apr 08 11:47:33 2011 +0200
+++ b/data/levels/level2.json	Fri Apr 08 14:54:31 2011 +0200
@@ -30,6 +30,8 @@
     ],
     "enemies": [],
     "sprites": [],
-    "doorways": [],
-    "player": {"pos": [6, 2], "direction": "right"}
+    "doorways": {
+        "starting": {"type": "StartingDoorway", "pos": [5, 5], "facing": "right"},
+        "to_temple": {"type": "Doorway", "pos": [29, 2], "facing": "right", "leadsto": "temple.to_level2"}
+    }
 }
--- a/data/levels/level3.json	Fri Apr 08 11:47:33 2011 +0200
+++ b/data/levels/level3.json	Fri Apr 08 14:54:31 2011 +0200
@@ -20,6 +20,7 @@
     ],
     "enemies": [],
     "sprites": [],
-    "doorways": [],
-    "player": {"pos": [2, 1], "direction": "right"}
+    "doorways": {
+        "starting": {"type": "StartingDoorway", "pos": [2, 1], "facing": "right"}
+    }
 }
--- a/data/levels/level4.json	Fri Apr 08 11:47:33 2011 +0200
+++ b/data/levels/level4.json	Fri Apr 08 14:54:31 2011 +0200
@@ -21,6 +21,7 @@
     ],
     "enemies": [],
     "sprites": [],
-    "doorways": [],
-    "player": {}
+    "doorways": {
+        "starting": {"type": "StartingDoorway", "pos": [5, 2], "facing": "right"}
+    }
 }
--- a/data/levels/level5.json	Fri Apr 08 11:47:33 2011 +0200
+++ b/data/levels/level5.json	Fri Apr 08 14:54:31 2011 +0200
@@ -29,6 +29,7 @@
     ],
     "enemies": [],
     "sprites": [],
-    "doorways": [],
-    "player": {}
+    "doorways": {
+        "starting": {"type": "StartingDoorway", "pos": [5, 2], "facing": "right"}
+    }
 }
--- a/data/levels/temple.json	Fri Apr 08 11:47:33 2011 +0200
+++ b/data/levels/temple.json	Fri Apr 08 14:54:31 2011 +0200
@@ -28,8 +28,8 @@
         {"type": "RedOni", "pos": [4, 8], "direction": "left" },
         {"type": "RedOni", "pos": [15, 11], "direction": "right" }
     ],
-    "doorways": [
-        {"type": "Doorway", "pos": [17, 16], "leadsto": "level2"}
-    ],
-    "player": {"pos": [4, 17], "direction": "right"}
+    "doorways": {
+        "starting": {"type": "StartingDoorway", "pos": [4, 17], "facing": "right"},
+        "to_level2": {"type": "Doorway", "pos": [17, 16], "facing": "left", "leadsto": "level2.to_temple"}
+    }
 }
--- a/data/levels/temple_grounds.json	Fri Apr 08 11:47:33 2011 +0200
+++ b/data/levels/temple_grounds.json	Fri Apr 08 14:54:31 2011 +0200
@@ -25,6 +25,7 @@
         {"type": "RedOni", "pos": [10, 8], "direction": "left" },
         {"type": "RedOni", "pos": [26, 11], "direction": "right" }
     ],
-    "doorways": [],
-    "player": {"pos": [3, 2], "direction": "right"}
+    "doorways": {
+        "starting": {"type": "StartingDoorway", "pos": [3, 2], "facing": "right"}
+    }
 }
--- a/skaapsteker/engine.py	Fri Apr 08 11:47:33 2011 +0200
+++ b/skaapsteker/engine.py	Fri Apr 08 14:54:31 2011 +0200
@@ -38,7 +38,7 @@
                 if ChangeScene.matches(ev):
                     next_scene = ev.next_scene
                     if not isinstance(next_scene, Scene):
-                        next_scene = next_scene[0](self.game_state, *(next_scene[1:]))
+                        next_scene = next_scene[0](self.game_state, self.soundsystem, *(next_scene[1:]))
                     self.change_scene(next_scene)
                     break
                 self._current_scene.dispatch(ev)
--- a/skaapsteker/level.py	Fri Apr 08 11:47:33 2011 +0200
+++ b/skaapsteker/level.py	Fri Apr 08 14:54:31 2011 +0200
@@ -53,7 +53,7 @@
 
 
 class Level(object):
-    def __init__(self, leveldef, player, soundsystem):
+    def __init__(self, leveldef, soundsystem):
         self.name = leveldef
         self.level_data = json.loads(data.load('levels/' + leveldef + '.json').read())
         self.sprites = LayeredUpdates()
@@ -62,7 +62,6 @@
         self.build_tiles()
         self.setup_enemies()
         self.setup_doorways()
-        self.setup_player(player)
         self._background_music = None
         if 'music' in self.level_data:
             # soundsystem will call data.filepath
@@ -103,20 +102,13 @@
 
 
     def setup_doorways(self):
-        self.doorways = LayeredUpdates()
-        for door_def in self.level_data['doorways']:
+        self.doorways = {}
+        for door_name, door_def in self.level_data['doorways'].items():
             doorway = find_sprite(door_def, 'base')
+            self.doorways[door_name] = doorway
             self.sprites.add(doorway)
 
 
-    def setup_player(self, player):
-        player_data = self.level_data['player']
-        player.set_facing(player_data.pop('direction', 'left'))
-        player.set_image()
-        player.set_pos(player_data.pop('pos', (5, 5)))
-        self.sprites.add(player)
-
-
     def get_surface(self):
         return Surface(self.pixel_size)
 
--- a/skaapsteker/levelscene.py	Fri Apr 08 11:47:33 2011 +0200
+++ b/skaapsteker/levelscene.py	Fri Apr 08 14:54:31 2011 +0200
@@ -16,15 +16,18 @@
 
 class LevelScene(engine.Scene):
 
-    def __init__(self, game_state, soundsystem, leveldef):
+    def __init__(self, game_state, soundsystem, doorway_def=None):
         super(LevelScene, self).__init__(game_state, soundsystem)
 
-        self._player = player.Player(game_state.world, soundsystem)
-        self._level = level.Level(leveldef, self._player, soundsystem)
-        self._leveldef = leveldef
+        if doorway_def is not None:
+            player_def = self.game_state.world.player
+            player_def.level, player_def.doorway = doorway_def.split('.')
+        self._level = level.Level(self.game_state.world.player.level, soundsystem)
         self._player_dead = False
         self._dialogue = None
 
+        self.setup_player()
+
         self._level_surface = self._level.get_surface()
         self._clip_rect = None
         self._world = physics.World()
@@ -38,6 +41,15 @@
 
         self._build_action_map()
 
+
+    def setup_player(self):
+        doorway = self._level.doorways[self.game_state.world.player.doorway]
+        self._player = player.Player(self.game_state.world, self._soundsystem)
+        self._player.set_facing(doorway.facing)
+        self._player.set_image()
+        self._player.set_pos(doorway._starting_tile_pos)
+
+
     def _build_action_map(self):
         action = lambda s: getattr(self._player, 'action_%s' % s)
 
@@ -78,7 +90,7 @@
     def _restart(self):
         if self._player_dead:
             self._player.restore()
-        engine.ChangeScene.post(LevelScene(self.game_state, self._soundsystem, self._leveldef))
+        engine.ChangeScene.post(LevelScene(self.game_state, self._soundsystem))
 
     def _toggle_pause(self):
         if self._paused:
--- a/skaapsteker/menuscene.py	Fri Apr 08 11:47:33 2011 +0200
+++ b/skaapsteker/menuscene.py	Fri Apr 08 14:54:31 2011 +0200
@@ -13,11 +13,11 @@
         self.widgets.append(Text("MENU:", (50, 50), color='white', size=48))
         self.cur_game = cur_game
         menu_options = [
-            ('Temple', 'temple'),
-            ('Level 2', 'level2'),
-            ('Level 3', 'level3'),
-            ('Level 4', 'level4'),
-            ('Level 5', 'level5'),
+            ('Temple', 'temple.starting'),
+            ('Level 2', 'level2.starting'),
+            ('Level 3', 'level3.starting'),
+            ('Level 4', 'level4.starting'),
+            ('Level 5', 'level5.starting'),
             ('Starting Cutscene', 'cutscene'),
             ('Quit', 'quit'),
         ]
--- a/skaapsteker/sprites/base.py	Fri Apr 08 11:47:33 2011 +0200
+++ b/skaapsteker/sprites/base.py	Fri Apr 08 14:54:31 2011 +0200
@@ -27,10 +27,15 @@
 
     def __init__(self, pos, **opts):
         Sprite.__init__(self)
+        self._starting_tile_pos = pos
+        self.setup_image_data(pos)
+        self.setup(**opts)
+
+
+    def setup_image_data(self, pos):
         self.image = data.load_image(self.image_dir + self.image_file)
         self.rect = self.image.get_rect(midbottom=(pos[0]*TILE_SIZE[0]+TILE_SIZE[0]/2, (pos[1]+1)*TILE_SIZE[1]))
         self.collide_rect = self.rect.move(0, 0)
-        self.setup(**opts)
 
 
 class AnimatedGameSprite(Sprite):
@@ -277,6 +282,7 @@
     mobile = False
     gravitates = False
     collides_with = set([PC_LAYER])
+    wants_updates = True
 
     image_file = 'torii.png'
 
@@ -284,17 +290,51 @@
 
     def __init__(self, pos, **opts):
         GameSprite.__init__(self, pos, **opts)
-        self._layer = Layers.PLAYER
+        self._ticks_before_interact = 120
+
+
+    def setup_image_data(self, pos):
+        super(Doorway, self).setup_image_data(pos)
         self.image = pygame.transform.scale(self.image, self.image.get_rect().center)
         self.rect = self.image.get_rect(midbottom=self.rect.midbottom)
         self.collide_rect = self.rect
 
 
-    def setup(self, leadsto):
+    def setup(self, facing, leadsto):
+        self.facing = facing
         self.leadsto = leadsto
         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
+        print "Player touched %s" % self
+        from .. import engine, levelscene
+        engine.ChangeScene.post((levelscene.LevelScene, self.leadsto))
+
+
+
+class StartingDoorway(Doorway):
+    collides_with = set()
+
+    def setup_image_data(self, pos):
+        self.image = pygame.Surface((0, 0))
+        self.rect = self.image.get_rect(midbottom=(pos[0]*TILE_SIZE[0]+TILE_SIZE[0]/2, (pos[1]+1)*TILE_SIZE[1]))
+        self.collide_rect = self.rect.move(0, 0)
+
+
+    def setup(self, facing):
+        Doorway.setup(self, facing, None)
+
+
     def collided_player(self, player):
         print "Player touched %s" % self
         from .. import engine, levelscene