Python之深入解析如何使用Python Kivy实现一个“乒乓球”游戏
生活随笔
收集整理的這篇文章主要介紹了
Python之深入解析如何使用Python Kivy实现一个“乒乓球”游戏
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、前言
- 本文是基于 Kivy 開源跨平臺(tái)的 Python 框架上創(chuàng)作的,Kivy 開源跨平臺(tái)的 Python 框架能用于開發(fā)多點(diǎn)觸控的用戶界面程序,允許快速簡單的交互設(shè)計(jì),非常方便。
- 那么,如何使用 Kivy 編寫一款乒乓球游戲呢?我們將從一個(gè)基本的應(yīng)用程序開始,描述創(chuàng)建這個(gè)游戲的每個(gè)步驟。
- Kivy 是用 Python 和 Cython 編寫的,基于 OpenGL ES 2,支持各種輸入設(shè)備并擁有豐富的部件庫。使用相同的代碼,可直接實(shí)現(xiàn)多平臺(tái)應(yīng)用,包括 Windows、macOS、Linux、Android 和 iOS。
- 所有 Kivy 部件都支持多點(diǎn)觸控。
- 實(shí)現(xiàn)效果,一睹為快:
二、準(zhǔn)備
① Python 安裝
- 在 windows 上安裝 Python:
-
- 下載 Python 的最新版本:訪問鏈接 Python 官網(wǎng),在 Windows 操作系統(tǒng)上安裝 Python 3.10.0,大家也可以自行選擇最新版的下載。
-
- 進(jìn)入下一個(gè)頁面后,拉到最下面,選擇 Windows embeddable package (64-bit) 下載:
-
- 雙擊下載完成的應(yīng)用程序,記得一定要勾選 ADD Python 3.7 to PATH,否則 cmd 無法運(yùn)行 Python,然后選擇 Install Now 進(jìn)行安裝,默認(rèn)會(huì)安裝 pip,而且將安裝到 C 盤(推薦)。如果希望換一個(gè)盤安裝,可以點(diǎn)擊 Customize installation 在里面選擇其他的盤。
- 在 macOS 上安裝 Python:
-
- 其實(shí) macOS 上是默認(rèn)安裝了 Python 的,只不過版本是 Python2.7,其相對(duì)于現(xiàn)在的 Python 3 缺少了很多特性,而且速度也比 Python 3 慢,因此還是建議大家裝 Python 3。
-
- 同樣地,下載 Python 的最新版本,訪問鏈接:Python 官網(wǎng),在 macOS 操作系統(tǒng)上安裝 Python 3.7.4,大家也可以自行選擇最新版的下載。
-
- 進(jìn)入下一個(gè)頁面后,拉到最下面,選擇 macOS 64-bit universal2 installer 下載:
-
- 下載完成后得到一個(gè) pkg 文件,雙擊打開,按照指示步驟進(jìn)行安裝即可。
② 安裝依賴
- 請(qǐng)選擇以下任一種方式輸入命令安裝依賴:
-
- Windows 環(huán)境打開 Cmd (開始-運(yùn)行-CMD);
-
- MacOS 環(huán)境打開 Terminal (command + 空格輸入 Terminal);
-
- 如果用的是 VSCode 編輯器或 Pycharm,可以直接使用界面下方的 Terminal:
三、簡單使用 Kivy
- 首先,簡單介紹 Kivy 的基本使用,為游戲創(chuàng)建一個(gè)目錄和一個(gè)名為 main.py 的文件:
- 在命令行中輸入 python main.py 運(yùn)行該應(yīng)用程序,它應(yīng)該只顯示一個(gè)黑色的窗口。因此我們所做的只是創(chuàng)建一個(gè)非常簡單的 Kivy 應(yīng)用程序,它創(chuàng)建了一個(gè) PongGame Widget 類的實(shí)例,并將其作為應(yīng)用程序用戶界面的根元素返回。
- 在這一點(diǎn)上應(yīng)該把它想象成一個(gè) Widget 的分層樹,Kivy 將這個(gè) Widget 放在默認(rèn)的窗口中。在下一步,我們將通過定義 PongGame 小部件的外觀來繪制 Pong 的背景和游戲分?jǐn)?shù)。
四、Kivy - 添加簡單圖形
- 我們將使用一個(gè) .kv 文件來定義 PongGame 類的外觀,由于應(yīng)用程序類被稱為 PongApp,可以簡單地在同一目錄下創(chuàng)建一個(gè)名為 pong.kv 的文件,當(dāng)應(yīng)用程序運(yùn)行時(shí)將會(huì)自動(dòng)加載。
- 因此,為了定義游戲的外觀,創(chuàng)建一個(gè)名為 pong.kv 的新文件并添加以下內(nèi)容:
- 注意一個(gè)常見錯(cuò)誤:kv文件的名稱,例如 pong.kv,必須與應(yīng)用程序的名稱一致,例如 PongApp(Ap p結(jié)尾之前的部分)。
- 如果現(xiàn)在運(yùn)行這個(gè)應(yīng)用程序,應(yīng)該看到中間有一個(gè)豎條,還有兩個(gè)零,那里將顯示玩家的分?jǐn)?shù),如下所示:
- 可以看到,在第一行有:
- 每個(gè) kv 文件都需要第一行,它應(yīng)該以 #:kivy 及一個(gè)空格開頭,然后是它要使用的 Kivy 版本(因此 Kivy 可以確保您至少擁有所需的版本,或者稍后處理向后兼容性)。
- 再往下看 kv 文件里定義了三個(gè)元素,一個(gè) canvas 和兩個(gè) label:
-
- 先說說兩個(gè) label,它們代表的是左右兩個(gè)數(shù)字,設(shè)定了 font_size(字體大小), center_x(中心位置), top(離頂部距離),text(文本),此外可以看到 root.width 和 root.top 的使用,這樣寫的好處是能跟跟隨窗口寬度和高度的變化而變化。
-
- 另一個(gè)元素 canvas,它的下面定義了 Rectangle 參數(shù),意思是向畫布添加一個(gè)矩形,將矩形的 pos 設(shè)置為小部件水平中心左側(cè) 5 個(gè)像素,y 設(shè)置為 0,這就定義了矩形的顯示位置。
- 矩形的大小 size 設(shè)置為寬度為 10 像素,高度為小部件的高度,像這樣定義圖形的好處是,當(dāng)值表達(dá)式中使用的任何小部件的屬性發(fā)生變化時(shí),渲染的矩形將自動(dòng)更新。
五、Kivy - 增加乒乓球球體
- 現(xiàn)在有了一個(gè)基本的乒乓球場(雖然很簡陋),但我們?nèi)匀恍枰蚺暮鸵粋€(gè)球來打球。從球開始,添加一個(gè)新的 PongBall 類來創(chuàng)建一個(gè)小部件,它將成為我們的球并使它彈跳起來。
- PongBall 類:
- 白球的 kv 配置如下:
- 為了使這一切順利進(jìn)行,還必須為球體增加所用的 Property 屬性類,如下,是這一步更新后的 python 代碼和 kv 文件:
- kv 文件如下:
六、Kivy - 增加乒乓球體運(yùn)動(dòng)
- 現(xiàn)在我們的目的是讓這個(gè)球動(dòng)起來,因此必須定期調(diào)用 move 函數(shù)讓它動(dòng)起來。使用 Kivy 提供的 Clock 函數(shù)可以輕易地做到這一點(diǎn):
- 這一行將導(dǎo)致游戲?qū)ο蟮母潞瘮?shù)每秒被調(diào)用 60 次。
- 不過還有一個(gè)問題,想確保 PongBall 的移動(dòng)函數(shù)被定期調(diào)用,但是在代碼中沒有任何對(duì)球?qū)ο蟮囊?#xff0c;因?yàn)橹皇峭ㄟ^ kv 文件在 PongGame 類的 kv 規(guī)則中添加了它。
- 由于要做的不僅僅是移動(dòng)球(比如把球從墻上彈下來,然后再彈到球員的球拍上),我們可能需要為 PongGame 類建立一個(gè)更新方法:
- 然而,這仍然不能改變我們沒有對(duì) kv 規(guī)則所創(chuàng)建的 PongBall 進(jìn)行操作的這一事實(shí)。為了解決這個(gè)問題,可以給 PongGame 類添加一個(gè) ObjectProperty,并將其與 kv 規(guī)則中創(chuàng)建的 widget 掛鉤。
- 一旦這樣做了,就可以很容易地在更新方法中引用球的屬性,甚至可以讓它從邊緣彈起:
- 在 kv 文件中將其與代碼中設(shè)定的 id: ball 映射起來:
七、Kivy - 球拍移動(dòng)事件
- 現(xiàn)在,球正在彈來彈去,唯一缺少的是可移動(dòng)的球拍和對(duì)分?jǐn)?shù)的跟蹤。這里不會(huì)再去討論創(chuàng)建類和 kv 規(guī)則的所有細(xì)節(jié),因?yàn)檫@些概念已經(jīng)在前面的步驟中涵蓋了。
- 相反,把重點(diǎn)放在如何響應(yīng)用戶的輸入而移動(dòng)球拍上,在 Kivy 中,小部件可以通過實(shí)現(xiàn) on_touch_down、on_touch_move 和 on_touch_up 方法對(duì)輸入做出反應(yīng)。默認(rèn)情況下,Widget 類實(shí)現(xiàn)這些方法時(shí),只是在其子部件上調(diào)用相應(yīng)的方法來傳遞事件,直到其中一個(gè)子部件返回 True。
- 乒乓運(yùn)動(dòng)是非常簡單的,球拍只需要向上和向下移動(dòng)。事實(shí)上,它是如此簡單,甚至不需要讓球員小部件自己處理事件,只需為 PongGame 類實(shí)現(xiàn) on_touch_move 函數(shù):
- 我們將在 NumericProperty 中保留每個(gè)球員的分?jǐn)?shù),PongGame 的分?jǐn)?shù)標(biāo)簽通過改變 NumericProperty score 來保持更新,這反過來又會(huì)更新 PongGame 的子標(biāo)簽文本屬性。
- 這是如何實(shí)現(xiàn)的?因?yàn)?Kivy 屬性會(huì)自動(dòng)綁定到其對(duì)應(yīng)的kv文件中的任何引用。當(dāng)球從兩側(cè)逃出時(shí),我們將通過 PongGame 類中的更新方法來更新分?jǐn)?shù)并再次發(fā)球。
- PongPaddle 類也實(shí)現(xiàn)了一個(gè) bounce_ball 方法,這樣球就會(huì)根據(jù)它擊中球拍的位置而產(chǎn)生不同方向的彈跳,非常有意思。下面是 PongPaddle 類的代碼:
- 結(jié)果如下:
- 到這一步,基本就完成了整個(gè)乒乓球游戲的制作。如何,你心動(dòng)了嗎?
總結(jié)
以上是生活随笔為你收集整理的Python之深入解析如何使用Python Kivy实现一个“乒乓球”游戏的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python之将彩色图片批量转化为黑白图
- 下一篇: iOS之深入解析预乘透明度Premult