class Menu: "Representa un menú con opciones para un juego" def __init__(self, opciones): self.opciones = [] fuente = pygame.font.Font('fonts/FEASFBI_.TTF', 25) x = 710 y = 10 paridad = 1 self.cursor = Cursor(x - 30, y, 33) for titulo, funcion in opciones: self.opciones.append(Opcion(fuente, titulo, x, y, paridad, funcion)) y += 30 if paridad == 1: paridad = -1 else: paridad = 1 self.seleccionado = 0 self.total = len(self.opciones) self.mantiene_pulsado = False def actualizar(self): """Altera el valor de 'self.seleccionado' con los direccionales.""" k = pygame.key.get_pressed() if not self.mantiene_pulsado: if k[K_UP]: self.seleccionado -= 1 elif k[K_DOWN]: self.seleccionado += 1 elif k[K_RETURN]: # Invoca a la función asociada a la opción. self.opciones[self.seleccionado].activar() # procura que el cursor esté entre las opciones permitidas if self.seleccionado < 0: self.seleccionado = 0 elif self.seleccionado > self.total - 1: self.seleccionado = self.total - 1 self.cursor.seleccionar(self.seleccionado) # indica si el usuario mantiene pulsada alguna tecla. self.mantiene_pulsado = k[K_UP] or k[K_DOWN] or k[K_RETURN] self.cursor.actualizar() for o in self.opciones: o.actualizar() def imprimir(self, screen): """Imprime sobre 'screen' el texto de cada opción del menú.""" self.cursor.imprimir(screen) for opcion in self.opciones: opcion.imprimir(screen)
class Menu: def __init__(self, opciones): self.fondo = pygame.image.load("imagen/fondo-menu.jpg").convert() self.fuente = pygame.font.Font('fuentes/ninja-turtles-regular.otf', 80) self.texto = self.fuente.render('TURTLE NINJA ', True, Color.VERDE) self.opciones = list() self.cursor = Cursor() self.seleccionado = 0 self.total = len(opciones) self.mantiene_pulsado = False self.sonido_menu = pygame.mixer.Sound('audio/an_8_bit_story.ogg') self.sonido_menu.play(loops=-1) self.construir_opciones(opciones) def construir_opciones(self, opciones): fuente = pygame.font.Font('fuentes/hkgrotesk-bold.otf', 22) fuente.set_bold(True) y_pos = 205 for titulo, funcion in opciones: self.opciones.append(Opcion(fuente, titulo, y_pos, funcion)) y_pos += 30 def actualizar(self): key = pygame.key.get_pressed() if not self.mantiene_pulsado: if key[pygame.K_UP] and self.seleccionado > 0: self.seleccionado -= 1 elif key[pygame.K_DOWN] and self.seleccionado < self.total - 1: self.seleccionado += 1 elif key[pygame.K_RETURN]: self.sonido_menu.stop() self.opciones[self.seleccionado].activar() self.sonido_menu.play(loops=-1) self.mantiene_pulsado = \ key[pygame.K_UP] \ or key[pygame.K_DOWN] \ or key[pygame.K_RETURN] self.cursor.seleccionar(self.seleccionado) self.cursor.actualizar() for opt in self.opciones: opt.destacar(False) self.opciones[self.seleccionado].destacar(True) def imprimir(self, pantalla): pantalla.blit(self.fondo, (0, 0)) pantalla.blit(self.texto, [10, 10]) self.cursor.imprimir(pantalla) for opcion in self.opciones: opcion.imprimir(pantalla)