Exemplo n.º 1
0
class Map:
    """ Return the top nodes of the world map"""

    def __init__(self, map_width, map_height, map_depth):
        """ Get the width, the height and the depth of the map """
        self.map_width = map_width
        self.map_height = map_height
        self.map_depth = map_depth
        self.light_direction = (50000, 500, 500)
        # self.terrain = Terrain("Objects/ground/heightmap_squared.png", light_direction=self.light_direction, translate_y=-100, translate_x=-600, translate_z=-800, scale_total=8)
        self.terrain = Terrain("Objects/ground/heightmap.png", light_direction=self.light_direction, translate_y=-100, translate_x=-600, translate_z=-800, scale_total=8)

    def elevate(self, node):
        """ Elevate the node to be on the terrain """
        # print("#")
        # print("On va elever : ({}, {})".format(node.get_x(),node.get_z()))
        new_height = self.terrain.find_height(node.get_x(), node.get_z())
        # print("Height = ", new_height)
        node.set_height_ground(new_height)

    def move(self, node):
        new_position = self.terrain.find_position(node.get_x(), node.get_z())
        node.set_global_position(*new_position)

    def generate_nodes(self, mesh, number, rotation_max=360, axis_rotation=(0, 1, 0), axis_translation=(1, 0, 1)):
        """
            Generate all leaf nodes
            rotation_max = rotation max possible on the axes
            axis_rotation = axe of rotation, ex (0, 1, 0) = only on y
            axis_translation = axe of translation, ex (1, 0, 1) = for humans
        """
        nodes = []
        for i in range(number):
            node = Node('')
            node.add(mesh)
            self.randomize_creation(node, rotation_max, axis_rotation, axis_translation)
            nodes.append(node)
        return nodes

    def randomize_creation(self, node, rotation_max, axis_rotation, axis_translation):
        """
            Modify randomly a nodes
            Using the parameters of the map
        """
        node.translate()
        node.rotate(axis_rotation, randint(-rotation_max, rotation_max))
        node.translate(axis_translation[0]*randint(-self.map_width, self.map_width), \
                        axis_translation[1]*randint(-self.map_height, self.map_height), \
                        axis_translation[2]*randint(-self.map_depth, self.map_depth))

        # If the user hasn't defined an y translation ,we elevate the node
        if (axis_translation[1] == 0):
            self.elevate(node)
            # self.move(node)

    def rochers(self):
        """ Add rochers  """
        mesh_rocher = Rocher(self.light_direction)
        children = self.generate_nodes(mesh_rocher, 40)
        rochers = Node("all_trex", children=children)
        for node in children:
            node.scale_total(8)
        return rochers

    def trex(self):
        """ Generate the trex """
        mesh_trex = load_textured("Objects/trex/trex.obj")[0]
        children = self.generate_nodes(mesh_trex, 10)
        for node in children:
            node.scale_total(4)
        nodes_trex = Node("all_trex", children=children)
        return nodes_trex

    def tree(self):
        """ Generate trees """
        mesh_tree = Arbre(self.light_direction)
        children = self.generate_nodes(mesh_tree, 70)
        nodes_tree = Node("forest", children=children)
        for node in children:
            node.scale_total(10)
            node.translate(y=random())
        return nodes_tree

    def asteroids(self):
        mesh_rocher = Rocher(self.light_direction, color=[0.8,0.2,0.2])
        node = Node("LaFinDuMonde")
        for i in range(4):
            oneNode = Node('', children=[mesh_rocher])
            oneNode.scale_total(20)
            oneNode.translate(0,100+randint(0,5),0)
            self.randomize_creation(oneNode, rotation_max=360, axis_rotation=(0, 1, 0), axis_translation=(1, 1, 1))

            translate_keys = {0: vec(0, 1000, 0), 4: vec(0, -800, 0)}
            rotate_keys = {0: quaternion(), 57: quaternion()}
            scale_keys = {0: 1,7:1}
            keynode = KeyFrameControlNode(translate_keys, rotate_keys, scale_keys, resetTime=6)
            keynode.add(oneNode)
            node.add(keynode)
        return node


    def simple_ground(self):
        """ Load a simple ground """
        ground_mesh = TexturedPlane("Objects/ground/moss.jpg")
        ground_node = Node("ground", children=[ground_mesh])
        ground_node.rotate((1, 0, 0), -90)
        ground_node.scale_total(10)
        return ground_node

    def skybox(self):
        """ Create the skybox """
        mesh_skybox = load_textured("Objects/skybox/skybox.obj")[0]
        node_skybox = Node("skybox", children=[mesh_skybox])
        node_skybox.translate(x=1, y=-100)
        node_skybox.rotate((1, 0, 0), -90)
        node_skybox.scale_total(25)
        return node_skybox

    def dino_moving(self, name):
        """ Add moving dino """
        node_dino = load_skinned("Objects/dino/Dinosaurus_walk.dae")[0]
        node_dino.set_name(name)
        node_dino.set_acceleration(1)
        return node_dino

    def meteorites():
        meteorites = []
        return meteorites

    def gate(self):
        """ Return a gate"""
        gate_node = Gate("gate", 1)
        gate_node.scale_total(100)
        gate_node.translate(z=-100)
        self.elevate(gate_node)
        return gate_node

    def create(self):
        top_node = Node('top')
        # mesh_trex = load_textured("Objects/trex/trex.obj")[0]
        # trex_one = Node("trex_one", children=[mesh_trex])
        # self.elevate(trex_one)

        trex_player = Node('player_node', children=[self.dino_moving("player")])
        trex_player.scale_total(10)
        self.elevate(trex_player)
        top_node.add(self.skybox(), self.terrain, self.tree(), self.rochers(), self.asteroids(),self.trex(), trex_player, self.gate())
        return top_node