關于“Python”的核心知識點整理大全38

14.1.1 創建 Button 類

由于Pygame沒有內置創建按鈕的方法,我們創建一個Button類,用于創建帶標簽的實心矩形。 你可以在游戲中使用這些代碼來創建任何按鈕。下面是Button類的第一部分,請將這個類保存為 文件button.py:

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

首先,我們導入了模塊pygame.font,它讓Pygame能夠將文本渲染到屏幕上。方法__init__() 接受參數self,對象ai_settings和screen,以及msg,其中msg是要在按鈕中顯示的文本(見1)。 我們設置按鈕的尺寸(見2),然后通過設置button_color讓按鈕的rect對象為亮綠色,并通過設 置text_color讓文本為白色。 在(見3)處,我們指定使用什么字體來渲染文本。實參None讓Pygame使用默認字體,而48 指定了文本的字號。為讓按鈕在屏幕上居中,我們創建一個表示按鈕的rect對象(見4),并將 其center屬性設置為屏幕的center屬性。

Pygame通過將你要顯示的字符串渲染為圖像來處理文本。在5處,我們調用prep_msg()來處 理這樣的渲染。 prep_msg()的代碼如下:

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

方法prep_msg()接受實參self以及要渲染為圖像的文本(msg)。調用font.render()將存儲在 msg中的文本轉換為圖像,然后將該圖像存儲在msg_image中(見1)。方法font.render()還接受 一個布爾實參,該實參指定開啟還是關閉反鋸齒功能(反鋸齒讓文本的邊緣更平滑)。余下的兩 個實參分別是文本顏色和背景色。我們啟用了反鋸齒功能,并將文本的背景色設置為按鈕的顏色 (如果沒有指定背景色,Pygame將以透明背景的方式渲染文本)。

在2處,我們讓文本圖像在按鈕上居中:根據文本圖像創建一個rect,并將其center屬性設 置為按鈕的center屬性。

最后,我們創建方法draw_button(),通過調用它可將這個按鈕顯示到屏幕上:

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

我們調用screen.fill()來繪制表示按鈕的矩形,再調用screen.blit(),并向它傳遞一幅圖 像以及與該圖像相關聯的rect對象,從而在屏幕上繪制文本圖像。至此,Button類便創建好了。

14.1.2 在屏幕上繪制按鈕

我們將使用Button類來創建一個Play按鈕。鑒于只需要一個Play按鈕,我們直接在 alien_invasion.py中創建它,如下所示:

alien_invasion.py
--snip--
from game_stats import GameStats
from button import Button
--snip--
def run_game():--snip--pygame.display.set_caption("Alien Invasion")# 創建Play按鈕
1 play_button = Button(ai_settings, screen, "Play")
--snip--# 開始游戲主循環while True:--snip--
2 gf.update_screen(ai_settings, screen, stats, ship, aliens, bullets,play_button) 
run_game() 

我們導入Button類,并創建一個名為play_button的實例(見1),然后我們將play_button傳 遞給update_screen(),以便能夠在屏幕更新時顯示按鈕(見2)。

接下來,修改update_screen(),以便在游戲處于非活動狀態時顯示Play按鈕:

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

為讓Play按鈕位于其他所有屏幕元素上面,我們在繪制其他所有游戲元素后再繪制這個按 鈕,然后切換到新屏幕。如果你現在運行這個游戲,將在屏幕中央看到一個Play按鈕,如圖14-1 所示。

14.1.3 開始游戲

為在玩家單擊Play按鈕時開始新游戲,需在game_functions.py中添加如下代碼,以監視與這 個按鈕相關的鼠標事件:

game_functions.py
def check_events(ai_settings, screen, stats, play_button, ship, bullets):"""響應按鍵和鼠標事件"""for event in pygame.event.get():if event.type == pygame.QUIT:--snip--
1 elif event.type == pygame.MOUSEBUTTONDOWN:
2 mouse_x, mouse_y = pygame.mouse.get_pos()
3 check_play_button(stats, play_button, mouse_x, mouse_y)
def check_play_button(stats, play_button, mouse_x, mouse_y):"""在玩家單擊Play按鈕時開始新游戲"""
4 if play_button.rect.collidepoint(mouse_x, mouse_y):stats.game_active = True 

我們修改了check_events()的定義,在其中添加了形參stats和play_button。我們將使用stats 來訪問標志game_active,并使用play_button來檢查玩家是否單擊了Play按鈕。

無論玩家單擊屏幕的什么地方,Pygame都將檢測到一個MOUSEBUTTONDOWN事件(見1),但我 們只想讓這個游戲在玩家用鼠標單擊Play按鈕時作出響應。為此,我們使用了pygame.mouse. get_pos(),它返回一個元組,其中包含玩家單擊時鼠標的x和y坐標(見2)。我們將這些值傳遞 給函數check_play_button()(見3),而這個函數使用collidepoint()檢查鼠標單擊位置是否在 Play按鈕的rect內(見4)。如果是這樣的,我們就將game_active設置為True,讓游戲就此開始! 在alien_invasion.py中調用check_events(),需要傳遞另外兩個實參——stats和play_ button:

