class PlayScene(Scene): def __init__(self, game, level): Scene.__init__(self, game) self.timer = 0.0 self.timer_freq = 5.0 self.x = 50.0 self.drawable_objects = [] self.level = level level_map_path = './assets/maps/map'+ str(level) +'.json' self.map = Map(level_map_path, './assets/img/ground.png') screen_rect = game.screen.get_rect() world_bounds = Rect(0, 0, self.map.get_rect().width, self.map.get_rect().height) self.bg = Surface((game.width, game.height)) self.world = PhysicsWorld(self.map, world_bounds, (0, 900)) player_spawn = self.map.get_obj_layer('player_spawn')['objects'][0] player_x = player_spawn['x'] player_y = player_spawn['y'] player_color_interval = 0 try: player_color_interval = int(player_spawn['properties']['color_interval']) except KeyError: pass self.player = Player((player_x, player_y), player_color_interval, game.input) self.world.add_obj(self.player) color_changing_blocks = self.map.get_obj_layer('color_changing_blocks')['objects'] lava_blocks = self.map.get_obj_layer('lava_blocks')['objects'] moving_blocks = self.map.get_obj_layer('moving_blocks')['objects'] movable_blocks = self.map.get_obj_layer('movable_blocks')['objects'] impulse_blocks = self.map.get_obj_layer('impulse_blocks')['objects'] exit_block = self.map.get_obj_layer('exit')['objects'][0] texts = self.map.get_obj_layer('texts')['objects'] exit_coord = self.obj_adjust_position((exit_block['x'], exit_block['y'])) self.exit = ExitBlock(exit_coord) self.world.add_obj(self.exit) self.drawable_objects.append(self.exit) # create dynamic color blocks for block in color_changing_blocks: real_coord = self.obj_adjust_position( (block['x'], block['y']) ) exclude_color = 'red' try: exclude_color = block['properties']['exclude_color'] except KeyError: pass block = ColorChangingBlock(real_coord, 1, exclude_color) self.world.add_obj(block) self.drawable_objects.append(block) # create lava blocks for block in lava_blocks: real_coord = self.obj_adjust_position( (block['x'], block['y']) ) lava_block = LavaBlock(real_coord) self.world.add_obj(lava_block) self.drawable_objects.append(lava_block) for block in moving_blocks: real_coord = self.obj_adjust_position( (block['x'], block['y']) ) right, _ = self.obj_adjust_position(( block['x'] + block['width'], block['y'] )) right += self.map.content['tilewidth'] map_x, _ = self.map.get_map_coord( (block['x'], block['y']) ) end_pos_x = (map_x + int(block['properties']['end_pos_x'])) * self.map.content['tilewidth'] end_pos = (end_pos_x, block['y']) moving_block = MovingBlock(real_coord, end_pos, (right - real_coord[0], self.map.content['tilewidth']), self.map.content['tilewidth'], block) self.world.add_obj(moving_block) self.drawable_objects.append(moving_block) for block in movable_blocks: real_coord = self.obj_adjust_position( (block['x'], block['y']) ) movable_block = MovableBlock(real_coord, block['properties']['color']) self.world.add_obj(movable_block) self.drawable_objects.append(movable_block) for block in impulse_blocks: real_coord = self.obj_adjust_position( (block['x'], block['y']) ) color = block['properties']['color'] direction = int(block['properties']['direction']) impulse_block = ImpulseBlock(real_coord, color, direction) self.world.add_obj(impulse_block) self.drawable_objects.append(impulse_block) # create map texts for text in texts: real_coord = self.obj_adjust_position( (text['x'], text['y']) ) size = 20 try: size = int(text['properties']['size']) except KeyError: pass font = pygame.font.Font('./assets/font/vcr.ttf', size) game_text = Text(font, text['properties']['text'], real_coord) self.drawable_objects.append(game_text) self.camera = Camera(self.world, screen_rect, world_bounds) self.camera.set_target(self.player) self.sound_player_lose = Sound('./assets/audio/lose.wav') def obj_adjust_position(self, pos): map_x, map_y = self.map.get_map_coord((pos[0], pos[1])) return (map_x * self.map.content['tilewidth'], map_y * self.map.content['tileheight']) def save_game(self): resource.write_save_file(str(int(self.level) + 1)) def update(self, dt): global SOUND_ENABLED game = self.game if game.input.is_down(K_s): SOUND_ENABLED = not SOUND_ENABLED self.camera.update() self.world.update(dt) lose = self.player.dead win = self.exit.exited restart = game.input.is_down(K_r) if lose: PLAY_SOUND(self.sound_player_lose) if lose or restart: game.next_scene = PlayScene(game, self.level) elif win: game.next_scene = PlayScene(game, int(self.level) + 1) self.save_game() def draw(self): game = self.game # self.background.draw(game.screen, self.camera.rect) game.screen.blit(self.bg, (0, 0)) self.map.draw(game.screen) for obj in self.drawable_objects: obj.draw(game.screen, self.camera.rect) self.player.draw(game.screen) # self.world.debug_draw(game.screen)