Cómo crear un menú de inicio y una pantalla de finalización de juego con PyGame
Aprenda a desarrollar la primera y la última pantalla de su PyGame con facilidad.
PyGame es una biblioteca popular para crear proyectos con Python y proporciona un poderoso conjunto de herramientas para el desarrollo de juegos. En este artículo, aprenderá cómo crear un menú de inicio y una pantalla de finalización del juego para un juego simple usando PyGame.
Creando un juego simple
Antes de crear el menú de inicio y la pantalla de fin del juego, primero hagamos un juego simple. En este juego, controlarás a un personaje con las teclas de flecha e intentarás evitar obstáculos. Para simplificar las cosas, intente no utilizar ninguna imagen.
Para comenzar, necesita importar los módulos necesarios. Utilizará el módulo pygame para acceder a las funciones de PyGame. Para instalar el módulo, puede utilizar el administrador de paquetes pip:
pip install pygame
Ahora que nuestro módulo está listo para usar, creemos un juego simple con un jugador que puede moverse hacia la izquierda o hacia la derecha usando las teclas de flecha y un obstáculo. Si chocas con el obstáculo, el juego terminará. Aquí está el código para lo mismo:
import pygame
pygame.init()
screen_width = 750
screen_height = 450
screen = pygame.display.set_mode((screen_width, screen_height))
obstacle_x = 400
obstacle_y = 400
obstacle_width = 40
obstacle_height = 40
player_x = 200
player_y = 400
player_width = 20
player_height = 20
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
player_x -= 5
if keys[pygame.K_RIGHT]:
player_x += 5
if player_x + player_width > obstacle_x and player_x < obstacle_x + obstacle_width and player_y + player_height > obstacle_y and player_y < obstacle_y + obstacle_height:
game_over = True
screen.fill((0, 0, 0))
pygame.draw.rect(screen, (255, 0, 0), (obstacle_x, obstacle_y, obstacle_width, obstacle_height))
pygame.draw.rect(screen, (0, 255, 0), (player_x, player_y, player_width, player_height))
pygame.display.update()
En el código anterior, configuraste la ventana del juego y declaraste las variables del juego. También manejó la entrada del usuario y dibujó los elementos en la pantalla.
Creando el menú Inicio
Ahora que tienes un juego básico, creemos un menú de inicio. Para hacer esto, necesitarás declarar una variable global para el estado del juego. Esta variable realizará un seguimiento del estado actual del juego, como si el menú de inicio está activo o el juego se está ejecutando. Debes agregar esta variable al comienzo del código de tu juego:
game_state = "start_menu"
A continuación, agregará una función para dibujar el menú de inicio en la pantalla. Puede utilizar las funciones de PyGame para dibujar texto, botones y otros elementos en la pantalla.
def draw_start_menu():
screen.fill((0, 0, 0))
font = pygame.font.SysFont('arial', 40)
title = font.render('My Game', True, (255, 255, 255))
start_button = font.render('Start', True, (255, 255, 255))
screen.blit(title, (screen_width/2 - title.get_width()/2, screen_height/2 - title.get_height()/2))
screen.blit(start_button, (screen_width/2 - start_button.get_width()/2, screen_height/2 + start_button.get_height()/2))
pygame.display.update()
Luego puedes agregar la función draw_start_menu() al bucle principal del juego.
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
if game_state == "start_menu":
draw_start_menu()
if game_state == "game":
keys = pygame.key.get_pressed()
# rest of the code
Ahora, el menú de inicio aparecerá en la pantalla. El último paso es manejar la entrada del usuario. Puedes agregar una declaración if al bucle principal del juego para verificar si el usuario ha presionado el botón de inicio.
if game_state == "start_menu":
keys = pygame.key.get_pressed()
if keys[pygame.K_SPACE]:
player_x = 200
player_y = 400
game_state = "game"
game_over = False
Con este código, el juego comenzará cuando el usuario presione el botón de inicio.
Implementación de la pantalla Game Over
Ahora que tienes el menú de inicio, creemos la pantalla de fin del juego. Esta función debería mostrar el puntaje final y un mensaje de fin del juego.
def draw_game_over_screen():
screen.fill((0, 0, 0))
font = pygame.font.SysFont('arial', 40)
title = font.render('Game Over', True, (255, 255, 255))
restart_button = font.render('R - Restart', True, (255, 255, 255))
quit_button = font.render('Q - Quit', True, (255, 255, 255))
screen.blit(title, (screen_width/2 - title.get_width()/2, screen_height/2 - title.get_height()/3))
screen.blit(restart_button, (screen_width/2 - restart_button.get_width()/2, screen_height/1.9 + restart_button.get_height()))
screen.blit(quit_button, (screen_width/2 - quit_button.get_width()/2, screen_height/2 + quit_button.get_height()/2))
pygame.display.update()
Luego puedes agregar esta función al bucle principal del juego.
if game_state == "start_menu":
draw_start_menu()
if game_state == "game_over":
draw_game_over_screen()
if game_state == "game":
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
player_x -= 5
if keys[pygame.K_RIGHT]:
player_x += 5
if player_x + player_width > obstacle_x and player_x < obstacle_x + obstacle_width and player_y + player_height > obstacle_y and player_y < obstacle_y + obstacle_height:
game_over = True
game_state = "game_over"
Finalmente, debe manejar la entrada del usuario para manejar la elección del usuario. Puedes agregar una declaración if al bucle principal del juego para verificar si el usuario ha presionado el botón de reiniciar o salir.
if game_state == "start_menu":
keys = pygame.key.get_pressed()
if keys[pygame.K_SPACE]:
game_state = "game"
player_x = 200
player_y = 400
game_state = "game"
game_over = False
if game_state == "game_over":
keys = pygame.key.get_pressed()
if keys[pygame.K_r]:
game_state = "start_menu"
if keys[pygame.K_q]:
pygame.quit()
quit()
Con este código, el juego se reiniciará cuando el usuario presione el botón 'R' y saldrá cuando el usuario presione el botón 'Q' en el teclado.
A continuación se muestra el código completo:
import pygame
pygame.init()
screen_width = 750
screen_height = 450
screen = pygame.display.set_mode((screen_width, screen_height))
obstacle_x = 400
obstacle_y = 400
obstacle_width = 40
obstacle_height = 40
player_x = 200
player_y = 400
player_width = 20
player_height = 20
game_state = "start_menu"
def draw_start_menu():
screen.fill((0, 0, 0))
font = pygame.font.SysFont('arial', 40)
title = font.render('My Game', True, (255, 255, 255))
start_button = font.render('Start', True, (255, 255, 255))
screen.blit(title, (screen_width/2 - title.get_width()/2, screen_height/2 - title.get_height()/2))
screen.blit(start_button, (screen_width/2 - start_button.get_width()/2, screen_height/2 + start_button.get_height()/2))
pygame.display.update()
def draw_game_over_screen():
screen.fill((0, 0, 0))
font = pygame.font.SysFont('arial', 40)
title = font.render('Game Over', True, (255, 255, 255))
restart_button = font.render('R - Restart', True, (255, 255, 255))
quit_button = font.render('Q - Quit', True, (255, 255, 255))
screen.blit(title, (screen_width/2 - title.get_width()/2, screen_height/2 - title.get_height()/3))
screen.blit(restart_button, (screen_width/2 - restart_button.get_width()/2, screen_height/1.9 + restart_button.get_height()))
screen.blit(quit_button, (screen_width/2 - quit_button.get_width()/2, screen_height/2 + quit_button.get_height()/2))
pygame.display.update()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
if game_state == "start_menu":
draw_start_menu()
keys = pygame.key.get_pressed()
if keys[pygame.K_SPACE]:
player_x = 200
player_y = 400
game_state = "game"
game_over = False
elif game_state == "game_over":
draw_game_over_screen()
keys = pygame.key.get_pressed()
if keys[pygame.K_r]:
game_state = "start_menu"
if keys[pygame.K_q]:
pygame.quit()
quit()
elif game_state == "game":
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
player_x -= 5
if keys[pygame.K_RIGHT]:
player_x += 5
if player_x + player_width > obstacle_x and player_x < obstacle_x + obstacle_width and player_y + player_height > obstacle_y and player_y < obstacle_y + obstacle_height:
game_over = True
game_state = "game_over"
screen.fill((0, 0, 0))
pygame.draw.rect(screen, (255, 0, 0), (obstacle_x, obstacle_y, obstacle_width, obstacle_height))
pygame.draw.rect(screen, (0, 255, 0), (player_x, player_y, player_width, player_height))
pygame.display.update()
elif game_over:
game_state = "game_over"
game_over = False
El código comienza importando el módulo pygame e inicializándolo. Luego crea una ventana de juego y declara las variables de juego necesarias, incluida la posición, dimensión y estado del juego del jugador y del obstáculo.
El código define dos funciones, draw_start_menu() y draw_game_over_screen(), para dibujar el menú de inicio y la pantalla de fin del juego. Estas funciones utilizan las funciones de PyGame para dibujar texto y botones en la pantalla.
El bucle principal del juego comienza manejando eventos y verificando el estado del juego. Si el estado del juego es start_menu, el menú de inicio aparece en la pantalla. Si el estado del juego es game_over, la pantalla de fin del juego se muestra en la pantalla. Si el estado del juego es cualquier otra cosa, el juego se actualiza y atrae al jugador y al obstáculo a la pantalla.
El juego se actualiza manejando las pulsaciones de teclas y verificando si hay una colisión entre el jugador y el obstáculo. Si hay una colisión, el juego establece el indicador game_over en True y establece el estado del juego en game_over.
Una vez actualizado el juego, el jugador y el obstáculo aparecen en la pantalla. Finalmente, el código verifica si el indicador game_over está configurado y, si lo está, restablece el indicador y establece el estado del juego en game_over.
Este proceso se repite continuamente hasta que se cierra la ventana del juego.
Aumente la participación del usuario con una interfaz de usuario visualmente atractiva
El uso de una interfaz de usuario (UI) bien diseñada puede aumentar considerablemente la participación del usuario en un juego de PyGame. Una fuente clara y fácil de leer, gráficos visualmente atractivos, una navegación sencilla y los comentarios de los usuarios son elementos importantes a considerar al diseñar la interfaz de usuario. Al implementar estos elementos, puedes crear una interfaz de usuario que ayude a mantener al jugador interesado e inmerso en el juego.
Recuerde probar su interfaz de usuario y recopilar comentarios de los jugadores para asegurarse de que sea eficaz para aumentar la participación. En general, tomarse el tiempo para crear una interfaz de usuario sólida puede mejorar en gran medida la experiencia del jugador y el disfrute del juego.