日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

第三章 Python Kivy 学习 -- Kivy官方入门教程Pong Game

發(fā)布時間:2024/1/1 python 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第三章 Python Kivy 学习 -- Kivy官方入门教程Pong Game 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

系列文章目錄

第一章 Python Kivy 學習 – Kivy介紹及環(huán)境安裝
第二章 Python Kivy 學習 – Kivy項目開發(fā)原理(待編輯)
第三章 Python Kivy 學習 – Kivy官方入門教程Pong Game


文章目錄

  • 系列文章目錄
  • 第三章 Python Kivy 學習 -- Kivy官方入門教程Pong Game
  • 一、入門
  • 二、添加簡單的圖形
    • 1、版本聲明
    • 2、Widget 型的類的外形定義
    • 3、定義一塊畫布canvas及繪制矩形Rectangle
    • 4、標簽Label
  • 三、乒乓球類
    • 3.1 main.py中輸入如下代碼定義乒乓球PongBall類
    • 3.2 main.py中如下添加引用,以保證運行正常
    • 3.3 pong.kv中輸入如下代碼,為PongBall類設定規(guī)則
  • 四、讓球動起來(給球添加動畫)
    • 4.1 時鐘調度功能
    • 4.2 動畫實現的邏輯
      • 要實現的功能
      • 建立球拍類
    • 4.3 全部代碼(整體講解)
  • 文檔及參考資料:


第三章 Python Kivy 學習 – Kivy官方入門教程Pong Game

介紹了基本的設計模式和應用程序開發(fā)過程。
官方說法:是整個學習進程圖中最重要的應用實例。

說明:本人運行的環(huán)境已經預先安裝了
Python3.10 編譯器
Anaconda python環(huán)境管理器
PyCharm python代碼編輯運行環(huán)境

python中包有:
kivy 今天講解的主角,python編輯android的為數不多的工具
python-for-android 目前還沒有用到

請參考使用。


一、入門

該教程使用的是逐步細化的開發(fā)模式,會多次重新編輯和完善代碼。以求循序漸進的講解kivy知識。

首先:利用Anaconda 新建環(huán)境learn
其次:利用PyCharm 新建項目gameAndroid并配置其編譯環(huán)境為learn
再次:使用PyCharm新建main.py文件,輸入如下代碼:

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

繼續(xù)運行應用程序。此時它應該只顯示一個黑色窗口。
1、它創(chuàng)建了PongGame類,其繼承了超級類Widget ,Widget 是一個控件(kivy一般叫做小部件,我不太順口,都叫控件了)的標準類,所有控件類都是Widget 的子類。
2、主文件的引導過程:詳見最后詳解。
3、此文件所創(chuàng)造的類中,app類只是負責引導和設置屬性作用,真正的控件,也就是屏幕顯示的東西是Widget類。
4、一般kivy中是以 Widget,Screen,Layout三種控件類作為屏幕的圖形顯示的根類。Screen是屏幕管理器類型,Layout是多種布局類的類型集合。

二、添加簡單的圖形

接下來 我們將通過定義外觀來繪制 游戲的 背景和分數。

在項目目錄中新建文件"pong.kv"
輸入如下代碼:

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

1、pong.kv由你所定義的類 PongApp(App)自動引用,僅由文件名即可自動執(zhí)行。當然是指app類才有這個待遇,而一個kivy才有一個app類,其它文件想要套用,請使用Builder方法。例如:Builder.load_file(‘Speech.kv’) 語句
2、在kivy中 .kv 文件用來定義類的外觀和相關屬性設置

下面分別介紹其語法

1、版本聲明

#:kivy 1.0.9

此行在.kv文件中必須含有,它應該且必須以空格開頭,而一般下面都空一行。(python編程最講究的是優(yōu)雅,最大的優(yōu)雅是代碼的規(guī)范性。)
這行代碼向kivy聲明此kv文件用到的最低版本號,便于打包時將足夠的版本內容打包進應用來支持運行。

2、Widget 型的類的外形定義

<PongGame>:...

<>中間定義的是Widget型PongGame類,利用換行縮進來表示以下都是編輯這個類的內容。
本示例中:是PongGame類的外形定義。
如果你使用則會重新定義Widget類的外形和屬性,將導致所有Widget的子類的外形均為此定義。這個方法一般用于定義label等常用控件,且一個app中要求有一致性外觀的情況。

在此文件中,你可以如下操作:

1、設置類的控件類型的屬性值定義
2、添加子小部件
3、定義一個畫布部分,您可以在其中添加定義小部件如何呈現的圖形指令。
4、定義動作的連接方法(實質是設置屬性)

3、定義一塊畫布canvas及繪制矩形Rectangle

<PongGame>:canvas:Rectangle:pos: self.center_x - 5, 0size: 10, self.height

canvas: 創(chuàng)建畫布
Rectangle:畫布內創(chuàng)建矩形
pos: self.center_x - 5, 0

pos為一個要引用的位置,是常用的屬性,用于獲取/設置矩形位置的屬性。設置為小部件水平中心左側 5 個像素,垂直為0。
self.為本控件或本小部件

