/ / Cách tạo Menu bắt đầu và trò chơi trên màn hình với PyGame

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.​ ​


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.

trò chơi đơn giản sử dụng pygame

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.

pygame trò chơi đơn giản với màn hình 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 = 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()

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.

trò chơi đơn giản pygame với màn hình gameover

Dưới đây là mã đầy đủ:

 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

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()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.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *