def __init__(self, font_code, size_font, inicial_scale, increase_scale, color, number=3, sound_file=None): ''' @brief Constructor @param font_code Código de la fuente a usar @param size_font Tamaño de la fuente a usar @param inicial_scale Escala inicial @param increase_scale Parametro de incremento de la escala @param color Color de la fuente @param number Número en segundos de la cuenta atrás ''' #Obtenemos la fuente self.font = resource.get_font(font_code, size_font) #Creamos la cola de elementos self.elements = deque() self.sound = None if sound_file: self.sound = resource.get_sound(sound_file) self.sound.set_volume(config.Config().get_sound_volume()) #Introducimos todos los elementos for i in range(1, number + 1): self.elements.appendleft(self.font.render(str(i), True, color)) #Introducimos el fin de la cuenta atras self.elements.append(self.font.render('Go!!!', True, color)) #Obtenemos el primer elemento de la cola self.actual_element = self.elements.popleft() self.element_modify = self.actual_element #Asinamos valores self.inicial_scale = inicial_scale self.increase_scale = increase_scale self.scale = inicial_scale #Obtenemos el centro de la pantalla para que todos los número queden #igual posicionados self.centerx = pygame.display.get_surface().get_width() / 2 self.centery = pygame.display.get_surface().get_height() / 2 #Variables que representan posicion de destino, tiempo inicial y #condicion de parada, respectivamente self.rect_destiny = self.actual_element.get_rect() self.rect_destiny.centerx = self.centerx self.rect_destiny.centery = self.centery self.__start = None self.sound_start = False self.stop = False
def __init__(self, font_code, size_font, inicial_scale, increase_scale, color, number = 3, sound_file = None): ''' @brief Constructor @param font_code Código de la fuente a usar @param size_font Tamaño de la fuente a usar @param inicial_scale Escala inicial @param increase_scale Parametro de incremento de la escala @param color Color de la fuente @param number Número en segundos de la cuenta atrás ''' #Obtenemos la fuente self.font = resource.get_font(font_code, size_font) #Creamos la cola de elementos self.elements = deque() self.sound = None if sound_file: self.sound = resource.get_sound(sound_file) self.sound.set_volume(config.Config().get_sound_volume()) #Introducimos todos los elementos for i in range(1, number + 1): self.elements.appendleft(self.font.render(str(i), True, color)) #Introducimos el fin de la cuenta atras self.elements.append(self.font.render('Go!!!', True, color)) #Obtenemos el primer elemento de la cola self.actual_element = self.elements.popleft() self.element_modify = self.actual_element #Asinamos valores self.inicial_scale = inicial_scale self.increase_scale = increase_scale self.scale = inicial_scale #Obtenemos el centro de la pantalla para que todos los número queden #igual posicionados self.centerx = pygame.display.get_surface().get_width() / 2 self.centery = pygame.display.get_surface().get_height() / 2 #Variables que representan posicion de destino, tiempo inicial y #condicion de parada, respectivamente self.rect_destiny = self.actual_element.get_rect() self.rect_destiny.centerx = self.centerx self.rect_destiny.centery = self.centery self.__start = None self.sound_start = False self.stop = False
def __init__(self, game_control, xml_file, x, y, angle = 0): ''' @brief Constructor. @param game_control Referencia a Gamecontrol @param xml_file Archivo xml con la configuración del objeto @param x Posición en el eje x @param y Posición en el eje y @param angle Ángulo del objeto, por defecto será 0. ''' gameobject.GameObject.__init__(self, game_control) self.break_force = None self.avatar = None self.racer_image = None self.name_character = "" #Parseamos la información básica parser = xml.dom.minidom.parse(data.get_path_xml(xml_file)) self.parser_car_info(parser) self.parser_basic_info(parser) #Definimos la posición del objeto self.x = self.old_x = x self.y = self.old_y = y self.start = None self.turbo_state = None self.turbo_sound = resource.get_sound('turbo') self.turbo_sound.set_volume(config.Config().get_sound_volume()) self.old_max_speed = self.max_speed self.front_line = gameobject.Line(1, 1, 1, 1) self.back_line = gameobject.Line(1, 1, 1, 1) #Si el angulo es 0, no hacemos nada if angle == 0: self.dx = 0 self.dy = 0 #Si es 0 actualizamos el angulo del coche else: self.actual_angle = angle self.dx = math.cos(angle) * self.actual_speed self.dy = math.sin(angle) * self.actual_speed #Actualizamos la posicion del coche según su angulo self.update_position() #Actualizamos la rotación de la imagen del coche self.update_image()
def __init__(self, game_control, xml_file, x, y, angle=0): ''' @brief Constructor. @param game_control Referencia a Gamecontrol @param xml_file Archivo xml con la configuración del objeto @param x Posición en el eje x @param y Posición en el eje y @param angle Ángulo del objeto, por defecto será 0. ''' gameobject.GameObject.__init__(self, game_control) self.break_force = None self.avatar = None self.racer_image = None self.name_character = "" #Parseamos la información básica parser = xml.dom.minidom.parse(data.get_path_xml(xml_file)) self.parser_car_info(parser) self.parser_basic_info(parser) #Definimos la posición del objeto self.x = self.old_x = x self.y = self.old_y = y self.start = None self.turbo_state = None self.turbo_sound = resource.get_sound('turbo') self.turbo_sound.set_volume(config.Config().get_sound_volume()) self.old_max_speed = self.max_speed self.front_line = gameobject.Line(1, 1, 1, 1) self.back_line = gameobject.Line(1, 1, 1, 1) #Si el angulo es 0, no hacemos nada if angle == 0: self.dx = 0 self.dy = 0 #Si es 0 actualizamos el angulo del coche else: self.actual_angle = angle self.dx = math.cos(angle) * self.actual_speed self.dy = math.sin(angle) * self.actual_speed #Actualizamos la posicion del coche según su angulo self.update_position() #Actualizamos la rotación de la imagen del coche self.update_image()
def __init__(self, game, game_mode, path, best_total_time, best_lap, laps=3): ''' @brief Constructor @param game Referencia a game @param path archivo xml del circuito en cuestión ''' state.State.__init__(self, game) #Musica circuito self.music_file = None self.game_mode = game_mode #Coche del jugador. #self.player = playercar.PlayerCar(self, 'cars/coche_prueba_yellow.xml', 0, 0, 0) #self.player = playercar.PlayerCar(self, 'cars/coche_prueba_yellow.xml', 500, 400, 0) #Grupo de sprites que contentrá los coches de la IA. self.ia_cars = [] #Checkpoints para la ia self.ia_checkpoints = [ checkpoint.CheckPoints(self), checkpoint.CheckPoints(self), checkpoint.CheckPoints(self), checkpoint.CheckPoints(self) ] #Grupo de sprites que contendrá las cajas de items. #self.items_box = pygame.sprite.Group() self.items_box = pygame.sprite.Group() #Checkpoints que posee el circuito self.checkpoints = checkpoint.CheckPoints(self) #Puntos objetivos por los que tienen que pasar la IA self.ia_checks = {} #Grupo de sprite que contendrá las balas. self.bullets = pygame.sprite.Group() #Grupo de sprite que contendrás las manchas de aceite self.oils = pygame.sprite.Group() #Grupo para las pelotas self.balls = pygame.sprite.Group() #Grupo para las pelotas self.gums = pygame.sprite.Group() #Animaciones que estarán en el juego self.static_animations = [] self.advices = [] #Gestor de colisiones self.collision_manager = collisionmanager.CollisionManager() #Linea de salida self.start = None self.complete = False #Vueltas al circuito self.max_laps = laps self.actual_laps = 0 #Fuentes que usaremos self.font = resource.get_font('cheesebu', 35) self.font2 = resource.get_font('cheesebu', 70) #Contador de vuelta self.laps_counter = None self.laps_counter_rect = None #Obtenemos una superficie negra del mismo tamaño que la pantalla self.fade_surface = pygame.Surface( (pygame.display.get_surface().get_width(), pygame.display.get_surface().get_height())) self.fadein = True self.fadeout = False self.fade_speed = 5 self.fadeout_speed = 5 self.actual_alpha = 255 #Actualizamos el contador self.update_laps_counter() #Cronómetros de carrera self.actual_time = timer.Timer('cheesebu', 20, (0, 0, 0), 725, 10, "Actual:") self.total_time = timer.Timer('cheesebu', 20, (0, 0, 0), 725, 80, "Total:") #Mejor tiempo total del circuito self.best_total_time = timer.Timer('cheesebu', 20, (0, 0, 0), 600, 80, "Mejor total:", best_total_time[0], best_total_time[1], best_total_time[2]) #Mejor tiempo de vuelta del circuito self.best_time = timer.Timer('cheesebu', 20, (0, 0, 0), 600, 10, "Mejor Vuelta:", best_lap[0], best_lap[1], best_lap[2]) #Mejor vuelta del jugador self.best_lap_player = timer.Timer('cheesebu', 20, (0, 0, 0), 600, 10, "Mejor Vuelta:", 100, 0, 0) #Tiempos por vueltas self.lap_times = [] #Circuito actual que vamos a jugar. self.circuit = circuit.Circuit(self, path) #Menú de pausa self.pause = pausemenu.PauseMenu(self.game, self, 'menu/pausemenu.xml') #Cuenta atras #self.count_down = countdown.CountDown('cheesebu', 300, 0.02, 0.05, (221, 113, 5), 3, 'countdown') self.count_down = countdown.CountDown('cheesebu', 300, 0.02, 0.05, (0, 0, 0), 3, 'countdown') #Marcador de las posiciones de los jugadores self.position_board = PositionBoard(20, 10, 'image_position1', 'image_position2') #Pasamos al estado de cuenta atras self.actual_state = None self.position = {1: 'st', 2: 'nd', 3: 'rd', 4: 'th'} self.player_position = 1 #Actualizamos al jugador y la IA para posicionar bien la pantalla self.player.update() aux_ia_cars = [] #Actualizamos a la IA una primera vez y le situamos los puntos objetivos for i in range(len(self.ia_cars)): self.ia_cars[i].update() self.ia_cars[i].set_targets(self.ia_checks) #Asociamos checkpoints con la IA aux_ia_cars.append((self.ia_cars[i], self.ia_checkpoints[i])) self.ia_cars = aux_ia_cars #Actualizamos por primera vez el marcador de posiciones self.position_board.update((self.player, self.checkpoints), self.ia_cars) #Posicionamos la pantalla self.scroll_control() #Sonidos de juego self.sounds = {} self.sounds['collected_item'] = resource.get_sound('item_collected') self.sounds['missile_explosion'] = resource.get_sound( 'missile_explosion') self.sounds['ball_explosion'] = resource.get_sound('ball_explosion') self.sounds['ball_rebound'] = resource.get_sound('ball_rebound') self.sounds['yaw'] = resource.get_sound('yaw') for key in self.sounds.keys(): self.sounds[key].set_volume(config.Config().get_sound_volume())
def __init__(self, game, game_mode, path, best_total_time, best_lap, laps = 3): ''' @brief Constructor @param game Referencia a game @param path archivo xml del circuito en cuestión ''' state.State.__init__(self, game) #Musica circuito self.music_file = None self.game_mode = game_mode #Coche del jugador. #self.player = playercar.PlayerCar(self, 'cars/coche_prueba_yellow.xml', 0, 0, 0) #self.player = playercar.PlayerCar(self, 'cars/coche_prueba_yellow.xml', 500, 400, 0) #Grupo de sprites que contentrá los coches de la IA. self.ia_cars = [] #Checkpoints para la ia self.ia_checkpoints = [checkpoint.CheckPoints(self), checkpoint.CheckPoints(self), checkpoint.CheckPoints(self), checkpoint.CheckPoints(self)] #Grupo de sprites que contendrá las cajas de items. #self.items_box = pygame.sprite.Group() self.items_box = pygame.sprite.Group() #Checkpoints que posee el circuito self.checkpoints = checkpoint.CheckPoints(self) #Puntos objetivos por los que tienen que pasar la IA self.ia_checks = {} #Grupo de sprite que contendrá las balas. self.bullets = pygame.sprite.Group() #Grupo de sprite que contendrás las manchas de aceite self.oils = pygame.sprite.Group() #Grupo para las pelotas self.balls = pygame.sprite.Group() #Grupo para las pelotas self.gums = pygame.sprite.Group() #Animaciones que estarán en el juego self.static_animations = [] self.advices = [] #Gestor de colisiones self.collision_manager = collisionmanager.CollisionManager() #Linea de salida self.start = None self.complete = False #Vueltas al circuito self.max_laps = laps self.actual_laps = 0 #Fuentes que usaremos self.font = resource.get_font('cheesebu', 35) self.font2 = resource.get_font('cheesebu', 70) #Contador de vuelta self.laps_counter = None self.laps_counter_rect = None #Obtenemos una superficie negra del mismo tamaño que la pantalla self.fade_surface = pygame.Surface((pygame.display.get_surface().get_width(), pygame.display.get_surface().get_height())) self.fadein = True self.fadeout = False self.fade_speed = 5 self.fadeout_speed = 5 self.actual_alpha = 255 #Actualizamos el contador self.update_laps_counter() #Cronómetros de carrera self.actual_time = timer.Timer('cheesebu', 20, (0, 0, 0), 725, 10, "Actual:") self.total_time = timer.Timer('cheesebu', 20, (0, 0, 0), 725, 80, "Total:") #Mejor tiempo total del circuito self.best_total_time = timer.Timer('cheesebu', 20, (0, 0, 0), 600, 80, "Mejor total:", best_total_time[0], best_total_time[1],best_total_time[2]) #Mejor tiempo de vuelta del circuito self.best_time = timer.Timer('cheesebu', 20, (0, 0, 0), 600, 10, "Mejor Vuelta:", best_lap[0], best_lap[1], best_lap[2]) #Mejor vuelta del jugador self.best_lap_player = timer.Timer('cheesebu', 20, (0, 0, 0), 600, 10, "Mejor Vuelta:", 100, 0, 0) #Tiempos por vueltas self.lap_times = [] #Circuito actual que vamos a jugar. self.circuit = circuit.Circuit(self, path) #Menú de pausa self.pause = pausemenu.PauseMenu(self.game, self, 'menu/pausemenu.xml') #Cuenta atras #self.count_down = countdown.CountDown('cheesebu', 300, 0.02, 0.05, (221, 113, 5), 3, 'countdown') self.count_down = countdown.CountDown('cheesebu', 300, 0.02, 0.05, (0, 0, 0), 3, 'countdown') #Marcador de las posiciones de los jugadores self.position_board = PositionBoard(20, 10, 'image_position1', 'image_position2') #Pasamos al estado de cuenta atras self.actual_state = None self.position = {1: 'st', 2: 'nd', 3: 'rd', 4: 'th'} self.player_position = 1 #Actualizamos al jugador y la IA para posicionar bien la pantalla self.player.update() aux_ia_cars = [] #Actualizamos a la IA una primera vez y le situamos los puntos objetivos for i in range(len(self.ia_cars)): self.ia_cars[i].update() self.ia_cars[i].set_targets(self.ia_checks) #Asociamos checkpoints con la IA aux_ia_cars.append((self.ia_cars[i], self.ia_checkpoints[i])) self.ia_cars = aux_ia_cars #Actualizamos por primera vez el marcador de posiciones self.position_board.update((self.player, self.checkpoints), self.ia_cars) #Posicionamos la pantalla self.scroll_control() #Sonidos de juego self.sounds = {} self.sounds['collected_item'] = resource.get_sound('item_collected') self.sounds['missile_explosion'] = resource.get_sound('missile_explosion') self.sounds['ball_explosion'] = resource.get_sound('ball_explosion') self.sounds['ball_rebound'] = resource.get_sound('ball_rebound') self.sounds['yaw'] = resource.get_sound('yaw') for key in self.sounds.keys(): self.sounds[key].set_volume(config.Config().get_sound_volume())
def __init__(self, menu, xml_file, text, centerx, centery, font_code, show_text = True): ''' @brief Constructor. @param menu Referencia al Menú que pertenece @param xml_file ruta del archivo xml donde se encuentra la configuración básica del botón @param text Texto que aparecera sobre el botón @param centerx Posición del centro x del boton @param centery Posición del centro y del boton ''' self.text = text self.menu = menu parser = xml.dom.minidom.parse(data.get_path_xml(xml_file)) self.centerx = centerx self.centery = centery aux_rect = None father = parser.firstChild #Obtenemos la posición del texto en el boton self.text_position = str(father.getAttribute('text_position')) #Comprobamos si el boton mostrará el texto o no. if father.hasAttribute('on_button'): self.on_button = strTobool(str(father.getAttribute('on_button'))) else: self.on_button = True self.sound_over = None if father.hasAttribute('sound_over'): self.sound_over = resource.get_sound(str(father.getAttribute('sound_over'))) self.sound_over.set_volume(config.Config().get_sound_volume()) self.sound_click = None if father.hasAttribute('sound_click'): self.sound_click = resource.get_sound(str(father.getAttribute('sound_click'))) self.sound_click.set_volume(config.Config().get_sound_volume()) #Obtenemos la imagen y sus características cuando el boton esta en estado normal for element in parser.getElementsByTagName('normal'): #Cargamos la imagen normal_image_code = str(element.getAttribute('normal_image')) self.normal_image = resource.get_image(normal_image_code) #obtenemos posicion de la imagen aux_rect = self.normal_image.get_rect() aux_rect.x = self.centerx aux_rect.y = self.centery self.rect_normal = pygame.Rect((0, 0, 0, 0)) self.rect_normal.x = int(element.getAttribute('x')) + aux_rect.x self.rect_normal.y = int(element.getAttribute('y')) + aux_rect.y self.rect_normal.w = int(element.getAttribute('w')) self.rect_normal.h = int(element.getAttribute('h')) #Obtenemos la imagen y caracteristicas cuando el botón está seleccionado for element in parser.getElementsByTagName('selected'): #Cargamos imagen selected_image_code = str(element.getAttribute('selected_image')) self.selected_image = resource.get_image(selected_image_code) #Obtenemos la posicion aux_rect = self.selected_image.get_rect() aux_rect.x = self.centerx aux_rect.y = self.centery self.rect_selected = pygame.Rect((0, 0, 0, 0)) self.rect_selected.x = int(element.getAttribute('x')) + aux_rect.x self.rect_selected.y = int(element.getAttribute('y')) + aux_rect.y self.rect_selected.w = int(element.getAttribute('w')) self.rect_selected.h = int(element.getAttribute('h')) #Obtenemos el la posicion centrar de las dos imagenes self.rect_draw = self.normal_image.get_rect() self.rect_draw.centery = self.centery self.rect_draw.centerx = self.centerx #Si indicamos que se muestre el texto if show_text: #Obtenemos el texto normal que se mostrará for element in parser.getElementsByTagName('normal_text'): #Tamaño font_size = int(element.getAttribute('size')) #Color r = int(element.getAttribute('r')) g = int(element.getAttribute('g')) b = int(element.getAttribute('b')) color = (r, g, b) #Renderizamos self.normal_font = resource.get_font(font_code, font_size) self.text_render_normal = self.normal_font.render(self.text, True, color) #Vemos si el texto tendrá algun tipo de inclinación if element.hasAttribute('angle'): angle = int(element.getAttribute('angle')) self.text_render_normal = pygame.transform.rotozoom(self.text_render_normal, angle, 1) #Obtenemos la posicion del texto self.normal_text_rect = self.text_render_normal.get_rect() posx = int(element.getAttribute('x')) posy = int(element.getAttribute('y')) self.normal_text_rect = self.__set_rect_text(self.normal_text_rect, posx, posy) #Si hay opcion de cambio del color del texto cuando el botón esté seleccionado if len(parser.getElementsByTagName('selected_text')) > 0: #Obtenemos dicho texto for element in parser.getElementsByTagName('selected_text'): #tamaño font_size = int(element.getAttribute('size')) #Color r = int(element.getAttribute('r')) g = int(element.getAttribute('g')) b = int(element.getAttribute('b')) color = (r, g, b) #Renderizamos self.selected_font = resource.get_font(font_code, font_size) self.text_render_selected = self.selected_font.render(self.text, True, color) #Si tiene opcion de angulo if element.hasAttribute('angle'): #Rotamos el texto renderizado angle = int(element.getAttribute('angle')) self.text_render_selected = pygame.transform.rotozoom(self.text_render_selected, angle, 1) #Asignamos la posición que tendrá self.selected_text_rect = self.text_render_selected.get_rect() posx = int(element.getAttribute('x')) posy = int(element.getAttribute('y')) self.selected_text_rect = self.__set_rect_text(self.selected_text_rect, posx, posy) #Si no hay opción de texto seleccionado, asignamos el mismo texto anterior else: self.text_render_selected = self.text_render_normal self.selected_text_rect = self.normal_text_rect self.selected = False #Obtenemos las mascaras de colisiones para los dos botones self.normal_mask = pygame.mask.from_surface(self.normal_image) self.selected_mask = pygame.mask.from_surface(self.selected_image) self.actual_mask = self.normal_mask self.show_text = show_text