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
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'
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'
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)
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)