基于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 = False1.2 創建Button類
pygame中沒有內置創建按鈕的方法,故我們采取最原始的方法繪制一個帶標簽的矩形。
button,py
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.centerprep_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按鈕了。
修改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,游戲開始。
在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的射击小游戏制作(五)绘制开始按钮的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么叫做项目孵化_蓝莓孵化营12进5争夺
- 下一篇: shiro框架,自定义realm注入se