class TerrainRenderer: """Render the map.""" def __init__(self): """Init the class.""" self.terrain_map = [[]] self.geom_node = NodePath('terrain') self.minimap_node = NodePath('minimap') self.coll_node = CollisionNode('cnode') self.geom_builder = GeomBuilder('floor') def get_tile(self, i, j): """Get element from terrain_map.""" try: return self.terrain_map[i][j] except IndexError: return Empty() def create_geom(self, loader): """Creates self.geom_node from self.terrain_map.""" # geom_builder = GeomBuilder('floor') map_size = len(self.terrain_map) unit_size = map_params.unit_size start_pos = -map_size*unit_size/2 # colors = map_params.colors # geom_builder.add_rect( # colors.floor, # start_pos, start_pos, 0, # -start_pos, -start_pos, 0 # ) card_maker = CardMaker("cm") card_maker.setFrame( Point3(-start_pos, -start_pos, 0), Point3(+start_pos, -start_pos, 0), Point3(+start_pos, +start_pos, 0), Point3(-start_pos, +start_pos, 0) ) card_maker.setColor(map_params.colors.floor) floor_node = NodePath(card_maker.generate()) floor_node.reparentTo(self.geom_node) # floor_node.setHpr(0, 90, 0) # floor_node.setPos(0, 0, 0) tex = loader.loadTexture('models/floor.png') floor_node.setTexture(tex, 1) floor_node.setTexScale(TextureStage.getDefault(), map_size, map_size) def get(i, j): return isinstance(self.get_tile(i, j), Wall) wall_count = 0 for i in range(map_size-1): for j in range(map_size-1): if any([get(i, j), get(i+1, j), get(i+1, j+1), get(i, j+1)]): wall_count += 1 def callback(): self.geom_node.clearModelNodes() self.geom_node.flattenStrong() threads = Threads(wall_count, callback) for i in range(map_size-1): for j in range(map_size-1): current_position = ( start_pos+i*unit_size, start_pos+j*unit_size, 0 ) render_wall( current_position, [get(i, j), get(i+1, j), get(i+1, j+1), get(i, j+1)], ((i+j) & 1)+1, self.geom_node, loader, threads ) def create_collision(self): """Creates self.coll_node from self.terrain_map.""" map_size = len(self.terrain_map) start_pos = -map_size*map_params.unit_size/2 box_size = Vec3( map_params.unit_size, map_params.unit_size, map_params.height ) for i in range(map_size): for j in range(map_size): current_position = Point3( start_pos+i*map_params.unit_size, start_pos+j*map_params.unit_size, 0 ) if isinstance(self.get_tile(i, j), Wall): self.coll_node.addSolid(CollisionBox( current_position, current_position + box_size )) def create_minimap(self): """Creates self.minimap_node from self.terrain_map.""" map_size = len(self.terrain_map) for i in range(map_size): for j in range(map_size): self.get_tile(i, j).generate_map((i, j)).reparentTo( self.minimap_node)