Cách tạo Menu bắt đầu và trò chơi trên màn hình với PyGame
PyGame là một thư viện phổ biến để tạo các dự án bằng Python và nó cung cấp một bộ công cụ mạnh mẽ để phát triển trò chơi. Trong bài viết này, bạn sẽ tìm hiểu cách tạo menu bắt đầu và trò chơi trên màn hình cho một trò chơi đơn giản bằng PyGame.
Mục Lục
Tạo một trò chơi đơn giản
Trước khi bạn tạo menu bắt đầu và trò chơi trên màn hình, trước tiên hãy tạo một trò chơi đơn giản. Trong trò chơi này, bạn sẽ điều khiển một nhân vật bằng các phím mũi tên và cố gắng tránh chướng ngại vật. Để giữ mọi thứ đơn giản, hãy cố gắng không sử dụng bất kỳ hình ảnh nào.
Để bắt đầu, bạn cần nhập các mô-đun cần thiết. Bạn sẽ sử dụng pygame module để truy cập các chức năng của PyGame. Để cài đặt mô-đun, bạn có thể sử dụng trình quản lý gói pip:
pip install pygame
Bây giờ mô-đun của chúng ta đã sẵn sàng để sử dụng, hãy tạo một trò chơi đơn giản với người chơi có thể di chuyển sang trái hoặc phải bằng các phím mũi tên và chướng ngại vật. Nếu bạn va chạm với chướng ngại vật, trò chơi sẽ kết thúc. Đây là mã cho cùng:
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()
Trong đoạn mã trên, bạn thiết lập cửa sổ trò chơi và khai báo các biến trò chơi. Bạn cũng đã xử lý đầu vào của người dùng và vẽ các phần tử lên màn hình.
Bây giờ bạn đã có một trò chơi cơ bản, hãy tạo một menu bắt đầu. Để làm điều này, bạn sẽ cần khai báo một biến toàn cầu cho trạng thái trò chơi. Biến này sẽ theo dõi trạng thái hiện tại của trò chơi, chẳng hạn như menu bắt đầu có hoạt động hay trò chơi đang chạy hay không. Bạn cần thêm biến này vào đầu mã trò chơi của mình:
game_state = "start_menu"
Tiếp theo, bạn sẽ thêm chức năng vẽ menu bắt đầu lên màn hình. Bạn có thể sử dụng các hàm PyGame để vẽ văn bản, nút và các thành phần khác trên màn hình.
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()
Sau đó, bạn có thể thêm draw_start_menu() chức năng cho vòng lặp trò chơi chính.
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()
Bây giờ, menu bắt đầu sẽ được vẽ ra màn hình. Bước cuối cùng là xử lý đầu vào của người dùng. Bạn có thể thêm câu lệnh if vào vòng lặp trò chơi chính để kiểm tra xem người dùng đã nhấn nút bắt đầu chưa.
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
Với mã này, trò chơi sẽ bắt đầu khi người dùng nhấn nút bắt đầu.
Thực hiện Game Over Screen
Bây giờ bạn đã có menu bắt đầu, hãy tạo trò chơi trên màn hình. Chức năng này sẽ hiển thị điểm số cuối cùng và thông báo trò chơi kết thúc.
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()
Sau đó, bạn có thể thêm chức năng này vào vòng lặp trò chơi chính.
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"
Cuối cùng, bạn cần xử lý đầu vào của người dùng để xử lý lựa chọn của người dùng. Bạn có thể thêm câu lệnh if vào vòng lặp trò chơi chính để kiểm tra xem người dùng đã nhấn nút khởi động lại hay thoát chưa.
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 = Falseif 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()
Với mã này, trò chơi sẽ bắt đầu lại khi người dùng nhấn nút ‘R’ và thoát khi người dùng nhấn nút ‘Q’ trên bàn phím.
Dưới đây là mã đầy đủ:
import pygamepygame.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
Mã bắt đầu bằng cách nhập pygame mô-đun và khởi tạo nó. Sau đó, nó tạo một cửa sổ trò chơi và khai báo các biến trò chơi cần thiết, bao gồm vị trí, kích thước và trạng thái trò chơi của người chơi và chướng ngại vật.
Mã xác định hai chức năng, draw_start_menu() và draw_game_over_screen(), để vẽ menu bắt đầu và trò chơi trên màn hình. Các hàm này sử dụng các hàm PyGame để vẽ văn bản và các nút lên màn hình.
Vòng lặp trò chơi chính bắt đầu bằng cách xử lý các sự kiện và kiểm tra trạng thái trò chơi. Nếu trạng thái trò chơi là start_menu, menu bắt đầu được kéo ra màn hình. Nếu trạng thái trò chơi là game_over, màn hình kết thúc trò chơi được kéo ra màn hình. Nếu trạng thái trò chơi là bất cứ điều gì khác, trò chơi sẽ cập nhật và thu hút người chơi và chướng ngại vật lên màn hình.
Trò chơi cập nhật bằng cách xử lý các lần nhấn phím và kiểm tra va chạm giữa người chơi và chướng ngại vật. Nếu có va chạm, trò chơi sẽ đặt game_over cờ để Thật và đặt trạng thái trò chơi thành game_over.
Sau khi trò chơi được cập nhật, người chơi và chướng ngại vật sẽ được đưa lên màn hình. Cuối cùng, mã kiểm tra nếu game_over cờ được đặt và nếu có, nó sẽ đặt lại cờ và đặt trạng thái trò chơi thành game_over.
Quá trình này được lặp lại liên tục cho đến khi đóng cửa sổ trò chơi.
Tăng mức độ tương tác của người dùng với giao diện người dùng hấp dẫn trực quan
Sử dụng giao diện người dùng (UI) được thiết kế tốt có thể tăng đáng kể mức độ tương tác của người dùng trong trò chơi PyGame. Phông chữ rõ ràng và dễ đọc, đồ họa hấp dẫn trực quan, điều hướng dễ dàng và phản hồi của người dùng là tất cả các yếu tố quan trọng cần xem xét khi thiết kế giao diện người dùng. Bằng cách triển khai các yếu tố này, bạn có thể tạo giao diện người dùng giúp thu hút người chơi và đắm chìm trong trò chơi.
Hãy nhớ kiểm tra giao diện người dùng của bạn và thu thập phản hồi từ người chơi để đảm bảo rằng nó có hiệu quả trong việc tăng mức độ tương tác. Nhìn chung, dành thời gian để tạo giao diện người dùng mạnh có thể cải thiện đáng kể trải nghiệm của người chơi và sự thích thú với trò chơi của bạn.