size: 10, self.height

矩形大小為寬度10個像素,高度為小部件高度

1、最好以相對或變量來定義部件的大小,當值表達式中使用的任何小部件的屬性發(fā)生變化時,渲染的矩形將自動更新。
2、在kivy中我沒看到渲染的功能,現在是只要屬性變化,它自動渲染,這個很酷!
3、kivy中有三個常用和一個不常用的稱呼語:
root,指本控件的父控件
self,指本控件
app,永遠都是指向你的app類的,沒啥用
children,指本控件的子控件,是個list,需要慢慢研究他的功能和用法。

4、標簽Label

<PongGame>:Label:font_size: 70center_x: root.width / 4top: root.top - 50text: "0"Label:font_size: 70center_x: root.width * 3 / 4top: root.top - 50text: "0"

lable標簽控件
font_size 字號
center_x 中心X軸位置
root.width 父部件寬度的3/4位置
top 上方位置
text 文字

位置、大小、顏色及連接方法屬性是kivy中的重要屬性設置
位置和大小,詳見kivy 控件的代碼新建及屬性設置
顏色正在研究,連接方法有些坑也正在踩,時間戳:20220604

三、乒乓球類

3.1 main.py中輸入如下代碼定義乒乓球PongBall類

class PongBall(Widget):# 定義球在X,Y軸上的速度velocity_x = NumericProperty(0)velocity_y = NumericProperty(0)# 用ball.velocity 作為參考屬性# 表示ball在兩個維度的綜合速度velocity = ReferenceListProperty(velocity_x, velocity_y)# ``move`` 函數將以*self.velocity等距移動的形式使球移動def move(self):self.pos = Vector(*self.velocity) + self.pos

class kivy.properties.NumericProperty()

單個數字屬性,一般做為坐標的單值屬性,必須是數字格式。

ReferenceListProperty (NumericProperty(),NumericProperty())

屬性集合,可含有多個相同的屬性單元,數據類型元組

a = kivy.vector(x,y)

2D的矢量坐標,數據類型為python list,可以用a[0],訪問x

Property類的屬性,是kivy的一個特征,很好用,主要作用是可以定義一個類型已知,但內容未知的屬性,這個屬性可以被其它類或方法調用,可以有kv文件定義其規(guī)則和內容,可以在類內的方法被調用,

這里有個坑 就是在內容未知的時候,請不要在類內調用,可以定義方法有在類外調用,但類內直接調用會出錯,因為他沒有定義完 是個空的無類型的屬性,會被報錯。

3.2 main.py中如下添加引用,以保證運行正常

from kivy.properties import NumericProperty, ReferenceListProperty from kivy.vector import Vector

import kivy.properties # kivy的屬性包

不要將Kivy 的屬性與Python 的屬性混淆。

Kivy 的屬性類支持:
1、值檢查/驗證

當您為屬性分配新值時,會根據驗證約束檢查該值。例如,一個NumericProperty將檢查您的值是否為數字類型。這可以在早期防止許多錯誤。

2、觀察者模式

您可以指定屬性值更改時應該發(fā)生的情況。您可以將自己的函數綁定為對Property的更改和回調。例如,如果您希望在小部件的屬性更改時調用一段代碼,您可以bind為它創(chuàng)建一個函數連接。

3、更好的內存管理

同一屬性的實例在多個小部件實例之間共享。

3.3 pong.kv中輸入如下代碼,為PongBall類設定規(guī)則

<PongBall>:size: 50, 50canvas:Ellipse:pos: self.possize: self.size

Ellipse 圓形
pos: self.pos 設定本控件的標的位置為本控件位置
這里的本控件不是指Ellipse 圓形,也不是canvas畫布,而是PongBall的Widget控件。一定注意哦!
size大小設置為本控件大小

四、讓球動起來(給球添加動畫)

4.1 時鐘調度功能

上節(jié)定義的球并沒有按照方法move()來移動,實際上我們只是定義了類,并未實例化和調用其方法?,F在我們有一個函數,使得一定的時間間隔來調用某方法。

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

使game.update對象的函數每 60 秒被調用一次。

4.2 動畫實現的邏輯

要實現的功能

初始時球在一個位置向一側屏幕運動,
當觸碰屏幕邊緣時判定本方輸,對方積一分。
當碰到球拍時可以彈起,彈起的方向需要計算。
球拍可以移動(由觸屏自行移動)

建立球拍類

class PongPaddle(Widget):score = NumericProperty(0)"""定義記錄得分字段屬性,數字格式"""def bounce_ball(self, ball):if self.collide_widget(ball):"""kivy.uix.widget.Widgetdef collide_widget(self, wid: {x, right, y, top}) -> bool檢查另一個控件同本控件是否碰撞接觸"""vx, vy = ball.velocityoffset = (ball.center_y - self.center_y) / (self.height / 2)"""kivy.uix.widget.Widget.center_y 獲取控件的中心點y坐標"kivy.uix.widget.Widget.height獲取控件的高度坐標兩個控件的距離除以球拍高度的一半,反彈y軸變量"""bounced = Vector(-1 * vx, vy)"""將球的X軸反向"""vel = bounced * 1.1"""增加速度1.1倍"""ball.velocity = vel.x, vel.y + offset"""返回給球的綜合速度值,y軸需要增加反彈變量"""

