from level.Level import Level from level.elements.ButtonInputLevelElement import ButtonInputLevelElement from level.elements.SimpleBlockLevelElement import SimpleBlockLevelElement from level.elements.UnknownTileLevelElement import UnknownTileLevelElement from physics import ConstantsParser from physics.SpriteManager import SpriteManager, DrawLayers from sprite.SpritesheetManager import SpritesheetManager TILES = { '#': SimpleBlockLevelElement, '+': SimpleBlockLevelElement, '-': SimpleBlockLevelElement, 'l': SimpleBlockLevelElement, 'r': SimpleBlockLevelElement, '~': SimpleBlockLevelElement, '|': SimpleBlockLevelElement, 'P': ButtonInputLevelElement, 'L': ButtonInputLevelElement, # TODO } class LoadedLevel: def __init__(self, sprite_manager: SpriteManager, spritesheet_manager: SpritesheetManager): self.sprite_manager = sprite_manager self.spritesheet_manager = spritesheet_manager self.blocks = [] def load_level(self, level: Level): for row_number, row in enumerate(level.tiles): for tile_number, tile in enumerate(row): world_position = (tile_number, row_number) position = (tile_number * ConstantsParser.CONFIG.block_size[0], row_number * ConstantsParser.CONFIG.block_size[1]) tile['world_position'] = world_position tile['position'] = position name = tile['name'] element = None if name in TILES: element = TILES[name](tile, self) elif not name == '': print(f"Unknown tile at {position}: {name}") element = UnknownTileLevelElement(tile, self) if element: self.blocks.append(element) self.sprite_manager.add_ui_element(DrawLayers.OBJECTS, element) element.load(self.sprite_manager, self.spritesheet_manager, level) if isinstance(element, SimpleBlockLevelElement): if self.is_surrounded_by_blocks(world_position, level.tiles): element.is_collider = False # self.sprite_manager.remove_ui_element(element) def is_surrounded_by_blocks(self, position, tiles): for i in range(-1, 2): for j in range(-1, 2): if i == 0 and j == 0: continue if position[0] + i < 0 or position[0] + i >= len(tiles[0]): continue if position[1] + j < 0 or position[1] + j >= len(tiles): continue tile = tiles[position[1] + j][position[0] + i] if not tile['name'] in ['#', '+', '-', 'l', 'r', '~', '|']: return False return True def destroy_level(self): for block in self.blocks: self.sprite_manager.remove_ui_element(block) del self.blocks