Python深入解析如何使用Python Kivy實現(xiàn)一個“乒乓球”游戲

      網友投稿 1004 2022-05-29

      一、前言

      本文是基于 Kivy 開源跨平臺的 Python 框架上創(chuàng)作的,Kivy 開源跨平臺的 Python 框架能用于開發(fā)多點觸控的用戶界面程序,允許快速簡單的交互設計,非常方便。

      那么,如何使用 Kivy 編寫一款乒乓球游戲呢?我們將從一個基本的應用程序開始,描述創(chuàng)建這個游戲的每個步驟。

      Kivy 是用 Python 和 Cython 編寫的,基于 OpenGL ES 2,支持各種輸入設備并擁有豐富的部件庫。使用相同的代碼,可直接實現(xiàn)多平臺應用,包括 Windows、macOS、Linux、Android 和 iOS。

      所有 Kivy 部件都支持多點觸控。

      實現(xiàn)效果,一睹為快:

      二、準備

      ① Python 安裝

      在 windows 上安裝 Python:

      下載 Python 的最新版本:訪問鏈接 Python 官網,在 Windows 操作系統(tǒng)上安裝 Python 3.10.0,大家也可以自行選擇最新版的下載。

      進入下一個頁面后,拉到最下面,選擇 Windows embeddable package (64-bit) 下載:

      雙擊下載完成的應用程序,記得一定要勾選 ADD Python 3.7 to PATH,否則 cmd 無法運行 Python,然后選擇 Install Now 進行安裝,默認會安裝 pip,而且將安裝到 C 盤(推薦)。如果希望換一個盤安裝,可以點擊 Customize installation 在里面選擇其他的盤。

      在 macOS 上安裝 Python:

      其實 macOS 上是默認安裝了 Python 的,只不過版本是 Python2.7,其相對于現(xiàn)在的 Python 3 缺少了很多特性,而且速度也比 Python 3 慢,因此還是建議大家裝 Python 3。

      同樣地,下載 Python 的最新版本,訪問鏈接:Python 官網,在 macOS 操作系統(tǒng)上安裝 Python 3.7.4,大家也可以自行選擇最新版的下載。

      進入下一個頁面后,拉到最下面,選擇 macOS 64-bit universal2 installer 下載:

      下載完成后得到一個 pkg 文件,雙擊打開,按照指示步驟進行安裝即可。

      ② 安裝依賴

      請選擇以下任一種方式輸入命令安裝依賴:

      Windows 環(huán)境打開 Cmd (開始-運行-CMD);

      MacOS 環(huán)境打開 Terminal (command + 空格輸入 Terminal);

      如果用的是 VSCode 編輯器或 Pycharm,可以直接使用界面下方的 Terminal:

      pip install kivy[base] kivy_examples

      1

      三、簡單使用 Kivy

      首先,簡單介紹 Kivy 的基本使用,為游戲創(chuàng)建一個目錄和一個名為 main.py 的文件:

      # main.py from kivy.app import App from kivy.uix.widget import Widget class PongGame(Widget): pass class PongApp(App): def build(self): return PongGame() if __name__ == '__main__': PongApp().run()

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      在命令行中輸入 python main.py 運行該應用程序,它應該只顯示一個黑色的窗口。因此我們所做的只是創(chuàng)建一個非常簡單的 Kivy 應用程序,它創(chuàng)建了一個 PongGame Widget 類的實例,并將其作為應用程序用戶界面的根元素返回。

      在這一點上應該把它想象成一個 Widget 的分層樹,Kivy 將這個 Widget 放在默認的窗口中。在下一步,我們將通過定義 PongGame 小部件的外觀來繪制 Pong 的背景和游戲分數(shù)。

      四、Kivy - 添加簡單圖形

      我們將使用一個 .kv 文件來定義 PongGame 類的外觀,由于應用程序類被稱為 PongApp,可以簡單地在同一目錄下創(chuàng)建一個名為 pong.kv 的文件,當應用程序運行時將會自動加載。

      因此,為了定義游戲的外觀,創(chuàng)建一個名為 pong.kv 的新文件并添加以下內容:

      #:kivy 1.0.9 : canvas: Rectangle: pos: self.center_x - 5, 0 size: 10, self.height Label: font_size: 70 center_x: root.width / 4 top: root.top - 50 text: "0" Label: font_size: 70 center_x: root.width * 3 / 4 top: root.top - 50 text: "0"

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      注意一個常見錯誤:kv文件的名稱,例如 pong.kv,必須與應用程序的名稱一致,例如 PongApp(Ap p結尾之前的部分)。

      如果現(xiàn)在運行這個應用程序,應該看到中間有一個豎條,還有兩個零,那里將顯示玩家的分數(shù),如下所示:

      可以看到,在第一行有:

      #:kivy 1.0.9

      1

      每個 kv 文件都需要第一行,它應該以 #:kivy 及一個空格開頭,然后是它要使用的 Kivy 版本(因此 Kivy 可以確保您至少擁有所需的版本,或者稍后處理向后兼容性)。

      再往下看 kv 文件里定義了三個元素,一個 canvas 和兩個 label:

      先說說兩個 label,它們代表的是左右兩個數(shù)字,設定了 font_size(字體大小), center_x(中心位置), top(離頂部距離),text(文本),此外可以看到 root.width 和 root.top 的使用,這樣寫的好處是能跟跟隨窗口寬度和高度的變化而變化。

      另一個元素 canvas,它的下面定義了 Rectangle 參數(shù),意思是向畫布添加一個矩形,將矩形的 pos 設置為小部件水平中心左側 5 個像素,y 設置為 0,這就定義了矩形的顯示位置。

      矩形的大小 size 設置為寬度為 10 像素,高度為小部件的高度,像這樣定義圖形的好處是,當值表達式中使用的任何小部件的屬性發(fā)生變化時,渲染的矩形將自動更新。

      五、Kivy - 增加乒乓球球體

      現(xiàn)在有了一個基本的乒乓球場(雖然很簡陋),但我們仍然需要球拍和一個球來打球。從球開始,添加一個新的 PongBall 類來創(chuàng)建一個小部件,它將成為我們的球并使它彈跳起來。

      PongBall 類:

      class PongBall(Widget): # velocity of the ball on x and y axis velocity_x = NumericProperty(0) velocity_y = NumericProperty(0) # referencelist property so we can use ball.velocity as # a shorthand, just like e.g. w.pos for w.x and w.y velocity = ReferenceListProperty(velocity_x, velocity_y) # ``move`` function will move the ball one step. This # will be called in equal intervals to animate the ball def move(self): self.pos = Vector(*self.velocity) + self.pos

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      白球的 kv 配置如下:

      : size: 50, 50 canvas: Ellipse: pos: self.pos size: self.size

      1

      2

      3

      4

      5

      6

      為了使這一切順利進行,還必須為球體增加所用的 Property 屬性類,如下,是這一步更新后的 python 代碼和 kv 文件:

      from kivy.app import App from kivy.uix.widget import Widget from kivy.properties import NumericProperty, ReferenceListProperty from kivy.vector import Vector class PongBall(Widget): velocity_x = NumericProperty(0) velocity_y = NumericProperty(0) velocity = ReferenceListProperty(velocity_x, velocity_y) def move(self): self.pos = Vector(*self.velocity) + self.pos class PongGame(Widget): pass class PongApp(App): def build(self): return PongGame() if __name__ == '__main__': PongApp().run()

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      kv 文件如下:

      #:kivy 1.0.9 : size: 50, 50 canvas: Ellipse: pos: self.pos size: self.size : canvas: Rectangle: pos: self.center_x - 5, 0 size: 10, self.height Label: font_size: 70 center_x: root.width / 4 top: root.top - 50 text: "0" Label: font_size: 70 center_x: root.width * 3 / 4 top: root.top - 50 text: "0" PongBall: center: self.parent.center

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      六、Kivy - 增加乒乓球體運動

      現(xiàn)在我們的目的是讓這個球動起來,因此必須定期調用 move 函數(shù)讓它動起來。使用 Kivy 提供的 Clock 函數(shù)可以輕易地做到這一點:

      Clock.schedule_interval(game.update, 1.0/60.0)

      1

      這一行將導致游戲對象的更新函數(shù)每秒被調用 60 次。

      不過還有一個問題,想確保 PongBall 的移動函數(shù)被定期調用,但是在代碼中沒有任何對球對象的引用,因為只是通過 kv 文件在 PongGame 類的 kv 規(guī)則中添加了它。

      由于要做的不僅僅是移動球(比如把球從墻上彈下來,然后再彈到球員的球拍上),我們可能需要為 PongGame 類建立一個更新方法:

      class PongGame(Widget): def update(self, dt): # call ball.move and other stuff pass class PongApp(App): def build(self): game = PongGame() Clock.schedule_interval(game.update, 1.0/60.0) return game

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      Python之深入解析如何使用Python Kivy實現(xiàn)一個“乒乓球”游戲

      然而,這仍然不能改變我們沒有對 kv 規(guī)則所創(chuàng)建的 PongBall 進行操作的這一事實。為了解決這個問題,可以給 PongGame 類添加一個 ObjectProperty,并將其與 kv 規(guī)則中創(chuàng)建的 widget 掛鉤。

      一旦這樣做了,就可以很容易地在更新方法中引用球的屬性,甚至可以讓它從邊緣彈起:

      class PongGame(Widget): ball = ObjectProperty(None) def update(self, dt): self.ball.move() # bounce off top and bottom if (self.ball.y < 0) or (self.ball.top > self.height): self.ball.velocity_y *= -1 # bounce off left and right if (self.ball.x < 0) or (self.ball.right > self.width): self.ball.velocity_x *= -1

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      在 kv 文件中將其與代碼中設定的 id: ball 映射起來:

      : ball: pong_ball # ... (canvas and Labels) PongBall: id: pong_ball center: self.parent.center

      1

      2

      3

      4

      5

      6

      7

      8

      七、Kivy - 球拍移動事件

      現(xiàn)在,球正在彈來彈去,唯一缺少的是可移動的球拍和對分數(shù)的跟蹤。這里不會再去討論創(chuàng)建類和 kv 規(guī)則的所有細節(jié),因為這些概念已經在前面的步驟中涵蓋了。

      相反,把重點放在如何響應用戶的輸入而移動球拍上,在 Kivy 中,小部件可以通過實現(xiàn) on_touch_down、on_touch_move 和 on_touch_up 方法對輸入做出反應。默認情況下,Widget 類實現(xiàn)這些方法時,只是在其子部件上調用相應的方法來傳遞事件,直到其中一個子部件返回 True。

      乒乓運動是非常簡單的,球拍只需要向上和向下移動。事實上,它是如此簡單,甚至不需要讓球員小部件自己處理事件,只需為 PongGame 類實現(xiàn) on_touch_move 函數(shù):

      def on_touch_move(self, touch): if touch.x < self.width/3: self.player1.center_y = touch.y if touch.x > self.width - self.width/3: self.player2.center_y = touch.y

      1

      2

      3

      4

      5

      我們將在 NumericProperty 中保留每個球員的分數(shù),PongGame 的分數(shù)標簽通過改變 NumericProperty score 來保持更新,這反過來又會更新 PongGame 的子標簽文本屬性。

      這是如何實現(xiàn)的?因為 Kivy 屬性會自動綁定到其對應的kv文件中的任何引用。當球從兩側逃出時,我們將通過 PongGame 類中的更新方法來更新分數(shù)并再次發(fā)球。

      PongPaddle 類也實現(xiàn)了一個 bounce_ball 方法,這樣球就會根據(jù)它擊中球拍的位置而產生不同方向的彈跳,非常有意思。下面是 PongPaddle 類的代碼:

      class PongPaddle(Widget): score = NumericProperty(0) def bounce_ball(self, ball): if self.collide_widget(ball): speedup = 1.1 offset = 0.02 * Vector(0, ball.center_y-self.center_y) ball.velocity = speedup * (offset - ball.velocity)

      1

      2

      3

      4

      5

      6

      7

      8

      9

      結果如下:

      到這一步,基本就完成了整個乒乓球游戲的制作。如何,你心動了嗎?

      5G游戲 Python

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Kubernetes 集群部署 NFS 網絡存儲
      下一篇:抵御勒索病毒,信核數(shù)據(jù)方舟幫你持續(xù)免疫!
      相關文章
      亚洲国产精品久久久久秋霞小| 亚洲天堂电影在线观看| 亚洲一区二区三区丝袜| 亚洲国产精品线在线观看| 亚洲老妈激情一区二区三区| 狠狠亚洲婷婷综合色香五月排名| 亚洲精品成a人在线观看| 亚洲成年人啊啊aa在线观看| 在线看亚洲十八禁网站| 在线观看免费亚洲| 亚洲国产精品综合久久一线| 亚洲精品国产综合久久一线| 亚洲美女在线国产| 亚洲区小说区激情区图片区| 亚洲国产精品成人精品无码区在线| 亚洲线精品一区二区三区影音先锋 | 国产精品亚洲综合一区在线观看| 在线观看亚洲AV每日更新无码| 亚洲依依成人亚洲社区| 亚洲国产系列一区二区三区| 91在线亚洲综合在线| 亚洲精品动漫免费二区| 国产AV日韩A∨亚洲AV电影 | 一本久到久久亚洲综合| 亚洲综合激情另类专区| 亚洲日本va在线视频观看| 亚洲AV无码欧洲AV无码网站| 中文字幕亚洲免费无线观看日本| 亚洲高清资源在线观看| 亚洲免费网站在线观看| 亚洲人成电影网站色| 国产精品亚洲va在线观看| 亚洲视频2020| 亚洲性无码av在线| 亚洲不卡1卡2卡三卡2021麻豆| 亚洲人成人77777在线播放| 亚洲中文字幕无码久久| 国产精品亚洲精品日韩电影| 亚洲五月午夜免费在线视频| 国精无码欧精品亚洲一区| 久久精品国产精品亚洲毛片|