Ejemplo n.º 1
0
    def __init__(self, game, path_xml):
        '''
        @brief Constructor.
        
        @param game Referencia a Game
        @param path_xml Archivo xml con la configuración del menú
        '''
        basicmenu.BasicMenu.__init__(self, game)
        
        #Cambiamos el título de la ventana
        pygame.display.set_caption("Zycars: Circuitos")

        #Parseamos la información básica del circuito(botones, imagenes...)
        parse = xml.dom.minidom.parse(data.get_path_xml(path_xml))
        self.parser_basic_info(parse)

        #Guarrada para el titulo del campeonato
        if config.Config().get_mode() == config.CHAMPIONSHIP:
            self.title = self.font.render('Campeonato', True, (0,0,0))
        
        #Mapa que contendrá los botones de cada capa
        self.buttons_layers = {}
        
        #Mapa que contendrá la imagen de un circuito dado la capa y el nombre del circuito
        self.images_circuits = {}
        
        #Mapa que contendrá los primeros circuitos de cada campeonato
        self.first_circuit = {}
        
        #Mapa con los archivos xml
        self.circuit_files = {}
        
        #Obtenemos los parametros para la posición del título de los circuitos
        self.centerx_name = 400
        self.y_name = 250
        self.rect_name = None
        self.actual_name = None
        
        self.font = resource.get_font('cheesebu', 30)
        
        #Booleanos auxiliares
        first = True
        new_layer = True
        first_layer = True
        
        #Texto a mostrar cuando no hay circuito disponible
        font = resource.get_font('cheesebu', 30)
        message = font.render('Lo sentimos, Circuito no disponible', True, 
                            (0, 0, 0))
        
        #Obtenemos la posicion de la imagen que representará al circuito
        image_pos = parse.getElementsByTagName('circuit_position')[0]
        x = int(image_pos.getAttribute('x'))
        y = int(image_pos.getAttribute('y'))
        self.circuit_position = (x, y)
        
        self.times = None
        
        self.text_laps = self.font.render('Vueltas', True, (189, 9 , 38))
        self.laps = config.Config().get_laps()
        laps = parse.getElementsByTagName('laps')[0]
        
        self.text_laps_position = (int(laps.getAttribute('text_x')), 
                                int(laps.getAttribute('text_y')))
                                
        self.laps_position = (int(laps.getAttribute('num_x')), 
                            int(laps.getAttribute('num_y')))
        
        if config.Config().get_mode() == config.TIMED:
            #Obtenemos la posición del marcador de los tiempos
            time_pos = parse.getElementsByTagName('times_position')[0]
            x = int(time_pos.getAttribute('x'))
            y = int(time_pos.getAttribute('y'))
            #Creamos el marcador de los tiempos
            self.times = Times(x, y, 'times.xml')
        
        #Recorremos las capas a mostrar, de los distintos campeonatos
        for element in parse.getElementsByTagName('layer'):
            
            #Obtenemos el nombre de la capa, debe coincidir con el del botón
            #Que hace referencia a ella
            name_layer = element.getAttribute('name')
            
            #Creamos una lista para todos los botones de esa capa
            self.buttons_layers[name_layer] = []
            
            #Creamos un mapa para cada una de las capas
            self.images_circuits[name_layer] = {}
            self.circuit_files[name_layer] = {}
            
            #Si es la primera capa que parseamos, nos quedamos con ella, para
            #mostrarla la primera
            if first_layer:
                self.actual_layer = name_layer
                first_layer = False
            
            #Obtenemos los botones de cada una de las capas
            for option in element.getElementsByTagName('button'):
                
                #Archivo xml con la configuración del botón
                xml_file = str(option.getAttribute('xml_file'))
                
                #Fuente y texto que apareceran en el boton
                font_code = str(option.getAttribute('font'))
                text = option.getAttribute('text')
                
                #Posición del botón
                x = int(option.getAttribute('x'))
                y = int(option.getAttribute('y'))
                show_text = True
                
                #Miramos si se indica si se debe mostrar o no el texto en el botón
                if option.hasAttribute('show_text'):
                    show_text = option.getAttribute('show_text')
                    show_text = button.strTobool(show_text)      
                    
                #Obtenemos el tipo de boton
                if option.hasAttribute('type'):
                    type_button = str(option.getAttribute('type'))
                
                #Según el tipo de boton obtendremos un boton u otro
                if type_button == 'normal':
                    
                    #Si es un botón normal sin imagen significa que el circuito no está disponible.
                    aux_button = button.Button(self, xml_file, text, x, y, 
                                            font_code, show_text)
                    
                    #Si que le asociamos como imagen el mensaje de que no está disponible
                    self.images_circuits[name_layer][text] = message

                elif type_button == 'image_button':
                    
                    #Obtenemos la información necesaria para ImageButton
                    image_code = str(option.getAttribute('image'))
                    image_x = int(option.getAttribute('image_x'))
                    image_y = int(option.getAttribute('image_y'))
                    
                    aux_button = imagebutton.ImageButton(self, xml_file, text, 
                                                        x, y, font_code, 
                                                        image_code, image_x, 
                                                        image_y, show_text)

                    #Obtenemos el archivo de configuración del circuito
                    circuit_file = str(option.getAttribute('circuit_file'))
                    
                    #Obtenemos la imagen que representará al circuito
                    image_circuit = str(option.getAttribute('image_circuit'))
                    
                    #Introducimos la imagen en el doble diccionario
                    self.images_circuits[name_layer][text] = resource.get_image(image_circuit)
                    #Hacemos lo mismo con el archivo xml
                    self.circuit_files[name_layer][text] = circuit_file
                
                #Nos quedamos con el primer circuito de la capa actual
                if first:
                    self.actual_circuit = text
                    
                    #También renderizamos el título del circuito
                    self.actual_name = self.font.render(text, True, 
                                                    (255, 255, 255))
                                                    
                    self.rect_name = self.actual_name.get_rect()
                    self.rect_name.y = self.y_name
                    self.rect_name.centerx = self.centerx_name
                    
                    if self.times:
                        #Nos quedamos en un principio con los tiempos del primer circuito
                        self.times.update(text)
                    
                    #Indicamos que el siguiente no será el primero
                    first = False
                
                #Nos quedamos con el primer circuito de cada una de las capas
                #para mostrarlos cuando cambiemos de capa
                if new_layer:
                    self.first_circuit[name_layer] = text
                    new_layer = False

                #Por último añadiemos el botón a la lista de botones por capa
                self.buttons_layers[name_layer].append(aux_button)
            
            new_layer = True