kv文件中插入對PongPaddle的定義

<PongPaddle>:size: 25, 200canvas:Rectangle:pos: self.possize: self.size

4.3 全部代碼(整體講解)

main.py文件的全部代碼:

from kivy.app import App from kivy.uix.widget import Widget from kivy.properties import (NumericProperty, ReferenceListProperty, ObjectProperty ) from kivy.vector import Vector from kivy.clock import Clockclass PongPaddle(Widget):score = NumericProperty(0)def bounce_ball(self, ball):if self.collide_widget(ball):vx, vy = ball.velocityoffset = (ball.center_y - self.center_y) / (self.height / 2)bounced = Vector(-1 * vx, vy)vel = bounced * 1.1ball.velocity = vel.x, vel.y + offsetclass 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.posclass PongGame(Widget):ball = ObjectProperty(None)"""定義球的屬性值,數據類型為對象"""player1 = ObjectProperty(None)"""定義左玩家的屬性值,數據類型為對象"""player2 = ObjectProperty(None)"""定義右玩家的屬性值,數據類型為對象"""def serve_ball(self, vel=(4, 0)):"""定義球的待服務函數,用于發(fā)球,以(4,0)的速度在中心點發(fā)球"""self.ball.center = self.centerself.ball.velocity = veldef update(self, dt):# 主調度函數,加載除背景外的其他類及方法self.ball.move()self.player1.bounce_ball(self.ball)self.player2.bounce_ball(self.ball)# 引用移動并判斷是否碰撞# 打到屏幕頂部和底部的執(zhí)行方法if (self.ball.y < self.y) or (self.ball.top > self.top):self.ball.velocity_y *= -1# 積分并在得分處發(fā)球if self.ball.x < self.x:self.player2.score += 1self.serve_ball(vel=(4, 0))if self.ball.right > self.width:self.player1.score += 1self.serve_ball(vel=(-4, 0))def on_touch_move(self, touch):if touch.x < self.width / 3:self.player1.center_y = touch.yif touch.x > self.width - self.width / 3:self.player2.center_y = touch.yclass PongApp(App):def build(self):game = PongGame()game.serve_ball()Clock.schedule_interval(game.update, 1.0 / 60.0)return gameif __name__ == '__main__':PongApp().run()

代碼中的引用關系如下:

代碼結尾

PongApp().run(),調用了頁面主類PongApp

PongApp()

實例化PongGame類和其serve_ball()方法,實現背景,發(fā)球
定義時鐘調度功能,調用執(zhí)行PongGame.update()方法
最終返回實例化的PongGame類,記得一定要返回,否則無法顯示已經定義的類。

PongGame類

方法中定義了一個名字為ball和player1、player2的3個屬性值

1、ball的kv文件定義中進行了PongBall的直接實例化引用,請詳見kv文件。所以ball具有了PongBall一切屬性并且使其內置為PongGame類的一個成員屬性值。
2、同樣player1、player2同樣方法將PongPaddle類引用并實例化

serve_ball()

此方法用于發(fā)球和重新發(fā)球來調用

PongGame.update()

1、作為本游戲的主調度函數,起到連續(xù)操作的作用
2、self.ball.move(),首先調用球移動,使得球動起來
3、bounce_ball(),調用判斷是否碰撞的函數
4、判斷打到頂部和底部的處理方法
5、判斷得分并給得勝方發(fā)球

on_touch_move(self, touch)

在Kivy中,小部件可以通過編輯和執(zhí)行on_touch_down,on_touch_move和on_touch_up方法來對輸入做出反應。
默認情況下,小部件類僅調用其所有子小部件上的相應方法來傳遞事件,直到其中一個返回true,從而實現了這些方法。

pong.kv的全部代碼

#:kivy 1.0.9<PongBall>:size: 50, 50 canvas:Ellipse:pos: self.possize: self.size <PongPaddle>:size: 25, 200canvas:Rectangle:pos: self.possize: self.size<PongGame>:ball: pong_ballplayer1: player_leftplayer2: player_rightcanvas:Rectangle:pos: self.center_x - 5, 0size: 10, self.heightLabel:font_size: 70 center_x: root.width / 4top: root.top - 50text: str(root.player1.score)Label:font_size: 70 center_x: root.width * 3 / 4top: root.top - 50text: str(root.player2.score)PongBall:id: pong_ballcenter: self.parent.centerPongPaddle:id: player_leftx: root.xcenter_y: root.center_yPongPaddle:id: player_rightx: root.width - self.widthcenter_y: root.center_y

一個類的定義可以直接被另一個類定義中的內容引用為小控件。
id是一個控件在本控件中的名稱,可以被本定義使用,也可以外部引用。

文檔及參考資料:

Kivy官方教程 https://kivy.org/doc/stable/tutorials/pong.html

總結

以上是生活随笔為你收集整理的第三章 Python Kivy 学习 -- Kivy官方入门教程Pong Game的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。