# 昨日知識點回顧
如何創建多行外星人
碰撞結束游戲
創建game_stats.py跟蹤統計信息
# 今日知識點學習
第14章 記分
14.1 添加Play按鈕
? ? ? ? 14.1.1 創建Button類
import pygame.font# button.py
class Button:def __init__(self, ai_game, msg):"""初始化按鈕的屬性"""self.screen = ai_game.screenself.screen_rect = self.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)def _prep_msg(self, msg):"""將msg渲染為圖像,并使其在按鈕上居中"""# 方法font.render()接受一個布爾實參,該實參制定開啟還是關閉反鋸齒功能(反鋸齒讓文本的邊緣更平滑)# 后面兩個實參分別是文本顏色和背景色(如果沒有指定背景色,pygame渲染文本時將使用透明背景)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.centerdef draw_button(self):# 繪制一個用顏色填充的按鈕,再繪制文本self.screen.fill(self.button_color, self.rect)# screen.blit傳遞一幅圖像以及與該圖像相關聯的rectself.screen.blit(self.msg_image, self.msg_image_rect)
? ? ? ? 14.1.2 在屏幕上繪制按鈕????????
# 主程序
import sys
from time import sleepimport pygamefrom Settings import Settings
from game_stats import GameStats
from button import Button
from Ship import Ship
from alien import Alien
from bullet import Bulletclass AlienInvasion:"""管理游戲資源和行為的類"""def __init__(self):"""初始化游戲并創建游戲資源"""pygame.init()self.settings = Settings()# 非全屏運行self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))# 全屏運行# self.screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)# self.settings.screen_width = self.screen.get_rect().width# self.settings.screen_height = self.screen.get_rect().height# 設置當前窗口標題pygame.display.set_caption("Alien Invasion")# 創建一個用于存儲游戲統計信息的實例self.stats = GameStats(self)self.ship = Ship(self)# 創建子彈精靈組self.bullets = pygame.sprite.Group()# 創建外星人精靈組self.aliens = pygame.sprite.Group()self._create_fleet()# 創建Play按鈕self.play_button = Button(self, "Play")-----snip-----def _update_screen(self):"""更新屏幕上的圖像,并切換到新屏幕。"""self.screen.fill(self.settings.bg_color)self.ship.blitme()for bullet in self.bullets.sprites():bullet.draw_bullet()self.aliens.draw(self.screen)# 如果游戲處于非活動狀態,就繪制Play按鈕if not self.stats.game_active:self.play_button.draw_button()# 讓最近繪制的屏幕可見pygame.display.flip()
-----snip-----
????????運行結果:(Play按鈕出現)
? ? ? ? ?14.1.3 開始游戲
# 主程序
----snip----def _check_events(self):"""響應按鍵和鼠標事件"""for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type == pygame.KEYDOWN:self._check_keydown_events(event)elif event.type == pygame.KEYUP:self._check_keyup_events(event)elif event.type == pygame.MOUSEBUTTONDOWN:# 玩家鼠標點擊Play按鈕做出響應# pygame.mouse.get_pos()返回玩家單擊時鼠標(x,y)元組mouse_pos = pygame.mouse.get_pos()self._check_play_button(mouse_pos)def _check_play_button(self, mouse_pos):"""在玩家單擊Play按鈕時開始新游戲"""if self.play_button.rect.collidepoint(mouse_pos):self.stats.game_active = True
----snip----
? ? ? ? 14.1.4 重置游戲
# 主程序def _check_play_button(self, mouse_pos):"""在玩家單擊Play按鈕時開始新游戲"""if self.play_button.rect.collidepoint(mouse_pos):# 重置游戲統計信息self.stats.reset_stats()self.stats.game_active = True# 清空余下的外星人和子彈self.aliens.empty()self.bullets.empty()# 創建一群新的外星人并讓飛船居中self._create_fleet()self.ship.center_ship()
? ? ? ? 14.1.5 將Play按鈕切換到非活動狀態
# 主程序def _check_play_button(self, mouse_pos):"""在玩家單擊Play按鈕時開始新游戲"""# game_active為False時游戲才開始并顯示Play按鈕button_clicked = self.play_button.rect.collidepoint(mouse_pos)if button_clicked and not self.stats.game_active:# 重置游戲統計信息self.stats.reset_stats()self.stats.game_active = True# 清空余下的外星人和子彈self.aliens.empty()self.bullets.empty()# 創建一群新的外星人并讓飛船居中self._create_fleet()self.ship.center_ship()
? ? ? ? 14.1.6 隱藏鼠標光標
# 主程序def _check_play_button(self, mouse_pos):"""在玩家單擊Play按鈕時開始新游戲"""# game_active為False時游戲才開始并顯示Play按鈕button_clicked = self.play_button.rect.collidepoint(mouse_pos)if button_clicked and not self.stats.game_active:# 重置游戲統計信息self.stats.reset_stats()self.stats.game_active = True# 清空余下的外星人和子彈self.aliens.empty()self.bullets.empty()# 創建一群新的外星人并讓飛船居中self._create_fleet()self.ship.center_ship()# 隱藏鼠標光標pygame.mouse.set_visible(False)def _ship_hit(self):"""響應飛船被外星人撞到"""if self.stats.ships_left > 0:# 將Ship_left減1self.stats.ships_left -= 1# 清空余下的外星人和子彈self.aliens.empty()self.bullets.empty()# 創建一批新的外星人,并將飛船放到屏幕底部的中央self._create_fleet()self.ship.center_ship()# 暫停sleep(0.5)else:self.stats.game_active = False# 游戲結束,重新顯示光標pygame.mouse.set_visible(True)