Ejemplo n.º 2
0
    def __init__(self, game, path_xml):
        '''
        @brief Constructor.
        
        @param game Referencia a game
        @param path_xml Ruta del archivo xml con la configuración
        '''
        basicmenu.BasicMenu.__init__(self, game)

        #Cambiamos el título de la ventana
        pygame.display.set_caption("Zycars: Opciones")

        parse = xml.dom.minidom.parse(data.get_path_xml(path_xml))

        #Obtenemos los elementos básicos del menú
        self.parser_basic_info(parse)

        #Declaramos distintos atributos de la clase
        self.text_layers = {}
        self.elements_layers = {}
        self.buttons_layers = {}
        self.images_layers = {}
        self.actual_layer = None

        #Recorremos las distintas capas que tendrá el menú
        for element in parse.getElementsByTagName('layer'):

            #Obtenemos el nombre de la capa que la indetificará
            name_layer = str(element.getAttribute('name'))
            self.text_layers[name_layer] = []
            self.elements_layers[name_layer] = []
            self.buttons_layers[name_layer] = []
            self.images_layers[name_layer] = {}

            #Fuente que se usará y tamaño de esta
            font_code = str(element.getAttribute('font_code'))
            size = int(element.getAttribute('size'))
            font_temp = resource.get_font(font_code, size)

            #Obtenemos los distintos texto que aparecerán por capa
            for text in element.getElementsByTagName('text'):

                #Obtenemos texto y posición
                value = text.getAttribute('value')
                posx = int(text.getAttribute('x'))
                posy = int(text.getAttribute('y'))

                #Renderizamos
                text_render = font_temp.render(value, True, (0, 0, 0))
                text_render_rect = text_render.get_rect()
                text_render_rect.x = posx
                text_render_rect.y = posy

                #Insertamos en la lista de textos por capa
                self.text_layers[name_layer].append(
                    (text_render, text_render_rect))

            #Obtenemos los distintos objetos que tendrán cada capa
            #En primer lugar obtenemos los slider
            for slider_option in element.getElementsByTagName('slider'):

                #Obtenemos archivo de configuración
                xml_path = str(slider_option.getAttribute('xml_file'))

                #Posición
                x = int(slider_option.getAttribute('x'))
                y = int(slider_option.getAttribute('y'))

                text = str(slider_option.getAttribute('text'))
                value = 0
                if text == 'sonido':
                    value = int(config.Config().get_sound_volume() * 100)
                else:
                    value = int(config.Config().get_music_volume() * 100)
                #Obtenemos el slider
                new_slider = slider.Slider(xml_path, value, 100, x, y, text)

                #Lo introducimos en la lista de sliders
                self.elements_layers[name_layer].append(new_slider)

            for check_box in element.getElementsByTagName('checkbox'):

                xml_file = str(check_box.getAttribute('xml_file'))
                font_code = str(check_box.getAttribute('font'))
                show_text = False
                text = check_box.getAttribute('text')
                image_code = str(check_box.getAttribute('image_code'))
                image_x = int(check_box.getAttribute('image_x'))
                image_y = int(check_box.getAttribute('image_y'))
                x = int(check_box.getAttribute('x'))
                y = int(check_box.getAttribute('y'))

                new_checkbox = checkbox.CheckBox(self, xml_file, text, x, y,
                                                 font_code, image_code,
                                                 image_x, image_y, show_text)
                self.elements_layers[name_layer].append(new_checkbox)

            for button_layer in element.getElementsByTagName('button'):

                #Ruta del archivo xml con la configuración
                xml_file = str(button_layer.getAttribute('xml_file'))

                #Fuente y texto que apareceran en el boton
                font_code = str(button_layer.getAttribute('font'))
                text = button_layer.getAttribute('text')

                x = int(button_layer.getAttribute('x'))
                y = int(button_layer.getAttribute('y'))
                show_text = True

                #Miramos si se indica si se debe mostrar o no el texto
                #en el botón
                if button_layer.hasAttribute('show_text'):
                    show_text = button_layer.getAttribute('show_text')
                    show_text = button.strTobool(show_text)

                aux_button = button.Button(self, xml_file, text, x, y,
                                           font_code, show_text)

                #Lo añadimos a la lista de botones
                self.buttons_layers[name_layer].append(aux_button)

            for image in element.getElementsByTagName('image_layer'):

                image_code = image.getAttribute('image_code')
                x = int(image.getAttribute('x'))
                y = int(image.getAttribute('y'))

                self.images_layers[name_layer][image_code] = \
                                        (resource.get_image(image_code), x, y)

        for chb in self.elements_layers['Pantalla']:
            if config.Config().get_fullscreen():
                chb.set_checked()

        #La capa inicial será la de sonido
        self.actual_layer = "Sonido"
        self.direction = config.Config().get_direction()
        self.pause = 'p' if config.Config().get_pause_key() == \
                                                        pygame.K_p else 'esc'
        self.item = 'space' if config.Config().get_item_key() == \
                                                pygame.K_SPACE else 'enter'
