Пример #1
0
    def __init__(self, window, clock, world, lang, view_config, menus):
        """
        Función constructora
        :param window: Ventana de la aplicación
        :param clock: Reloj de pygame
        :param world: Mundo lógico
        :param lang: Diccionario de idiomas
        :param view_config: Configuraciones de la vista
        :param menus: Menues del juego
        :return: void
        """

        # Se guardan los parametros
        self.config = view_config  # configuracion de la vista
        self.controller = None  # controlador
        self.lang = lang  # idiomas
        self.map = world.get_actual_map()  # mapa actual
        self.menu = menus  # menus del juego
        self.window = window  # ventana
        self.world = world  # mundo
        if self.map is None:
            self.isPlaying = False
        else:
            self.isPlaying = True
        # Se cargan configuraciones
        self.mark_ground_size = int(view_config.getValue(
            "GROUND_MARK_SIZE"))  # ancho de la marca en la tierra
        self.mark_track_size = int(view_config.getValue(
            "TRACK_MARK_SIZE"))  # ancho de la marca en la pista
        self.show_fps = view_config.isTrue(
            "SHOWFPS")  # define si se dibuja el fps en el titulo de la ventana
        self.show_ghost = view_config.isTrue(
            "SHOWGHOST")  # define si se dibuja al ghost o no
        self.show_mark_ground = view_config.isTrue(
            "SHOWMARKGROUND")  # define si se muestran las marcas en la tierra
        self.show_mark_track = view_config.isTrue(
            "SHOWMARKTRACK")  # define si se muestran las marcas en el camino
        self.show_player = view_config.isTrue(
            "SHOWPLAYER")  # se define si se dibuja o no el jugador en pantalla
        self.show_ruedas = view_config.isTrue(
            "SHOWRUEDAS")  # define si se dibujan las ruedas o no
        self.show_track = view_config.isTrue(
            "SHOWTRACK")  # define si se muestra la pista o no
        self.show_ui = view_config.isTrue(
            "SHOWUI")  # se define si se dibujan los paneles
        self.viewConfig = view_config  # configuraciones de la vista
        # Se defienen variables
        self.clock = clock  # reloj del juego
        self.screen = self.window.get_surface()  # superficie de dibujo
        self.windowHeight = self.window.get_window_height()  # alto de la ventana
        self.windowWidth = self.window.get_window_width()  # ancho de la ventana
        # Se crean objetos del HUD
        self.OutOfRoadFont = pygame.font.Font(getFonts("speed"),
                                              20)  # fuente fuera de la pista
        self.buttonsResultsFont = pygame.font.Font(getFonts("menu"),
                                                   20)  # fuentes de los botones de la ventana de resultados
        self.lapFont = pygame.font.Font(getFonts("lap"),
                                        40)  # fuente del contador de vueltas
        self.lapFontL = pygame.font.Font(getFonts("lap"),
                                         38)  # fuente del contador de vueltas
        self.lapPos = (self.windowWidth * 0.90,
                       self.windowHeight * 0.05)  # posición del cuenta-vueltas
        self.lapRect = pygame.image.load(
            getImages("lap_rect")).convert_alpha()  # recuadro de las vueltas
        self.lapTimeFont = pygame.font.Font(getFonts("speed"),
                                            20)  # fuente del contador de tiempo
        self.lapTimePos = (self.windowWidth * 0.03,
                           self.windowHeight * 0.05)  # posición del tiempo total
        self.posOutOfRoad = (
            self.windowWidth * 0.5 - 100,
            self.windowHeight * 0.95)  # posición del mensaje -fuera de la pista-
        self.resultsButtonNextPos = (
            int((self.windowWidth + 680) / 2) - 15, int(
                (
                    self.windowHeight + 400) / 2) - 5)  # posicion del boton siguiente del plano de resultados
        self.resultsButtonQuitPos = (
            int((self.windowWidth - 680) / 2) + 15, int(
                (
                    self.windowHeight + 400) / 2) - 5)  # posicion del boton cerrar del plano de resultados
        self.resultsFontTitle = pygame.font.Font(getFonts("speed"),
                                                 30)  # fuente de los resultados
        self.resultsFontTitleContent = pygame.font.Font(getFonts("speed"),
                                                        14)  # fuente del contenido de la pantalla resultados
        self.resultsFontTitleSubtl = pygame.font.Font(getFonts("speed"),
                                                      20)  # fuente del subtitulo de la pantalla resultados
        self.resultsFontTitleSubtl2 = pygame.font.Font(getFonts("speed"),
                                                       17)  # fuente del subtitulo de la pantalla resultados
        self.resultsFontTitleTrack = pygame.font.Font(getFonts("speed"),
                                                      20)  # fuente del titulo de la pista de la pantalla resultados
        self.resultsScreen = pygame.image.load(
            getImages("results")).convert_alpha()  # pantalla de resultados
        self.resultsScreenPos = (int((self.windowWidth - 680) / 2),
                                 int((
                                         self.windowHeight - 400) / 2) - 25)  # posición en pantalla de los resultados
        self.revolPos = (self.windowWidth - 20,
                         self.windowHeight - 60)  # posición del cuenta-revoluciones
        self.revolRect = pygame.image.load(
            getImages(
                "revol_shadowed")).convert_alpha()  # textura del cuenta-revoluciones
        self.speedFont = pygame.font.Font(getFonts("speed"),
                                          40)  # fuente de los cambios
        self.speedPos = (
            20, self.windowHeight - 60)  # posición del velocimetro
        self.speedRect = pygame.image.load(getImages(
            "velocimeter_shadowed")).convert_alpha()  # textura del velocimetro
        # Objetos del HUD dependientes
        self.revolGraph = Revolgraph(33, (
            self.revolPos[0] - 170, self.revolPos[1] + 7), 100,
                                     40)  # gráfico de las revoluciones
