Python Kivy 官方桌球遊戲示例解析

2022-03-29 06:31:15 字數 3901 閱讀 5055

本篇文章用於對kivy框架官方所給出的乙個「桌球」小遊戲的原始碼進行簡單地解析。我會盡可能的將方方面面的內容都說清楚。在文章的最下方為官方所給出的這個小遊戲的教程以及遊戲原始碼。

kivy 是基於python程式語言的一種用於開發跨平台gui客戶端程式的框架。可以打包成ios、android、windows、osx等多種平台。目前已經實現一次編碼,到處執行的目的。

kivy框架主要包含兩種檔案,一種為python原始碼檔案,一種為kv檔案。python原始碼檔案用於控制程式的執行邏輯,kv檔案用於定義使用者介面。

由於kivy本質上是使用opengl進行介面的繪製的,而且通過對kivy的經典應用「2048 by kivy」進行了簡單的執行,kivy所開發出的應用,在效能上還是可圈可點的,從某種程度上來說,要比使用html5/js的應用在效能以及穩定性上,要好很多。

from kivy.uix.widget import widget

from kivy.properties import numericproperty, referencelistproperty, objectproperty

from kivy.vector import vector

from kivy.clock import clock

from random import randint

class ponggame(widget):

pass

def build(self):

return ponggame()

if __name__ == '__main__':

widget類是建立乙個「widget」的基礎。widget是我們繪製介面最重要的類,我們的介面元素都應該繼承它,不論是內建好的「文字框」還是用於繪製我們自定義介面元素的「畫布」,都需要引入這個類,才能夠正常工作。

ponggame是乙個「介面元素」類,在整個pong示例中,小球、球拍等,都是介面元素,所不同的僅僅是介面元素的層級關係。

最後一塊用於「啟動應用」。每乙個kivy應用都應該有這段**。

kv檔案是kivy框架所使用的介面描繪檔案,類似於c#的xaml。我們可以在kv檔案中,新增各種由kivy框架本身所提供的控制項,比如buttonlabel等。還可以在kv檔案中使用canvas標籤,並在其中繪製各種圖形,比如矩形、圓形等

在kv檔案中,對於介面的描繪,是__樹形__的,也就是說,在最頂層需要乙個__根節點__用來作為整個應用的根。

#:kivy 1.8.0

: 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"

在上面的kv檔案中,

# ...

class pongball(widget):

# 小球在x、y軸上的速度

velocity_x = numericproperty(0)

velocity_y = numericproperty(0)

# 建立索引屬性列表,以精簡對座標屬性的使用。

velocity = referencelistproperty(velocity_x, velocity_y)

# ``move`` 方法將移動小球一步。

# 這個方法將會在需要小球移動的時候被呼叫。

def move(self):

self.pos = vector(*self.velocity) + self.pos

# ...

:

size: 50, 50

canvas:

ellipse:

pos: self.pos

size: self.size

:

size: 25, 200

canvas:

rectangle:

pos:self.pos

size:self.size

...:

...player1: player_left

player2: player_right

...pongpaddle:

id: player_left

x: root.x

center_y: root.center_y

pongpaddle:

id: player_right

x: root.width-self.width

center_y: root.center_y

class pongpaddle(widget):

score = numericproperty(0)

def bounce_ball(self, ball):

if self.collide_widget(ball):

vx, vy = ball.velocity

offset = (ball.center_y - self.center_y) / (self.height / 2)

bounced = vector(-1 * vx, vy)

vel = bounced * 1.1

ball.velocity = vel.x, vel.y + offset

# ...

class ponggame(widget):

ball = objectproperty(none)

player1 = objectproperty(none)

player2 = objectproperty(none)

def serve_ball(self, vel=(4, 0)):

self.ball.center = self.center

self.ball.velocity = vel

def update(self, dt):

self.ball.move()

# 敲擊小球

self.player1.bounce_ball(self.ball)

self.player2.bounce_ball(self.ball)

# 限定小球在螢幕中的上下邊界

if (self.ball.y < self.y) or (self.ball.top > self.top):

self.ball.velocity_y *= -1

#went of to a side to score point?

if self.ball.x < self.x:

self.player2.score += 1

self.serve_ball(vel=(4, 0))

if self.ball.x > self.width:

self.player1.score += 1

self.serve_ball(vel=(-4, 0))

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

canvas 遊戲 桌球

直接貼 遊戲類 class game 開始 start 結束 stop 執行 run this canvas.item 畫布繪圖 this canvas.draw 球運動 this boll.run this bat.run 畫布 class canvas 清空畫布 clear 新增要繪圖元素 ad...

BNU4063 桌球遊戲

某日,dxy無聊的開啟電視,正好看到 08 09賽季 克皇家鐘錶大獎賽八強賽 由奧沙利文vs特魯姆普戴的比賽。火箭 奧沙利文相當的威猛,又是一桿進了n顆球。此時,dxy聽到解說提到乙個名詞 超分 上網搜了一通,才明白超分是指選手的分差大於臺面上剩餘的得分。到了這種時候,落後的一人很難扳回比分。想到這...

Python中寫乙個桌球類的遊戲

最近開始學python,感覺挺好玩的,既有指令碼語言的靈活性,又有豐富的類庫與物件導向的特點,開發起來很方便。遊戲的規則和桌球一樣,如果妙蛙種子掉地上了就算輸,你可以用藍色的蹺蹺板彈它,使他不落到地面上。game over後可按任意鍵繼續遊戲或選擇退出。如下 import sys,pygame fr...