alien_invasion.py
# 開始游戲主循環while True:gf.check_events(ai_settings, screen, stats, play_button, ship,bullets)--snip--

至此,你應該能夠開始這個游戲了。游戲結束時,game_active應為False,并重新顯示Play 按鈕。

14.1.4 重置游戲

前面編寫的代碼只處理了玩家第一次單擊Play按鈕的情況,而沒有處理游戲結束的情況,因 為沒有重置導致游戲結束的條件。

為在玩家每次單擊Play按鈕時都重置游戲,需要重置統計信息、刪除現有的外星人和子彈、 創建一群新的外星人,并讓飛船居中,如下所示:

game_functions.py
def check_play_button(ai_settings, screen, stats, play_button, ship, aliens,bullets, mouse_x, mouse_y):"""在玩家單擊Play按鈕時開始新游戲"""if play_button.rect.collidepoint(mouse_x, mouse_y):# 重置游戲統計信息
1 stats.reset_stats()stats.game_active = True# 清空外星人列表和子彈列表
2 aliens.empty()bullets.empty()# 創建一群新的外星人,并讓飛船居中
3 create_fleet(ai_settings, screen, ship, aliens)ship.center_ship()

我們更新了check_play_button()的定義,使其能夠訪問ai_settings、stats、ship、aliens 和bullets。為重置在游戲期間發生了變化的設置以及刷新游戲的視覺元素,它需要這些對象。 在1處,我們重置了游戲統計信息,給玩家提供了三艘新飛船。接下來,我們將game_active 設置為True(這樣,這個函數的代碼執行完畢后,游戲就會開始),清空編組aliens和bullets(見 2),創建一群新的外星人,并將飛船居中(見3)。 check_events()的定義需要修改,調用check_play_button()的代碼亦如此:

game_functions.py
def check_events(ai_settings, screen, stats, play_button, ship, aliens,bullets):"""響應按鍵和鼠標事件"""for event in pygame.event.get():if event.type == pygame.QUIT:--snip--elif event.type == pygame.MOUSEBUTTONDOWN:mouse_x, mouse_y = pygame.mouse.get_pos()
1 check_play_button(ai_settings, screen, stats, play_button, ship,aliens, bullets, mouse_x, mouse_y) 

check_events()的定義需要形參aliens,以便將它傳遞給check_play_button()。接下來,我 們修改了調用check_play_button()的代碼,以將合適的實參傳遞給它(見1)。 下面來修改alien_invasion.py中調用check_events()的代碼,以將實參aliens傳遞給它:

alien_invasion.py
 # 開始游戲主循環while True: gf.check_events(ai_settings, screen, stats, play_button, ship,aliens, bullets)--snip--

現在,每當玩家單擊Play按鈕時,這個游戲都將正確地重置,讓玩家想玩多少次就玩多少次!


往期快速傳送門👆(在文章最后):

感謝大家的支持!歡迎訂閱收藏!專欄將持續更新!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/279032.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/279032.shtml
英文地址,請注明出處:http://en.pswp.cn/news/279032.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

同步您的Google Chrome書簽,主題等

Do you regularly use Google Chrome on multiple computers? Here’s how you can keep almost everything in your browser synced easily in Google Chrome. 您是否經常在多臺計算機上使用Google Chrome? 您可以通過以下方法在Google Chrome瀏覽器中輕松同步瀏…

Python中函數的參數傳遞與可變長參數

轉自旭東的博客原文 Python中函數的參數傳遞與可變長參數 Python中傳遞參數有以下幾種類型: (1)像C一樣的默認缺省函數 (2)根據參數名傳參數 (3)可變長度參數 示例如下: &#xff08…

matlab的plot沒有反應,用plot畫圖沒有反應

本帖最后由 躺著看雨 于 2018-6-7 10:35 編輯0.0854232732222489 -1.47227270375083e-08 17.0844721322814 17.08465464444980.0854232767446789 -1.41282430199396e-08 17.0844728367686 17.08465534893580.0854232802671089 …

轉]MATLAB 與 C 語言的接口

MATLAB 到 C 語言程序的轉換可以由兩種途徑完成,其一是 MATLAB 自己提供的 C 語言翻譯程序 mcc, 另一種是原第 3 方公司 MathTools 開發的 MATCOM。后者出現較早,功能遠比 MATLAB 自己的翻譯程序強大,所以 MathTools 公司已經被 MathWorks 公…

找call寫call_如何將Google Call Widget添加到任何網頁

找call寫callAdding a Google Call Widget to your website or blog allows visitors to contact you using your Google Voice number. The widget provides an easy and cost-effective way to provide live customer support without the customer knowing your real number…

XML與web開發-01- 在頁面顯示和 XML DOM 解析

前言: 關于 xml 特點和基礎知識,可以菜鳥教程進行學習:http://www.runoob.com/xml/xml-tutorial.html 本系列筆記,主要介紹 xml 在 web 開發時需要了解的知識 XML 在頁面顯示數據 XML 指可擴展標記語言(eXtensible Mar…