Ejemplo n.º 3
0
    def __init__(self, game, path_xml):
        '''
        @brief Constructor.
        
        @param game Referencia a game
        @param path_xml Ruta del archivo xml con la configuración
        '''
        basicmenu.BasicMenu.__init__(self, game)
        
        #Cambiamos el título de la ventana
        pygame.display.set_caption("Zycars: Opciones")

        parse = xml.dom.minidom.parse(data.get_path_xml(path_xml))
        
        #Obtenemos los elementos básicos del menú
        self.parser_basic_info(parse)
        
        #Declaramos distintos atributos de la clase
        self.text_layers = {}
        self.elements_layers = {}
        self.buttons_layers = {}
        self.images_layers = {}
        self.actual_layer = None
        
        #Recorremos las distintas capas que tendrá el menú
        for element in parse.getElementsByTagName('layer'):
            
            #Obtenemos el nombre de la capa que la indetificará
            name_layer = str(element.getAttribute('name'))
            self.text_layers[name_layer] = []
            self.elements_layers[name_layer] = []
            self.buttons_layers[name_layer] = []
            self.images_layers[name_layer] = {}

            #Fuente que se usará y tamaño de esta
            font_code = str(element.getAttribute('font_code'))
            size = int(element.getAttribute('size'))
            font_temp = resource.get_font(font_code, size)
            
            #Obtenemos los distintos texto que aparecerán por capa
            for text in element.getElementsByTagName('text'):
                
                #Obtenemos texto y posición
                value = text.getAttribute('value')
                posx = int(text.getAttribute('x'))
                posy = int(text.getAttribute('y'))
                
                #Renderizamos
                text_render = font_temp.render(value, True, (0,0,0))
                text_render_rect = text_render.get_rect()
                text_render_rect.x = posx
                text_render_rect.y = posy
                
                #Insertamos en la lista de textos por capa
                self.text_layers[name_layer].append((text_render, 
                                                    text_render_rect))
            
            #Obtenemos los distintos objetos que tendrán cada capa
            #En primer lugar obtenemos los slider
            for slider_option in element.getElementsByTagName('slider'):
                
                #Obtenemos archivo de configuración
                xml_path = str(slider_option.getAttribute('xml_file'))
                
                #Posición
                x = int(slider_option.getAttribute('x'))
                y = int(slider_option.getAttribute('y'))
                
                text = str(slider_option.getAttribute('text'))
                value = 0
                if text == 'sonido':
                    value = int(config.Config().get_sound_volume() * 100)
                else:
                    value = int(config.Config().get_music_volume() * 100)
                #Obtenemos el slider
                new_slider = slider.Slider(xml_path, value, 100, x, y, text)
                
                #Lo introducimos en la lista de sliders
                self.elements_layers[name_layer].append(new_slider)
            
            for check_box in element.getElementsByTagName('checkbox'):
                
                xml_file = str(check_box.getAttribute('xml_file'))
                font_code = str(check_box.getAttribute('font'))
                show_text = False
                text = check_box.getAttribute('text')
                image_code = str(check_box.getAttribute('image_code'))
                image_x = int(check_box.getAttribute('image_x'))
                image_y = int(check_box.getAttribute('image_y'))
                x = int(check_box.getAttribute('x'))
                y = int(check_box.getAttribute('y'))
                
                new_checkbox = checkbox.CheckBox(self, xml_file, text, x, y, 
                                                font_code, image_code, 
                                                image_x, image_y, show_text)
                self.elements_layers[name_layer].append(new_checkbox)
            
            for button_layer in element.getElementsByTagName('button'):
                
                #Ruta del archivo xml con la configuración
                xml_file = str(button_layer.getAttribute('xml_file'))
                
                #Fuente y texto que apareceran en el boton
                font_code = str(button_layer.getAttribute('font'))
                text = button_layer.getAttribute('text')
                
                x = int(button_layer.getAttribute('x'))
                y = int(button_layer.getAttribute('y'))
                show_text = True
                
                #Miramos si se indica si se debe mostrar o no el texto 
                #en el botón
                if button_layer.hasAttribute('show_text'):
                    show_text = button_layer.getAttribute('show_text')
                    show_text = button.strTobool(show_text)
                
                aux_button = button.Button(self, xml_file, text, x, y, 
                                        font_code, show_text)
                    
                #Lo añadimos a la lista de botones
                self.buttons_layers[name_layer].append(aux_button)   
                
            
            for image in element.getElementsByTagName('image_layer'):
                
                image_code = image.getAttribute('image_code')
                x = int(image.getAttribute('x'))
                y = int(image.getAttribute('y'))
                
                self.images_layers[name_layer][image_code] = \
                                        (resource.get_image(image_code), x, y)
            
        for chb in self.elements_layers['Pantalla']:
            if config.Config().get_fullscreen():
                chb.set_checked()
        
        #La capa inicial será la de sonido
        self.actual_layer = "Sonido"
        self.direction = config.Config().get_direction()
        self.pause = 'p' if config.Config().get_pause_key() == \
                                                        pygame.K_p else 'esc'
        self.item = 'space' if config.Config().get_item_key() == \
                                                pygame.K_SPACE else 'enter'
