如何使用 PyGame 創建開始菜單和遊戲結束屏幕
PyGame 是用於使用 Python 創建項目的流行庫,它為遊戲開發提供了一組強大的工具。在本文中,您將學習如何使用 PyGame 為簡單遊戲創建開始菜單和遊戲結束屏幕。
創建一個簡單的遊戲
在創建開始菜單和遊戲結束屏幕之前,讓我們先製作一個簡單的遊戲。在這個遊戲中,你將用方向鍵控制一個角色,並儘量避開障礙物。為了簡單起見,盡量不要使用任何圖像。
首先,您需要導入必要的模塊。您將使用pygame模塊來訪問 PyGame 的功能。要安裝該模塊,您可以使用 pip 包管理器:
pip install pygame
現在我們的模塊可以使用了,讓我們創建一個簡單的遊戲,玩家可以使用箭頭鍵和障礙物向左或向右移動。如果你撞到障礙物,遊戲就會結束。這是相同的代碼:
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()
在上面的代碼中,您設置了遊戲窗口並聲明了遊戲變量。您還處理了用戶輸入並將元素繪製到屏幕上。
創建開始菜單
現在您已經有了一個基本的遊戲,讓我們創建一個開始菜單。為此,您需要為遊戲狀態聲明一個全局變量。此變量將跟踪遊戲的當前狀態,例如開始菜單是否處於活動狀態或遊戲是否正在運行。您需要在遊戲代碼的開頭添加此變量:
game_state = "start_menu"
接下來,您將添加一個函數來將開始菜單繪製到屏幕上。您可以使用 PyGame 函數在屏幕上繪製文本、按鈕和其他元素。
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()
然後,您可以將draw_start_menu()函數添加到主遊戲循環中。
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
現在,開始菜單將被繪製到屏幕上。最後一步是處理用戶輸入。您可以在主遊戲循環中添加一個 if 語句來檢查用戶是否按下了開始按鈕。
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
使用此代碼,遊戲將在用戶按下開始按鈕時開始。
實現遊戲結束畫面
現在您有了開始菜單,讓我們創建遊戲結束屏幕。此函數應顯示最終得分和遊戲結束消息。
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()
然後您可以將此函數添加到主遊戲循環中。
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"
最後,您需要處理用戶輸入以處理用戶的選擇。您可以在主遊戲循環中添加一個 if 語句來檢查用戶是否按下了重啟或退出按鈕。
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()
使用此代碼,遊戲將在用戶按下鍵盤上的“R”按鈕時重新開始,並在用戶按下鍵盤上的“Q”按鈕時退出。
以下是完整代碼:
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
代碼首先導入pygame模塊並對其進行初始化。然後它創建一個遊戲窗口並聲明必要的遊戲變量,包括玩家和障礙物的位置、尺寸和遊戲狀態。
該代碼定義了兩個函數,draw_start_menu()和draw_game_over_screen(),用於繪製開始菜單和遊戲結束屏幕。這些函數使用 PyGame 函數在屏幕上繪製文本和按鈕。
主遊戲循環從處理事件和檢查遊戲狀態開始。如果遊戲狀態為start_menu,則開始菜單會繪製到屏幕上。如果遊戲狀態為game_over,則遊戲結束畫面會繪製到屏幕上。如果遊戲狀態為其他狀態,遊戲會更新並將玩家和障礙物繪製到屏幕上。
遊戲通過處理按鍵和檢查玩家與障礙物之間的碰撞來更新。如果發生碰撞,遊戲會將 game_over標誌設置為True並將游戲狀態設置為game_over。
遊戲更新後,玩家和障礙物被繪製到屏幕上。最後,代碼檢查是否設置了game_over標誌,如果是,則重置標誌並將游戲狀態設置為game_over。
這個過程不斷重複,直到遊戲窗口關閉。
通過具有視覺吸引力的 UI 提高用戶參與度
使用設計良好的用戶界面 (UI) 可以大大提高 PyGame 遊戲中的用戶參與度。清晰易讀的字體、視覺上吸引人的圖形、輕鬆的導航和用戶反饋都是設計 UI 時需要考慮的重要元素。通過實施這些元素,您可以創建有助於保持玩家興趣並沉浸在遊戲中的 UI。
請記住測試您的 UI 並收集玩家的反饋,以確保它能夠有效地提高參與度。總的來說,花時間創建強大的 UI 可以極大地提高玩家的遊戲體驗和樂趣。
發佈留言