示例#1
0
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)