Ejemplo n.º 4
0
 def parser_basic_info(self, parse):
     
     parent = parse.firstChild
     
     image_code = str(parent.getAttribute('background'))
     self.background = resource.get_image(image_code)
     cursor_xml = str(parent.getAttribute('cursor'))
     self.cursor = cursor.Cursor(data.get_path_xml(cursor_xml))
     
     for element in parse.getElementsByTagName('title'):
         font_code = str(element.getAttribute('font'))
         font_size = int(element.getAttribute('size'))
         font = resource.get_font(font_code, font_size)
         text = element.getAttribute('text')
         r = int(element.getAttribute('r'))
         g = int(element.getAttribute('g'))
         b = int(element.getAttribute('b'))
         color = (r, g, b)
         self.title = font.render(text, True, color)
         self.title_rect = self.title.get_rect()
         self.title_rect.x = int(element.getAttribute('x'))
         self.title_rect.y = int(element.getAttribute('y'))
     
     for element in parse.getElementsByTagName('image'):
         image_code = str(element.getAttribute('image_code'))
         image = resource.get_image(image_code)
         
         if element.hasAttribute('scale'):
             scale = float(element.getAttribute('scale'))
             if scale != 1:
                 temporal = image.copy()
                 image = pygame.transform.rotozoom(temporal, 0, scale)
             
         rect = image.get_rect()
         rect.x = int(element.getAttribute('x'))
         rect.y = int(element.getAttribute('y'))
         self.images.append((image_code, image, rect))
     
     for element in parse.getElementsByTagName('option'):
         xml_file = str(element.getAttribute('xml_file'))
         font_code = str(element.getAttribute('font'))
         text = element.getAttribute('text')
         x = int(element.getAttribute('x'))
         y = int(element.getAttribute('y'))
         show_text = True
         
         if element.hasAttribute('show_text'):
             show_text = element.getAttribute('show_text')
             show_text = button.strTobool(show_text)
         
         type_button = 'normal'
         
         if element.hasAttribute('type'):
             type_button = str(element.getAttribute('type'))
         
         image_button = None
         
         if type_button == 'normal':
             aux_button = button.Button(xml_file, text, x, y, font_code, show_text, True)
         elif type_button == 'image_button':
             image_code = str(element.getAttribute('image'))
             image_x = int(element.getAttribute('image_x'))
             image_y = int(element.getAttribute('image_y'))
             aux_button = imagebutton.ImageButton(xml_file, text, x, y, font_code, image_code, image_x, image_y, show_text, True)
             
         self.buttons.append(aux_button)