酷安應用市場php源碼,酷安應用市場 v11.0.3-999 去廣告極限精簡版

酷安,真實有趣的數碼社區。酷安app,國內安卓應用市場客戶端,應用資源豐富,應用開發者水準高,應用無首發Logo,原汁原味上架,得到了安卓用戶群廣泛認可。有人說現在的酷安市場(酷安網)沒有以前那么…

再戰android-語音識別2(修改配置)

可怕的半桶水一直在晃。程序中需要根據用戶的選擇設置語音識別的語言(目前科大訊飛支持英文、普通話、粵語),不想每次要用戶去IatSetting中去改,需要能直接修改IatSetting的設置。之前移植的IatSetting頁面沒有細究,直…

chromebook刷機_如何將網站添加到您的Chromebook架子上

chromebook刷機Bookmarks are great to keep your favorite sites nearby, but they aren’t the fastest option out there. Instead, why not add shortcuts for your favorite websites right on the Chromebook shelf? 書簽可以很好地將您喜歡的網站保留在附近&#xff0c…

php判斷外鏈,php檢查字符串中是否有外鏈的方法

這篇文章主要介紹了php檢查字符串中是否有外鏈的方法,涉及php針對字符串的正則匹配的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下本文實例講述了php檢查字符串中是否有外鏈的方法。分享給大家供大家參考。具體實現方法如下:/*** is_external_link 檢測字符…

【經驗分享】產品、運營人如何告別重復的數據分析工作?

我是一名互聯網的運營打雜MM,除了每天繁忙的工作,每周、每月的數據匯報也是我頭疼的東東。因為本身我不聰明,數學也不是太好,對數據不那么愛,而且還要做數據分析,對于我這種數據小白分分鐘崩潰。每周、每月…

JVM虛擬機調參

JVM虛擬機調參 一、堆大小設置JVM 中最大堆大小有三方面限制:相關操作系統的數據模型(32-bt還是64-bit)限制;系統的可用虛擬內存限制;系統的可用物理內存限制。32位系統下,一般限制在1.5G~2G;64…

Locktopus鎖定iOS設備上的單個應用程序

If you want to share a cool game on your iOS device but not let everyone read your email, Locktopus offers a simple app-by-app lockdown solution. 如果您想在iOS設備上共享一個很棒的游戲,但又不想讓所有人都閱讀您的電子郵件,那么Locktopus提…

php speedtest,大神教你如何搭建自己的web speedtest站點

導讀speedtest作為一款在線并且可視化的網速測試工具。使用方法簡單,無需下載、安裝多余軟件,只需有瀏覽器即可。那如何搭建一個自己的web speedtest站點呢?項目開源地址:https://github.com/adolfintel/speedtest安裝web,php,git…

MySQL服務器硬件和操作系統調節

1. 擁有足夠的物理內存來把整個InnoDB文件加載到內存中——在內存中訪問文件時的速度要比在硬盤中訪問時快的多。 2. 不惜一切代價避免使用Swap交換分區 – 交換時是從硬盤讀取的,它的速度很慢。 3. 使用電池供電的RAM(注:RAM即隨機存儲器&am…

數據結構小結+模板

\[OI中的數據結構\] \[By\;TYQ\] 線性結構 大部略 單調棧 棧 , 但是push的時候要彈出所有比他小/大的(多用于優化Dp) 單調隊列 隊列 , 同單調棧 樹狀結構 樹狀數組 核心:lowbit(x) (x) & (-x) ...其實lowbit(x) 2^x的最低非0位 PION8012初賽中考了...但只涉及正數... 為什…

視頻翻錄_將DVD解密并復制到硬盤驅動器而無需翻錄

視頻翻錄Have you ever wanted to make backup copies of your DVDs but didn’t want to mess with confusing DVD ripping software? Today, we’ll look at drop dead simple method to decrypt DVDs on the fly with DVD43 so you can easily copy them to your hard dri…

詳解面向對象、構造函數、原型與原型鏈

詳解面向對象、構造函數、原型與原型鏈 為了幫助大家能夠更加直觀的學習和了解面向對象,我會用盡量簡單易懂的描述來展示面向對象的相關知識。并且也準備了一些實用的例子幫助大家更加快速的掌握面向對象的真諦。 jQuery的面向對象實現封裝拖拽簡易版運動框架封裝這…

如何將Wii遙控器用作陀螺儀鼠標

If you have a spare Nintendo Wii remote with the Motion Plus add-on, you can use it to control your Windows PC from across the room. Here’s how to get it working in a couple of easy steps. 如果您有帶Motion Plus附加組件的備用Nintendo Wii遙控器,則…

68.iOS設備尺寸及型號代碼(iPhoneXR/XS)

所有設備型號官網地址: https://www.theiphonewiki.com/wiki/Models iPhone: 機型像素比例像素密度屏幕尺寸機型代碼發布日期iPhone 2g4803203:2163ppi3.5iPhone1,12008.01iPhone 3g4803203:2163ppi3.5iPhone1,22008.06iPhone 3gs4803203:2163ppi3.5iPhone2,12009.0…