class RendererLoopBreak(BaseException): pass class Renderer: """ Class responsible for updating tiles, their states, animations, etc. In the future, also takes in a WaterLayer and updates it with the game map. """ def __init__(self): self.tiles = [] # location of the top left corner of the viewpoint self.pos = [0, 0] self.viewport = [80, 24] def addTile(self, tile): self.tiles.append(tile) def massUpdate(self): for i in self.tiles: if i.ttype == "standard" or i.ttype == "liquid": i.update(self.tiles) def inViewport(self, pos): if pos[0] < 0 or pos[0] > self.viewport[0] - 1: return False if pos[1] < 0 or pos[1] > self.viewport[1] - 1: return False return True def selectForRendering(self): """ Returns what tiles are in the viewport. """ tilesInScene = [] for i in self.tiles: dims = i.dims if not dims: dims = [1, 1] pos = i.getCoords() try: for j in range(dims[0]): for k in range(dims[1]): if self.inViewport([pos[0] + j, pos[1] + k]): tilesInScene.append(i) raise RendererLoopBreak except RendererLoopBreak: pass self.cachedTiles = tilesInScene return tilesInScene def render(self): board = [ ["." for i in range(self.viewport[1])] for i in range(self.viewport[0]) ] toRender = self.selectForRendering() for tile in toRender: rendered = tile.render() coords = tile.getCoords() for j in range(len(rendered[0])): for i in range(len(rendered)): board[i + coords[0]][j + coords[1]] = rendered[j][i] return board def finalRender(self, rendered=None): if not rendered: rendered = self.render() for i in range(len(rendered[0])): buf = [] for j in range(len(rendered)): buf.append(rendered[j][i]) print(''.join(buf))