日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于pygame的射击小游戏制作(五)绘制开始按钮

發布時間:2025/3/12 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于pygame的射击小游戏制作(五)绘制开始按钮 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在本篇文章中,主要學習如何在Pygame中繪制按鈕,并點擊按鈕開始游

一、編程思路

1.1 修改游戲活動狀態

在上篇文章中,我們通過game_active標志來控制游戲的進行與停止。我們需要在點擊“play”按鈕后游戲才開始運行。因此將game_active = False。游戲在開始時處于非活動狀態,等待點擊play后運行。

def __init__(self, ai_settings):"""初始化統計信息"""self.ai_settings = ai_settingsself.reset_stats()# 讓游戲一開始處于非活動狀態self.game_active = False

1.2 創建Button類

pygame中沒有內置創建按鈕的方法,故我們采取最原始的方法繪制一個帶標簽的矩形。
button,py

import pygame.font class Button():def __init__(self, ai_settings, screen, msg):"""初始化按鈕的屬性"""self.screen = screenself.screen_rect = screen.get_rect()#設置按鈕的尺寸和其他屬性self.width, self.height = 200, 50self.button_color = (0, 255, 0)self.text_color = (255, 255, 255)self.font = pygame.font.SysFont(None, 48)#創建按鈕的rect對象,居中self.rect = pygame.Rect(0,0,self.width,self.height)self.rect.center = self.screen_rect.center#按鈕的標簽只需創建一次self.prep_msg(msg)

pygame.font的作用是將文本渲染到屏幕上,msg是顯示按鈕里的文本。

def prep_msg(self, msg):"""將msg渲染為圖像,并使其在按鈕上居中"""self.msg_image = self.font.render(msg,True,self.text_color,self.button_color)self.msg_image_rect = self.msg_image.get_rect()self.msg_image_rect.center = self.rect.center

prep_msg()將參數和文字渲染為msg,調用font.render()把msg中的文本轉換為圖像,存儲在msg_image中,讓文本圖像在按鈕上居中。

def draw_button(self):#繪制一個用顏色填充的按鈕,再繪制文本self.screen.fill(self.button_color,self.rect)self.screen.blit(self.msg_image,self.msg_image_rect)

draw_button()將按鈕顯示到屏幕上。
最后再alien_invasion.py中引入Button類,創建Play按鈕,在gf.update_screen()中添加play_button實參,就可以在屏幕上顯示button按鈕了。

#創建play按鈕play_button = Button(ai_settings, screen, "Play")"""游戲主循環"""while True:"""監視鍵鼠事件"""gf.check_events(ai_settings, screen, ship, bullets)if stats.game_active:ship.update()#print(len(bullets))gf.update_bullets(ai_settings, screen, ship, aliens, bullets)gf.update_aliens(ai_settings, stats, screen, ship, aliens, bullets)gf.update_screen(ai_settings, screen, stats, ship,aliens, bullets, play_button)

修改update_screen(),如果game_active為false,就繪制play按鈕。

def update_screen(ai_settings, screen, stats, ship, aliens, bullets,play_button):"""更新屏幕上的圖像,并切換到新屏幕"""--snip--# 如果游戲處于非活動狀態,就繪制Play按鈕if not stats.game_active:play_button.draw_button()# 讓最近繪制的屏幕可見pygame.display.flip()

運行效果如下:

1.3 添加鼠標響應事件

修改check_events()的定義,在其中添加了形參stats和play_button。使用stats來訪問標志game_active,并使用play_button來檢查玩家是否單擊了Play按鈕。
通過pygame.mouse.get_pos()來獲得鼠標單擊時的xy坐標,判斷該坐標是否處于“play”按鈕的rect坐標,如果處于就認為單擊了按鈕,game_active = True,游戲開始。

def check_events(ai_settings, screen, stats, play_button, ship, bullets):#鍵鼠響應for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type == pygame.KEYDOWN:check_keydown_events(event, ai_settings, screen, ship, bullets)elif event.type == pygame.KEYUP:check_keyup_events(event, ship)elif event.type == pygame.MOUSEBUTTONDOWN:mouse_x, mouse_y = pygame.mouse.get_pos()check_play_button(stats, play_button, mouse_x,mouse_y)

在alien_invasion.py中調用check_events(),需要傳遞另外兩個實參——stats和play_button

while True:"""監視鍵鼠事件"""gf.check_events(ai_settings, screen, stats, play_button,ship, bullets)

1.4 重置游戲

在1.3中我們添加了單擊按鈕開始游戲,但是沒有處理游戲結束的情況。在玩家每次點擊play按鈕時都重置游戲,我們在check_play_button()中重置統計信息、刪除現有的外星人和子彈、創建一群新的外星人,并讓飛船居中。

def check_play_button(ai_settings, screen, stats,play_button, ship, aliens,bullets, mouse_x, mouse_y):"""單擊按鈕時開始新游戲"""if play_button.rect.collidepoint(mouse_x, mouse_y):#重置游戲統計信息stats.reset_stats()stats.game_active = True#清空外星人列表和子彈列表aliens.empty()bullets.empty()#創建一群新的外星人create_fleet(ai_settings,screen,ship,aliens)ship.center_ship()

再修改check_events()和check_play_button()的形參。

def check_events(ai_settings, screen, stats, play_button, ship, aliens,bullets):#鍵鼠響應for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type == pygame.KEYDOWN:check_keydown_events(event, ai_settings, screen, ship, bullets)elif event.type == pygame.KEYUP:check_keyup_events(event, ship)elif event.type == pygame.MOUSEBUTTONDOWN:mouse_x, mouse_y = pygame.mouse.get_pos()check_play_button(ai_settings, screen, stats,play_button, ship,aliens,bullets, mouse_x, mouse_y)

alien_invasion.py

"""監視鍵鼠事件"""gf.check_events(ai_settings, screen, stats, play_button, ship,aliens, bullets)

1.5 隱藏按鈕和光標

在游戲運行時,即便按鈕不可見,但只要鼠標單擊原來按鈕所在的游戲時還是會做出響應。因此我們將響應條件改為在game_active=False時才開始。同理光標得修改也如此。

def check_play_button(ai_settings, screen, stats,play_button, ship, aliens,bullets, mouse_x, mouse_y):"""單擊按鈕時開始新游戲"""button_clicked = play_button.rect.collidepoint(mouse_x, mouse_y)if button_clicked and not stats.game_active:#隱藏光標pygame.mouse.set_visible(False)#重置游戲統計信息stats.reset_stats()stats.game_active = True#清空外星人列表和子彈列表aliens.empty()bullets.empty()#創建一群新的外星人create_fleet(ai_settings,screen,ship,aliens)ship.center_ship()

在游戲結束后,我們需要重新顯示光標,能夠點擊按鈕,故將ship_hit()函數修改如下:

def ship_hit(ai_settings, stats, screen, ship, aliens, bullets):"""響應被外星人撞到的飛船"""if stats.ships_left > 0:#將ships_left減1stats.ships_left -= 1#清空外星人列表和子彈列表aliens.empty()bullets.empty()#創建新的外星人create_fleet(ai_settings, screen, ship, aliens)ship.center_ship()#暫停sleep(0.5)else:stats.game_active = Falsepygame.mouse.set_visible(True)

總結

以上是生活随笔為你收集整理的基于pygame的射击小游戏制作(五)绘制开始按钮的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。