Пример #2
0
class View(object):
    """Vista de la aplicación"""

    def __init__(self, window, clock, world, lang, view_config, menus):
        """
        Función constructora
        :param window: Ventana de la aplicación
        :param clock: Reloj de pygame
        :param world: Mundo lógico
        :param lang: Diccionario de idiomas
        :param view_config: Configuraciones de la vista
        :param menus: Menues del juego
        :return: void
        """

        # Se guardan los parametros
        self.config = view_config  # configuracion de la vista
        self.controller = None  # controlador
        self.lang = lang  # idiomas
        self.map = world.get_actual_map()  # mapa actual
        self.menu = menus  # menus del juego
        self.window = window  # ventana
        self.world = world  # mundo
        if self.map is None:
            self.isPlaying = False
        else:
            self.isPlaying = True
        # Se cargan configuraciones
        self.mark_ground_size = int(view_config.getValue(
            "GROUND_MARK_SIZE"))  # ancho de la marca en la tierra
        self.mark_track_size = int(view_config.getValue(
            "TRACK_MARK_SIZE"))  # ancho de la marca en la pista
        self.show_fps = view_config.isTrue(
            "SHOWFPS")  # define si se dibuja el fps en el titulo de la ventana
        self.show_ghost = view_config.isTrue(
            "SHOWGHOST")  # define si se dibuja al ghost o no
        self.show_mark_ground = view_config.isTrue(
            "SHOWMARKGROUND")  # define si se muestran las marcas en la tierra
        self.show_mark_track = view_config.isTrue(
            "SHOWMARKTRACK")  # define si se muestran las marcas en el camino
        self.show_player = view_config.isTrue(
            "SHOWPLAYER")  # se define si se dibuja o no el jugador en pantalla
        self.show_ruedas = view_config.isTrue(
            "SHOWRUEDAS")  # define si se dibujan las ruedas o no
        self.show_track = view_config.isTrue(
            "SHOWTRACK")  # define si se muestra la pista o no
        self.show_ui = view_config.isTrue(
            "SHOWUI")  # se define si se dibujan los paneles
        self.viewConfig = view_config  # configuraciones de la vista
        # Se defienen variables
        self.clock = clock  # reloj del juego
        self.screen = self.window.get_surface()  # superficie de dibujo
        self.windowHeight = self.window.get_window_height()  # alto de la ventana
        self.windowWidth = self.window.get_window_width()  # ancho de la ventana
        # Se crean objetos del HUD
        self.OutOfRoadFont = pygame.font.Font(getFonts("speed"),
                                              20)  # fuente fuera de la pista
        self.buttonsResultsFont = pygame.font.Font(getFonts("menu"),
                                                   20)  # fuentes de los botones de la ventana de resultados
        self.lapFont = pygame.font.Font(getFonts("lap"),
                                        40)  # fuente del contador de vueltas
        self.lapFontL = pygame.font.Font(getFonts("lap"),
                                         38)  # fuente del contador de vueltas
        self.lapPos = (self.windowWidth * 0.90,
                       self.windowHeight * 0.05)  # posición del cuenta-vueltas
        self.lapRect = pygame.image.load(
            getImages("lap_rect")).convert_alpha()  # recuadro de las vueltas
        self.lapTimeFont = pygame.font.Font(getFonts("speed"),
                                            20)  # fuente del contador de tiempo
        self.lapTimePos = (self.windowWidth * 0.03,
                           self.windowHeight * 0.05)  # posición del tiempo total
        self.posOutOfRoad = (
            self.windowWidth * 0.5 - 100,
            self.windowHeight * 0.95)  # posición del mensaje -fuera de la pista-
        self.resultsButtonNextPos = (
            int((self.windowWidth + 680) / 2) - 15, int(
                (
                    self.windowHeight + 400) / 2) - 5)  # posicion del boton siguiente del plano de resultados
        self.resultsButtonQuitPos = (
            int((self.windowWidth - 680) / 2) + 15, int(
                (
                    self.windowHeight + 400) / 2) - 5)  # posicion del boton cerrar del plano de resultados
        self.resultsFontTitle = pygame.font.Font(getFonts("speed"),
                                                 30)  # fuente de los resultados
        self.resultsFontTitleContent = pygame.font.Font(getFonts("speed"),
                                                        14)  # fuente del contenido de la pantalla resultados
        self.resultsFontTitleSubtl = pygame.font.Font(getFonts("speed"),
                                                      20)  # fuente del subtitulo de la pantalla resultados
        self.resultsFontTitleSubtl2 = pygame.font.Font(getFonts("speed"),
                                                       17)  # fuente del subtitulo de la pantalla resultados
        self.resultsFontTitleTrack = pygame.font.Font(getFonts("speed"),
                                                      20)  # fuente del titulo de la pista de la pantalla resultados
        self.resultsScreen = pygame.image.load(
            getImages("results")).convert_alpha()  # pantalla de resultados
        self.resultsScreenPos = (int((self.windowWidth - 680) / 2),
                                 int((
                                         self.windowHeight - 400) / 2) - 25)  # posición en pantalla de los resultados
        self.revolPos = (self.windowWidth - 20,
                         self.windowHeight - 60)  # posición del cuenta-revoluciones
        self.revolRect = pygame.image.load(
            getImages(
                "revol_shadowed")).convert_alpha()  # textura del cuenta-revoluciones
        self.speedFont = pygame.font.Font(getFonts("speed"),
                                          40)  # fuente de los cambios
        self.speedPos = (
            20, self.windowHeight - 60)  # posición del velocimetro
        self.speedRect = pygame.image.load(getImages(
            "velocimeter_shadowed")).convert_alpha()  # textura del velocimetro
        # Objetos del HUD dependientes
        self.revolGraph = Revolgraph(33, (
            self.revolPos[0] - 170, self.revolPos[1] + 7), 100,
                                     40)  # gráfico de las revoluciones

    def add_controller(self, controller):
        """
        Añade un controlador
        :param controller: Objeto <controller>
        :return: void
        """
        self.controller = controller

    def draw(self, state):
        """
        Dibuja en pantalla
        :param state: Estado del controlador (string)
        :return: void
        """
        time = float(
            self.clock.get_time()) / 1000.0  # tiempo que tomo el frame en generarse
        # Si la opcion de mostrar fps esta habilitada
        if self.show_fps:
            self.window.set_window_title(self.lang.get(10) + " - FPS: " + str(
                int(self.clock.get_fps())))
        # Si se encuentra jugando
        if state == STATE_PLAY and self.isPlaying:
            # Se obtiene la posición de la cámara
            camera_pos = self.map.getPlayer().get_pos()
            camera_rel_pos = self.map.getPlayer().get_relative_pos()
            # Se redibuja el fondo
            bg_size = self.map.getBackgroundSize()
            defaultx = self.map.getMapLimits()[0]
            max_x = self.map.getMapLimits()[2]
            max_y = self.map.getMapLimits()[3]
            y = self.map.getMapLimits()[1]
            fondo = self.map.getBackground()
            while True:
                x = defaultx
                while True:
                    drawx = -camera_rel_pos[0] + x
                    drawy = -camera_rel_pos[1] + y
                    if -bg_size[0] < drawx < self.windowWidth and -bg_size[
                        1] < drawy < self.windowHeight:  # si se ve en la pantalla se dibuja
                        self.screen.blit(fondo, (drawx, drawy))
                    x += bg_size[0]
                    if x >= max_x:
                        break
                y += bg_size[1]
                if y >= max_y:
                    break
            # Se dibujan las marcas del terreno
            if self.show_mark_ground:
                for marca_tierra in self.map.getMarcasTierra():
                    pos_ini = marca_tierra[0]
                    pos_fin = marca_tierra[1]
                    drawxini = (-self.windowWidth / 2 + camera_pos[0]) + \
                               pos_ini[0]
                    drawyini = (-self.windowHeight + camera_pos[1]) + pos_ini[
                        1] + 300
                    drawxfin = (-self.windowWidth / 2 + camera_pos[0]) + \
                               pos_fin[0]
                    drawyfin = (-self.windowHeight + camera_pos[1]) + pos_fin[
                        1] + 300
                    if (
                                        0 <= drawxini <= self.windowWidth and 0 <= drawyini <= self.windowHeight) or \
                            (
                                                0 <= drawxfin <= self.windowWidth and 0 <= drawyfin <= self.windowHeight):
                        pygame.draw.line(self.screen, marca_tierra[2],
                                         (drawxini, drawyini),
                                         (drawxfin, drawyfin),
                                         self.mark_ground_size)
            # Se dibujan las pistas
            if self.show_track:
                for track in self.map.getTrack():
                    track.draw(self.screen, self.window, camera_pos)
            # Se dibujan las marcas sobre la pista
            if self.show_mark_track:
                for marca_camino in self.map.getMarcasFrenado():
                    pos_ini = marca_camino[0]
                    pos_fin = marca_camino[1]
                    drawxini = (-self.windowWidth / 2 + camera_pos[0]) + \
                               pos_ini[0]
                    drawyini = (-self.windowHeight + camera_pos[1]) + pos_ini[
                        1] + 300
                    drawxfin = (-self.windowWidth / 2 + camera_pos[0]) + \
                               pos_fin[0]
                    drawyfin = (-self.windowHeight + camera_pos[1]) + pos_fin[
                        1] + 300
                    if (
                                        0 <= drawxini <= self.windowWidth and 0 <= drawyini <= self.windowHeight) or \
                            (
                                                0 <= drawxfin <= self.windowWidth and 0 <= drawyfin <= self.windowHeight):
                        pygame.draw.line(self.screen, marca_camino[2],
                                         (drawxini, drawyini),
                                         (drawxfin, drawyfin),
                                         self.mark_track_size)
            # Si no se ha terminado la pista
            if not self.map.getPlayer().finished_lap():
                # Se dibuja el jugador
                if self.show_player:
                    self.map.getPlayer().collide(self.screen, time)
                    message = self.map.getPlayer().draw(self.screen, time,
                                                        True, self.window,
                                                        draw_ruedas=self.show_ruedas,
                                                        show_ghost=self.show_ghost)
                else:
                    message = STATE_NULL
                # Se dibujan las decoraciones
                for decoration in self.map.getDecorations():
                    decoration.draw(self.screen, self.window, camera_pos)
                # Se dibuja la ui
                if self.show_ui:
                    # Se dibuja la velocidad actual
                    self.screen.blit(self.speedRect, (
                        self.speedPos[0] - 300, self.speedPos[1] - 50))
                    self.screen.blit(self.speedFont.render(
                        str(self.map.getPlayer().get_vel_kph()), 1,
                        COLOR_VELOCIMETER),
                        (self.speedPos[0] - 10,
                         self.speedPos[1] + 10))
                    self.screen.blit(
                        self.speedFont.render(METRICS, 1, COLOR_VELOCIMETER),
                        (self.speedPos[0] + 60, self.speedPos[1] + 10))
                    # Se dibujan las revoluciones
                    self.screen.blit(self.revolRect, (
                        self.revolPos[0] - 210, self.revolPos[1] - 50))
                    self.revolGraph.draw(self.screen,
                                         self.map.player.get_revl())
                    # Se dibuja el cambio
                    cambio = self.map.player.get_cambio()
                    if cambio == 0:
                        cambio = CAMBIO_NEUTRO
                    elif cambio < 0:
                        cambio = CAMBIO_REVERSA
                    else:
                        cambio = str(cambio)
                    self.screen.blit(
                        self.speedFont.render(cambio, 1, COLOR_VELOCIMETER),
                        (self.revolPos[0] - 20, self.revolPos[1] + 10))
                    # Se dibuja la vuelta actual
                    self.screen.blit(self.lapRect, (
                        self.lapPos[0] - 120, self.lapPos[1] - 8))
                    self.screen.blit(self.lapFont.render(self.lang.get(11), 1,
                                                         COLOR_VELOCIMETER),
                                     (self.lapPos[0] - 115, self.lapPos[1]))
                    self.screen.blit(
                        self.lapFontL.render(
                            str(self.map.player.get_lap_pos()) + "/" + str(
                                self.map.getLaps()), 1,
                            COLOR_VELOCIMETER),
                        (self.lapPos[0] - 12, self.lapPos[1]))
                    # Dibuja el tiempo de vuelta
                    self.screen.blit(
                        self.lapTimeFont.render(self.lang.get(
                            12) + " " * 6 + self.map.getPlayer().get_lap_time(),
                                                1,
                                                COLOR_VELOCIMETER),
                        (self.lapPos[0] - 121, self.lapPos[1] + 40))
                    # Se dibujan los objetivos
                    k = 0
                    if self.map.player.get_lap_pos() == 1:
                        for obj in self.map.getPlayer().get_track_objetives():
                            if k == 0:
                                self.screen.blit(
                                    self.lapTimeFont.render(self.lang.get(19,
                                                                          self.map.getPlayer().get_lap_time(
                                                                              obj)),
                                                            1,
                                                            COLOR_ORO),
                                    (20, 20 + 29 * k))
                                if self.map.getPlayer().get_lap_time_no_format() > obj:
                                    pygame.draw.line(self.screen, COLOR_ALERT,
                                                     (17, 31 + 29 * k),
                                                     (155, 31 + 29 * k), 3)
                            if k == 1:
                                self.screen.blit(
                                    self.lapTimeFont.render(self.lang.get(20,
                                                                          self.map.getPlayer().get_lap_time(
                                                                              obj)),
                                                            1,
                                                            COLOR_PLATA),
                                    (20, 20 + 29 * k))
                                if self.map.getPlayer().get_lap_time_no_format() > obj:
                                    pygame.draw.line(self.screen, COLOR_ALERT,
                                                     (17, 31 + 29 * k),
                                                     (175, 31 + 29 * k), 3)
                            if k == 2:
                                self.screen.blit(
                                    self.lapTimeFont.render(self.lang.get(21,
                                                                          self.map.getPlayer().get_lap_time(
                                                                              obj)),
                                                            1,
                                                            COLOR_BRONCE),
                                    (20, 20 + 29 * k))
                                if self.map.getPlayer().get_lap_time_no_format() > obj:
                                    pygame.draw.line(self.screen, COLOR_ALERT,
                                                     (17, 31 + 29 * k),
                                                     (195, 31 + 29 * k), 3)
                            k += 1
                    else:
                        for obj in self.map.getPlayer().get_track_objetives():
                            if k == 0:
                                if self.map.getPlayer().get_fast_lap()[
                                    1] < obj:
                                    self.screen.blit(self.lapTimeFont.render(
                                        self.lang.get(19, self.lang.get(46)),
                                        1,
                                        COLOR_RESULT_LINE), (20, 20 + 29 * k))
                                else:
                                    self.screen.blit(
                                        self.lapTimeFont.render(
                                            self.lang.get(19,
                                                          self.map.getPlayer().get_lap_time(
                                                              obj)),
                                            1, COLOR_ORO), (20, 20 + 29 * k))
                                    if self.map.getPlayer().get_lap_time_no_format() > obj:
                                        pygame.draw.line(self.screen,
                                                         COLOR_ALERT,
                                                         (17, 31 + 29 * k),
                                                         (155, 31 + 29 * k), 3)
                            if k == 1:
                                if self.map.getPlayer().get_fast_lap()[
                                    1] < obj:
                                    self.screen.blit(self.lapTimeFont.render(
                                        self.lang.get(20, self.lang.get(46)),
                                        1,
                                        COLOR_RESULT_LINE), (20, 20 + 29 * k))
                                else:
                                    self.screen.blit(
                                        self.lapTimeFont.render(
                                            self.lang.get(20,
                                                          self.map.getPlayer().get_lap_time(
                                                              obj)),
                                            1, COLOR_PLATA), (20, 20 + 29 * k))
                                    if self.map.getPlayer().get_lap_time_no_format() > obj:
                                        pygame.draw.line(self.screen,
                                                         COLOR_ALERT,
                                                         (17, 31 + 29 * k),
                                                         (155, 31 + 29 * k), 3)
                            if k == 2:
                                if self.map.getPlayer().get_fast_lap()[
                                    1] < obj:
                                    self.screen.blit(self.lapTimeFont.render(
                                        self.lang.get(21, self.lang.get(46)),
                                        1,
                                        COLOR_RESULT_LINE), (20, 20 + 29 * k))
                                else:
                                    self.screen.blit(
                                        self.lapTimeFont.render(
                                            self.lang.get(21,
                                                          self.map.getPlayer().get_lap_time(
                                                              obj)),
                                            1, COLOR_BRONCE),
                                        (20, 20 + 29 * k))
                                    if self.map.getPlayer().get_lap_time_no_format() > obj:
                                        pygame.draw.line(self.screen,
                                                         COLOR_ALERT,
                                                         (17, 31 + 29 * k),
                                                         (155, 31 + 29 * k), 3)
                            k += 1
                    # Se escriben los mensajes enviados por draw
                    red = False
                    if message == STATE_OFFROAD:
                        self.screen.blit(
                            self.OutOfRoadFont.render(self.lang.get(13), 1,
                                                      COLOR_ALERT),
                            self.posOutOfRoad)
                        red = True
                    elif message == STATE_INVALIDPOS:
                        self.screen.blit(
                            self.OutOfRoadFont.render(self.lang.get(14), 1,
                                                      COLOR_ALERT),
                            (self.posOutOfRoad[0] - 67, self.posOutOfRoad[1]))
                        red = True
                    elif message == STATE_WRONGWAY:
                        self.screen.blit(
                            self.OutOfRoadFont.render(self.lang.get(15), 1,
                                                      COLOR_ALERT),
                            (self.posOutOfRoad[0] - 25, self.posOutOfRoad[1]))
                        red = True
                    # Si la vuelta es valida se escribe el tiempo en blanco
                    if not red:
                        self.screen.blit(
                            self.lapTimeFont.render(self.lang.get(
                                12) + " " * 6 + self.map.getPlayer().get_lap_time(),
                                                    1,
                                                    COLOR_VELOCIMETER),
                            (self.lapPos[0] - 121, self.lapPos[1] + 40))
                    else:
                        self.screen.blit(
                            self.lapTimeFont.render(self.lang.get(
                                12) + " " * 6 + self.map.getPlayer().get_lap_time(),
                                                    1,
                                                    COLOR_ALERT),
                            (self.lapPos[0] - 121, self.lapPos[1] + 40))
            # Si ya termino la pista se muestran los resultados
            else:
                # Se dibuja al jugador sin actualizar
                self.map.getPlayer().draw(self.screen, time, False,
                                          self.window, draw_ruedas=False,
                                          show_ghost=True)
                # Se dibuja el recuadro de resultados
                self.screen.blit(self.resultsScreen, self.resultsScreenPos)
                self.screen.blit(
                    self.resultsFontTitle.render(self.lang.get(16), 1,
                                                 COLOR_VELOCIMETER),
                    (self.resultsScreenPos[0] + 10,
                     self.resultsScreenPos[1] + 17))
                self.screen.blit(self.resultsFontTitleTrack.render(
                    self.lang.get(17) + self.map.getTrackTitle(), 1,
                    COLOR_VELOCIMETER),
                    (self.resultsScreenPos[0] + 223,
                     self.resultsScreenPos[1] + 35))
                self.screen.blit(
                    self.resultsFontTitleSubtl.render(self.lang.get(18), 1,
                                                      COLOR_VELOCIMETER),
                    (self.resultsScreenPos[0] + 49,
                     self.resultsScreenPos[1] + 70))
                pygame.draw.line(self.screen, COLOR_RESULT_LINE,
                                 (self.resultsScreenPos[0] + 191,
                                  self.resultsScreenPos[1] + 62),
                                 (self.resultsScreenPos[0] + 191,
                                  self.resultsScreenPos[1] + 399))
                pygame.draw.line(self.screen, COLOR_RESULT_LINE,
                                 (self.resultsScreenPos[0] + 191,
                                  self.resultsScreenPos[1] + 62),
                                 (self.resultsScreenPos[0] + 679,
                                  self.resultsScreenPos[1] + 62))
                pygame.draw.line(self.screen, COLOR_RESULT_LINE,
                                 (self.resultsScreenPos[0] + 191,
                                  self.resultsScreenPos[1] + 62),
                                 (self.resultsScreenPos[0] + 191,
                                  self.resultsScreenPos[1] + 399))
                pygame.draw.line(self.screen, COLOR_RESULT_LINE,
                                 (self.resultsScreenPos[0] + 433,
                                  self.resultsScreenPos[1] + 62),
                                 (self.resultsScreenPos[0] + 433,
                                  self.resultsScreenPos[1] + 399))
                # Tipo de auto
                self.screen.blit(
                    self.resultsFontTitleSubtl2.render(self.lang.get(42), 1,
                                                       COLOR_VELOCIMETER),
                    (self.resultsScreenPos[0] + 470,
                     self.resultsScreenPos[1] + 38))
                tipo = self.map.getPlayer().get_type()
                if tipo == 1:
                    self.screen.blit(
                        self.resultsFontTitleSubtl2.render(self.lang.get(43),
                                                           1,
                                                           COLOR_VELOCIMETER),
                        (self.resultsScreenPos[0] + 590,
                         self.resultsScreenPos[1] + 38))
                elif tipo == 2:
                    self.screen.blit(
                        self.resultsFontTitleSubtl2.render(self.lang.get(44),
                                                           1,
                                                           COLOR_VELOCIMETER),
                        (self.resultsScreenPos[0] + 590,
                         self.resultsScreenPos[1] + 38))
                elif tipo == 3:
                    self.screen.blit(
                        self.resultsFontTitleSubtl2.render(self.lang.get(45),
                                                           1,
                                                           COLOR_VELOCIMETER),
                        (self.resultsScreenPos[0] + 590,
                         self.resultsScreenPos[1] + 38))
                # Resultados
                tiempo = self.map.getPlayer().get_fast_lap()[1]
                oro = self.map.getPlayer().get_track_objetives()[0]
                plata = self.map.getPlayer().get_track_objetives()[1]
                bronce = self.map.getPlayer().get_track_objetives()[2]
                self.screen.blit(
                    self.resultsFontTitleSubtl2.render(self.lang.get(19, ""),
                                                       1, COLOR_ORO),
                    (self.resultsScreenPos[0] + 10,
                     self.resultsScreenPos[1] + 118))
                self.screen.blit(
                    self.resultsFontTitleSubtl2.render(self.lang.get(20, ""),
                                                       1, COLOR_PLATA),
                    (self.resultsScreenPos[0] + 10,
                     self.resultsScreenPos[1] + 178))
                self.screen.blit(
                    self.resultsFontTitleSubtl2.render(self.lang.get(21, ""),
                                                       1, COLOR_BRONCE),
                    (self.resultsScreenPos[0] + 10,
                     self.resultsScreenPos[1] + 238))
                if tiempo < oro:
                    self.screen.blit(
                        self.resultsFontTitleSubtl2.render(self.lang.get(46),
                                                           1, COLOR_COMPLETED),
                        (self.resultsScreenPos[0] + 50,
                         self.resultsScreenPos[1] + 118))
                    self.screen.blit(self.resultsFontTitleSubtl2.render(
                        self.lang.get(48, self.map.getPlayer().get_lap_time(
                            oro - tiempo)), 1, COLOR_COMPLETED),
                        (self.resultsScreenPos[0] + 50,
                         self.resultsScreenPos[1] + 138))
                else:
                    self.screen.blit(
                        self.resultsFontTitleSubtl2.render(self.lang.get(47),
                                                           1, COLOR_ALERT),
                        (self.resultsScreenPos[0] + 50,
                         self.resultsScreenPos[1] + 118))
                    self.screen.blit(self.resultsFontTitleSubtl2.render(
                        self.lang.get(49, self.map.getPlayer().get_lap_time(
                            tiempo - oro)), 1, COLOR_ALERT),
                        (self.resultsScreenPos[0] + 50,
                         self.resultsScreenPos[1] + 138))
                if tiempo < plata:
                    self.screen.blit(
                        self.resultsFontTitleSubtl2.render(self.lang.get(46),
                                                           1, COLOR_COMPLETED),
                        (self.resultsScreenPos[0] + 63,
                         self.resultsScreenPos[1] + 178))
                    self.screen.blit(self.resultsFontTitleSubtl2.render(
                        self.lang.get(48, self.map.getPlayer().get_lap_time(
                            plata - tiempo)), 1, COLOR_COMPLETED),
                        (self.resultsScreenPos[0] + 50,
                         self.resultsScreenPos[1] + 198))
                else:
                    self.screen.blit(
                        self.resultsFontTitleSubtl2.render(self.lang.get(47),
                                                           1, COLOR_ALERT),
                        (self.resultsScreenPos[0] + 63,
                         self.resultsScreenPos[1] + 178))
                    self.screen.blit(self.resultsFontTitleSubtl2.render(
                        self.lang.get(49, self.map.getPlayer().get_lap_time(
                            tiempo - plata)), 1, COLOR_ALERT),
                        (self.resultsScreenPos[0] + 50,
                         self.resultsScreenPos[1] + 198))
                if tiempo < bronce:
                    self.screen.blit(
                        self.resultsFontTitleSubtl2.render(self.lang.get(46),
                                                           1, COLOR_COMPLETED),
                        (self.resultsScreenPos[0] + 83,
                         self.resultsScreenPos[1] + 238))
                    self.screen.blit(self.resultsFontTitleSubtl2.render(
                        self.lang.get(48, self.map.getPlayer().get_lap_time(
                            bronce - tiempo)), 1, COLOR_COMPLETED),
                        (self.resultsScreenPos[0] + 50,
                         self.resultsScreenPos[1] + 258))
                else:
                    self.screen.blit(
                        self.resultsFontTitleSubtl2.render(self.lang.get(47),
                                                           1, COLOR_ALERT),
                        (self.resultsScreenPos[0] + 83,
                         self.resultsScreenPos[1] + 238))
                    self.screen.blit(self.resultsFontTitleSubtl2.render(
                        self.lang.get(49, self.map.getPlayer().get_lap_time(
                            tiempo - bronce)), 1, COLOR_ALERT),
                        (self.resultsScreenPos[0] + 50,
                         self.resultsScreenPos[1] + 258))
                # Estadisticas
                self.screen.blit(
                    self.resultsFontTitleSubtl.render(self.lang.get(31), 1,
                                                      COLOR_VELOCIMETER),
                    (self.resultsScreenPos[0] + 247,
                     self.resultsScreenPos[1] + 70))
                self.screen.blit(
                    self.resultsFontTitleSubtl.render(self.lang.get(28), 1,
                                                      COLOR_VELOCIMETER),
                    (self.resultsScreenPos[0] + 492,
                     self.resultsScreenPos[1] + 70))
                self.screen.blit(self.resultsFontTitleContent.render(
                    self.lang.get(22, self.map.getPlayer().get_lap_time(
                        sum(self.map.getPlayer().get_laps_time()))), 1,
                    COLOR_VELOCIMETER), (
                    self.resultsScreenPos[0] + 205,
                    self.resultsScreenPos[1] + 120))
                self.screen.blit(
                    self.resultsFontTitleContent.render(self.lang.get(23,
                                                                      self.map.getPlayer().get_fast_lap()[
                                                                          0]),
                                                        1,
                                                        COLOR_VELOCIMETER), (
                        self.resultsScreenPos[0] + 205,
                        self.resultsScreenPos[1] + 160))
                self.screen.blit(self.resultsFontTitleContent.render(
                    self.lang.get(24, self.map.getPlayer().get_lap_time(
                        self.map.getPlayer().get_fast_lap()[1])), 1,
                    COLOR_VELOCIMETER), (
                    self.resultsScreenPos[0] + 205,
                    self.resultsScreenPos[1] + 180))
                self.screen.blit(
                    self.resultsFontTitleContent.render(
                        self.lang.get(25, self.map.getPlayer().get_fast_vel()),
                        1,
                        COLOR_VELOCIMETER), (
                        self.resultsScreenPos[0] + 205,
                        self.resultsScreenPos[1] + 220))
                self.screen.blit(
                    self.resultsFontTitleContent.render(self.lang.get(26), 1,
                                                        COLOR_VELOCIMETER), (
                        self.resultsScreenPos[0] + 205,
                        self.resultsScreenPos[1] + 260))
                self.screen.blit(self.resultsFontTitleContent.render(
                    self.map.getPlayer().get_lap_time(
                        self.map.getPlayer().get_tiempo_fuera()) + "s", 1,
                    COLOR_VELOCIMETER), (
                    self.resultsScreenPos[0] + 205,
                    self.resultsScreenPos[1] + 280))
                self.screen.blit(
                    self.resultsFontTitleContent.render(
                        self.lang.get(27, self.map.getPlayer().get_puntaje()),
                        1,
                        COLOR_VELOCIMETER), (
                        self.resultsScreenPos[0] + 205,
                        self.resultsScreenPos[1] + 320))
                # Marcadores online
                scores = self.map.getPlayer().get_scoreboard_online()
                if len(scores) > 0:
                    if scores[0] == NO_ERROR:
                        self.screen.blit(self.resultsFontTitleSubtl2.render(
                            self.lang.get(32), 1, COLOR_VELOCIMETER),
                            (self.resultsScreenPos[0] + 453,
                             self.resultsScreenPos[1] + 118))
                        i = 0
                        for score in scores:
                            if i == 0:
                                pass
                            else:
                                try:
                                    if score[0] != STATE_NULL:
                                        self.screen.blit(
                                            self.resultsFontTitleContent.render(
                                                score[1], 1, score[0]), (
                                                self.resultsScreenPos[0] + 460,
                                                self.resultsScreenPos[
                                                    1] + 130 + 19 * i))
                                        self.screen.blit(
                                            self.resultsFontTitleContent.render(
                                                score[2], 1, score[0]), (
                                                self.resultsScreenPos[0] + 505,
                                                self.resultsScreenPos[
                                                    1] + 130 + 19 * i))
                                        self.screen.blit(
                                            self.resultsFontTitleContent.render(
                                                score[3], 1, score[0]), (
                                                self.resultsScreenPos[0] + 600,
                                                self.resultsScreenPos[
                                                    1] + 130 + 19 * i))
                                    else:
                                        self.screen.blit(
                                            self.resultsFontTitleContent.render(
                                                self.lang.get(33), 1,
                                                COLOR_VELOCIMETER),
                                            (self.resultsScreenPos[0] + 540,
                                             self.resultsScreenPos[
                                                 1] + 126 + 19 * i))
                                except:
                                    self.screen.blit(
                                        self.resultsFontTitleContent.render(
                                            self.lang.get(33), 1,
                                            COLOR_VELOCIMETER),
                                        (self.resultsScreenPos[0] + 540,
                                         self.resultsScreenPos[
                                             1] + 126 + 19 * i))
                            i += 1
                    # Se imprimen mensajes de error
                    elif scores[0] == ERROR_SCOREBOARD_NOCONECTION:
                        self.screen.blit(self.resultsFontTitleContent.render(
                            self.lang.get(35), 1, COLOR_VELOCIMETER),
                            (self.resultsScreenPos[0] + 451,
                             self.resultsScreenPos[1] + 120))
                    elif scores[0] == ERROR_SCOREBOARD_NOCONECTIONDB:
                        self.screen.blit(self.resultsFontTitleContent.render(
                            self.lang.get(36), 1, COLOR_VELOCIMETER),
                            (self.resultsScreenPos[0] + 478,
                             self.resultsScreenPos[1] + 120))
                    elif scores[0] == ERROR_SCOREBOARD_FAKEHASH:
                        self.screen.blit(self.resultsFontTitleContent.render(
                            self.lang.get(37), 1, COLOR_VELOCIMETER),
                            (self.resultsScreenPos[0] + 443,
                             self.resultsScreenPos[1] + 120))
                        self.screen.blit(self.resultsFontTitleContent.render(
                            self.lang.get(38), 1, COLOR_VELOCIMETER),
                            (self.resultsScreenPos[0] + 509,
                             self.resultsScreenPos[1] + 140))
                    elif scores[0] == ERROR_SCOREBOARD_NO_SCORES:
                        self.screen.blit(self.resultsFontTitleContent.render(
                            self.lang.get(34), 1, COLOR_VELOCIMETER),
                            (self.resultsScreenPos[0] + 481,
                             self.resultsScreenPos[1] + 120))
                    elif scores[0] == ERROR_SCOREBOARD_BADPARAMETERS:
                        self.screen.blit(self.resultsFontTitleContent.render(
                            self.lang.get(39), 1, COLOR_VELOCIMETER),
                            (self.resultsScreenPos[0] + 478,
                             self.resultsScreenPos[1] + 120))
                    elif scores[0] == ERROR_SCOREBOARD_FAKESCORE:
                        self.screen.blit(self.resultsFontTitleContent.render(
                            self.lang.get(40), 1, COLOR_VELOCIMETER),
                            (self.resultsScreenPos[0] + 480,
                             self.resultsScreenPos[1] + 120))
                    elif scores[0] == ERROR_SCOREBOARD_FAKETIME:
                        self.screen.blit(self.resultsFontTitleContent.render(
                            self.lang.get(41), 1, COLOR_VELOCIMETER),
                            (self.resultsScreenPos[0] + 453,
                             self.resultsScreenPos[1] + 120))
                    elif scores[0] == ERROR_SCOREBOARD_FAKETRACK:
                        self.screen.blit(self.resultsFontTitleContent.render(
                            self.lang.get(50), 1, COLOR_VELOCIMETER),
                            (self.resultsScreenPos[0] + 451,
                             self.resultsScreenPos[1] + 120))
                else:
                    self.screen.blit(
                        self.resultsFontTitleContent.render(self.lang.get(34),
                                                            1,
                                                            COLOR_VELOCIMETER),
                        (self.resultsScreenPos[0] + 481,
                         self.resultsScreenPos[1] + 120))
                # Se guardan los resultados y se consulta la siguiente pista
                if not self.map.resultsSaved():
                    self.map.results = True
                    save = open(
                        DIR_SAVES + str(hash(self.map.getTrackTitle())) + str(
                            hash(self.map.getPlayer().username)) + \
                        str(hash(self.map.getPlayer().get_type())) + ".txt",
                        "w")
                    save.write(
                        "<player>" + self.map.getPlayer().username + "</player>")
                    if tiempo < oro:
                        save.write("<oro>1</oro>")
                    else:
                        save.write("<oro>0</oro>")
                    if tiempo < plata:
                        save.write("<plata>1</plata>")
                    else:
                        save.write("<plata>0</plata>")
                    if tiempo < bronce:
                        save.write("<bronce>1</bronce>")
                    else:
                        save.write("<bronce>0</bronce>")
                    save.write("<oro_t>" + str(tiempo - oro) + "</oro_t>")
                    save.write("<plata_t>" + str(tiempo - oro) + "</plata_t>")
                    save.write(
                        "<bronce_t>" + str(tiempo - oro) + "</bronce_t>")
                    save.close()
                    self.map.getPlayer().set_next_track(
                        TRACKS[get_next_track(self.world.get_actual_index())])
                # Se dibujan los botones debajo del recuadro
                if self.map.getPlayer().get_next_track() != TRACK_NOT_DEFINED:
                    quit_text = self.buttonsResultsFont.render(
                        self.lang.get(108), 1, COLOR_VELOCIMETER)
                    quit_text_width = quit_text.get_size()[0]
                    next_text = self.buttonsResultsFont.render(
                        self.lang.get(109,
                                      self.map.getPlayer().get_next_track()),
                        1, COLOR_VELOCIMETER)
                    next_text_width = next_text.get_size()[0]
                    pygame.gfxdraw.filled_polygon(self.screen, [
                        (self.resultsButtonQuitPos[0] - 15,
                         self.resultsButtonQuitPos[1] - 8),
                        (self.resultsButtonQuitPos[0] + quit_text_width + 15,
                         self.resultsButtonQuitPos[1] - 8),
                        (self.resultsButtonQuitPos[0] + quit_text_width + 15,
                         self.resultsButtonQuitPos[1] + 30),
                        (self.resultsButtonQuitPos[0] - 15,
                         self.resultsButtonQuitPos[1] + 30)],
                                                  (0, 0, 0, 230))
                    pygame.gfxdraw.filled_polygon(self.screen, [
                        (self.resultsButtonNextPos[0] - 15 - next_text_width,
                         self.resultsButtonNextPos[1] - 8),
                        (self.resultsButtonNextPos[0] + 14,
                         self.resultsButtonNextPos[1] - 8),
                        (self.resultsButtonNextPos[0] + 14,
                         self.resultsButtonNextPos[1] + 30),
                        (self.resultsButtonNextPos[0] - 15 - next_text_width,
                         self.resultsButtonNextPos[1] + 30)],
                                                  (0, 0, 0, 230))
                    self.screen.blit(quit_text, (self.resultsButtonQuitPos[0],
                                                 self.resultsButtonQuitPos[1]))
                    self.screen.blit(next_text,
                                     (self.resultsButtonNextPos[
                                          0] - next_text_width,
                                      self.resultsButtonNextPos[1]))

        # Si está en un menu
        elif state == STATE_MENU:
            if self.isPlaying and not self.map.getPlayer().finished_lap():
                self.menu.setActualMenu(MENU_PAUSE)
                self.menu.drawMenuPause()
            else:
                self.menu.setActualMenu(MENU_INICIAL)
                # Si se vuelve al menu principal se destruye
                if self.isPlaying and self.map.getPlayer().finished_lap():
                    self.world.clear_actual_map()
                    self.stop_playing_render()
                    self.controller.delPlayer()
                self.menu.drawMenuInicial(time)
        # Si el evento es avanzar de pista
        elif state == STATE_NEXT:
            self.world.clear_actual_map()
            self.world.load_map(NEXT_TRACK)
            self.controller.setPlayer()
            self.start_playing_render()
        # Se actualiza la pantalla
        pygame.display.flip()

    def set_map(self):
        """
        Define el mapa actual
        :return: void
        """
        self.map = self.world.get_actual_map()

    def start_playing_render(self):
        """
        Empieza el renderizado del mapa
        :return: void
        """
        self.isPlaying = True
        self.set_map()

    def stop_playing_render(self):
        """
        Detiene el renderizado del mapa
        :return: void
        """
        self.isPlaying = False
        self.map = None

    def update_show_ghost(self):
        """
        Comprueba si se cambio el parametro show_ghost
        :return: void
        """
        self.show_ghost = self.viewConfig.isTrue(
            "SHOWGHOST")  # define si se dibuja al ghost o no

    def update_show_fps(self):
        """
        Comprueba si se cambio el parametro show_fps
        :return: void
        """
        self.show_fps = self.viewConfig.isTrue(
            "SHOWFPS")  # define si se dibuja el fps en el titulo de la ventana
        if not self.show_fps:
            self.window.set_window_title(
                self.lang.get(10))  # se define el titulo por defecto

    def update_window_size(self):
        """
        Actualiza el tamaño de la ventana
        :return: void
        """
        self.windowHeight = self.window.get_window_height()  # alto de la ventana
        self.windowWidth = self.window.get_window_width()  # ancho de la ventana