# HG changeset patch # User Jeremy Thurgood # Date 1302267271 -7200 # Node ID afd9256ad6828ea3fe26d38a118fb2ff125aac72 # Parent 44cd7cfd2de32c4ea64195fa962fe3ffefa5a835 Move between doorways. (Still with hacky collision limiting.) diff -r 44cd7cfd2de3 -r afd9256ad682 data/game.json --- 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"} } diff -r 44cd7cfd2de3 -r afd9256ad682 data/levels/level2.json --- 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"} + } } diff -r 44cd7cfd2de3 -r afd9256ad682 data/levels/level3.json --- 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"} + } } diff -r 44cd7cfd2de3 -r afd9256ad682 data/levels/level4.json --- 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"} + } } diff -r 44cd7cfd2de3 -r afd9256ad682 data/levels/level5.json --- 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"} + } } diff -r 44cd7cfd2de3 -r afd9256ad682 data/levels/temple.json --- 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"} + } } diff -r 44cd7cfd2de3 -r afd9256ad682 data/levels/temple_grounds.json --- 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"} + } } diff -r 44cd7cfd2de3 -r afd9256ad682 skaapsteker/engine.py --- 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) diff -r 44cd7cfd2de3 -r afd9256ad682 skaapsteker/level.py --- 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) diff -r 44cd7cfd2de3 -r afd9256ad682 skaapsteker/levelscene.py --- 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: diff -r 44cd7cfd2de3 -r afd9256ad682 skaapsteker/menuscene.py --- 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'), ] diff -r 44cd7cfd2de3 -r afd9256ad682 skaapsteker/sprites/base.py --- 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