Ejemplo n.º 5
0
 def parser_basic_info(self, parse):
     '''
     @brief Método que parsea los componentes básicos del menú
     
     @param parse Archivo xml parsea com xml.dom.minidom
     '''
     parent = parse.firstChild
     
     #Obtenemos la imagen de fondo
     image_code = str(parent.getAttribute('background'))
     self.background = resource.get_image(image_code)
     
     #Obtenemos el cursor del menú
     #cursor_xml = str(parent.getAttribute('cursor'))
     #self.cursor = cursor.Cursor(data.get_path_xml(cursor_xml))
     self.cursor = cursor.Cursor()
     
     self.music_file = None
     if parent.hasAttribute('music'):
         self.music_file = str(parent.getAttribute('music'))
     
     #Obtenemos el titulo del menú
     for element in parse.getElementsByTagName('title'):
         #Obtenemos tamaño y fuente
         font_code = str(element.getAttribute('font'))
         font_size = int(element.getAttribute('size'))
         self.font = resource.get_font(font_code, font_size)
         text = element.getAttribute('text')
         
         #Colores
         r = int(element.getAttribute('r'))
         g = int(element.getAttribute('g'))
         b = int(element.getAttribute('b'))
         color = (r, g, b)
         
         #Renderizamos
         self.title = self.font.render(text, True, color)
         
         #Obtenemos la posición
         self.title_rect = self.title.get_rect()
         self.title_rect.x = int(element.getAttribute('x'))
         self.title_rect.y = int(element.getAttribute('y'))
     
     #Obtenemos todas las imagenes que aparecen
     for element in parse.getElementsByTagName('image'):
         
         #Obtenemos la imagen
         image_code = str(element.getAttribute('image_code'))
         image = resource.get_image(image_code)
         
         #Si la imagen tiene el atributo scale
         if element.hasAttribute('scale'):
             #Escalamos la imagen
             scale = float(element.getAttribute('scale'))
             if scale != 1:
                 temporal = image.copy()
                 image = pygame.transform.rotozoom(temporal, 0, scale)
         
         #Obtenemos la posición de la imagen
         rect = image.get_rect()
         rect.x = int(element.getAttribute('x'))
         rect.y = int(element.getAttribute('y'))
         
         #La incluimos en la lista de imagenes
         self.images.append((image_code, image, rect))
     
     #Obtenemos los distintos botones del menú
     for element in parse.getElementsByTagName('option'):
         
         #Ruta del archivo xml con la configuración
         xml_file = str(element.getAttribute('xml_file'))
         
         #Fuente y texto que apareceran en el boton
         font_code = str(element.getAttribute('font'))
         text = element.getAttribute('text')
         
         
         x = int(element.getAttribute('x'))
         y = int(element.getAttribute('y'))
         show_text = True
         
         #Miramos si se indica si se debe mostrar o no el texto en el botón
         if element.hasAttribute('show_text'):
             show_text = element.getAttribute('show_text')
             show_text = button.strTobool(show_text)
         
         type_button = 'normal'
         
         #Obtenemos el tipo de boton
         if element.hasAttribute('type'):
             type_button = str(element.getAttribute('type'))
                     
         #Según el tipo de boton obtendremos un boton u otro
         if type_button == 'normal':
             aux_button = button.Button(self, xml_file, text, x, y, 
                                 font_code, show_text)
                                 
         elif type_button == 'image_button':
             image_code = str(element.getAttribute('image'))
             image_x = int(element.getAttribute('image_x'))
             image_y = int(element.getAttribute('image_y'))
             aux_button = imagebutton.ImageButton(self, xml_file, text, x, 
                                                 y, font_code, image_code, 
                                                 image_x, image_y, 
                                                 show_text)
         
         #Lo añadimos a la lista de botones
         self.buttons.append(aux_button)