本篇文章用于对Kivy框架官方所给出的一个「乒乓球」小游戏的源码进行简单地解析。我会尽可能的将方方面面的内容都说清楚。在文章的最下方为官方所给出的这个小游戏的教程以及游戏源码。

由于篇幅所限,本文只简单介绍Kivy框架,对于Python语言的简介,请大家通过别的文章进行学习。

Kivy简介

Kivy 是基于Python编程语言的一种用于开发跨平台GUI客户端程序的框架。可以打包成iOS、Android、Windows、OSX等多种平台。目前已经实现一次编码,到处运行的目的。

Kivy框架主要包含两种文件,一种为Python源码文件,一种为KV文件。Python源码文件用于控制程序的运行逻辑,KV文件用于定义用户界面。

由于Kivy本质上是使用OpenGL进行界面的绘制的,而且通过对Kivy的经典应用「2048 by kivy」进行了简单的运行,Kivy所开发出的应用,在性能上还是可圈可点的,从某种程度上来说,要比使用HTML5/JS的应用在性能以及稳定性上,要好很多。

关于Kivy框架的基本使用以及开发环境,可以参考我的另外两篇文章:

创建应用

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 Clock from random import randint class PongGame(Widget):
pass class PongApp(App):
def build(self):
return PongGame() if __name__ == '__main__':
PongApp().run()
  • App类是创建Kivy应用的基础。我们可以认为它是整个应用的入口,如果在我们的应用中没有引入这个类的话,我们的应用是没有办法运行起来的。
  • Widget类是创建一个「Widget」的基础。Widget是我们绘制界面最重要的类,我们的界面元素都应该继承它,不论是内置好的「文本框」还是用于绘制我们自定义界面元素的「画布」,都需要引入这个类,才能够正常工作。
  • PongGame是一个「界面元素」类,在整个Pong示例中,小球、球拍等,都是界面元素,所不同的仅仅是界面元素的层级关系。
  • PongApp是我们的「主程序」类,主要用于各种操作以及界面元素的交互等的调度。不建议在这里写入太复杂的逻辑,因为如果把复杂逻辑写在这里的话,随着我们应用的不断扩展、维护,这个类将逐步陷入「不可维护」的尴尬境地。
  • 最后一块用于「启动应用」。每一个Kivy应用都应该有这段代码。

在Kivy中,我们使用XXXApp来控制应用的运行,使用XXX来控制应用的行为,比如PongApp以及PongGame

绘制界面

kv文件是kivy框架所使用的界面描绘文件,类似于c#的xaml。我们可以在kv文件中,添加各种由kivy框架本身所提供的控件,比如buttonlabel等。还可以在kv文件中使用canvas标签,并在其中绘制各种图形,比如矩形、圆形等

在kv文件中,对于界面的描绘,是__树形__的,也就是说,在最顶层需要一个__根节点__用来作为整个应用的根。

#:kivy 1.8.0

<PongGame>:
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文件中,

  • 第一行#:kivy 1.8.0声明当前kv文件中所用到的kivy的版本。(当前最新的版本是1.9.0 beta)
  • canvas向应用中添加了一个画板,用于在界面中绘制乒乓球游戏的各种挡板之类的界面元素。
  • 之后在canvas中对画板进行设置,包括画板的位置、尺寸等。
  • 每一个根标签,都将对应于在项目文件中的一个类。
  • 在最后加入两个标签,并在标签中设置相应的属性,这里包括字号、位置、默认文字。

添加小球

小球类

# ...

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 # ...
  • 为了让我们的小球会动,我们需要给小球一个位置,然后控制这个位置以一定的速度进行改变,从而实现让小球移动的目的。
  • ReferenceListProperty 允许创建一个由其他属性构成的__元组__。在这里,我们提供了两个数值型属性,用于标示坐标。
  • 在PongBall类中,我们提供用于控制速度与位置的类属性,以及一个用于控制移动的方法。
  • kivy.vector.Vector(*largs) 用于表示一个矢量。利用矢量属性与当前的位置,可以控制移动的方向以及速度。

绘制小球

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

加入球拍

绘制球拍

<PongPaddle>:
size: 25, 200
canvas:
Rectangle:
pos:self.pos
size:self.size ... <PongGame>:
... 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

参考资料

『Python Kivy』官方乒乓球游戏示例解析的更多相关文章

  1. 『Python Kivy』Kivy模板语言KV说明

    语言概念 KV语言允许你以声明的方式创建控件树,以及绑定控件属性到其他的控件或使用一种自然的方式进行回调. 它允许非常快速并灵活的改变你的UI. 它还可以让你的应用程序与应用程序的界面进行分隔. 如何 ...

  2. 『Python Kivy』API说明:kivy.app.App

    App类是创建Kivy应用的基础.我们可以将其看成是Kivy运行循环当中的主入口.在绝大多数的例子中,你创建这个类的子类,然后构建你自己的应用.当你已经准备好开始应用的整个生命周期时,你可以实例化你定 ...

  3. 『Python CoolBook』Cython

    github地址 使用Cython导入库的话,需要一下几个文件: .c:C函数源码 .h:C函数头 .pxd:Cython函数头 .pyx:包装函数 setup.py:python 本节示例.c和.h ...

  4. 『Python进阶』专题汇总

    基础知识 Python3内置函数 『Python』库安装 『流畅的Python』第1~4章_数据结构.编码 『Python』基础数据结构常见使用方法 『Python CoolBook』数据结构和算法_ ...

  5. 『Python基础』第5节:条件控制

    if 语句的使用 单分支 if 条件: 满足条件后要执行的代码 例如: if 2 < 3: print(222) print(333) 每个条件后面都要使用冒号 :, 表示接下来是满足条件后要执 ...

  6. 『Python基础』第2节: Python简介及入门

    一. Python介绍 Python是一门高级计算机程序设计语言,1989年,荷兰的Guido von Rossum创造了它.Guido是是一个牛人,1982年,他从阿姆斯特丹大学获得了数学和计算机硕 ...

  7. 『Python CoolBook』使用ctypes访问C代码_上_用法讲解

    一.动态库文件生成 源文件hello.c #include "hello.h" #include <stdio.h> void hello(const char *na ...

  8. 『Python CoolBook』使用ctypes访问C代码_下_demo进阶

    点击进入项目 这一次我们尝试一下略微复杂的c程序. 一.C程序 头文件: #ifndef __SAMPLE_H__ #define __SAMPLE_H__ #include <math.h&g ...

  9. 『Python CoolBook』C扩展库_其一_用法讲解

    不依靠其他工具,直接使用Python的扩展API来编写一些简单的C扩展模块. 本篇参考PythonCookbook第15节和Python核心编程完成,值得注意的是,Python2.X和Python3. ...

随机推荐

  1. 2018.12.22 Spring学习02

    Spring学习02 1.使用注解配置Spring 1.1 为主配置文件引入新的命名空间(约束) 添加约束文件xxx-xxx-context.xml 添加到主配置文件中 选择刚才的context.xm ...

  2. C#多线程最简单Demo

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  3. SQLite动态库下载

    其中带有“bundle”字样的表示动态库是按混合模式编译的,在 使用的时候只需要System.Data.SQLite.dll就可以了 而不带“bundle”的则是将非托管部分和托管部分分别编 译,Sy ...

  4. ProjectServer如何创建时间表

    默认配置的ProjectServer是没有时间表的,任务汇报的时候不能汇报工时,只能汇报任务的百分比. 但如果有企业一定要用工时来汇报的话,我们就需要开启时间表. 点击服务器设置-->时间报告阶 ...

  5. Shiro 登录认证源码详解

    Shiro 登录认证源码详解 Apache Shiro 是一个强大且灵活的 Java 开源安全框架,拥有登录认证.授权管理.企业级会话管理和加密等功能,相比 Spring Security 来说要更加 ...

  6. 嵌入式:FreeRTOS的使用(未完)

    为了方便与UCOS对比,顺序按照UCOS那篇编写. 0.一些移植.系统相关 1.框架写法(个人习惯相关) 1-1.main 函数里创建一个开始任务 int main(void) { 初始化外设 xTa ...

  7. DB数据源配置之抽象(〇)

    DB数据源配置之抽象(〇) liuyuhang原创,未经允许禁止转载 DB数据源之SpringBoot+Mybatis踏坑过程实录(一) DB数据源之SpringBoot+MyBatis踏坑过程(二) ...

  8. wordpress整站无损搬迁的几种方法 最后一种最完美

    网站建设之wordpress整站无损搬迁的几种方法 最后一种最完美 网站搬家,当我们更换php虚拟主机,空间升级或更好空间提供商都会发生,站长们请注意,掌握网站迁移方法,是网站日常维护技术中必须掌握的 ...

  9. CentOS7 安装 Docker,10分钟入门!

    本次安装是在VM虚拟机的CentOS 7环境下,仅为了学习和测试的简单安装,如果在真实生产环境还需要考虑安全策略的其他问题. 1.Linux内核版本需要 3.10.0 以上并且是64位 [root@l ...

  10. shell 输出带颜色字体

    输出特效格式控制:\033[0m  关闭所有属性  \033[1m   设置高亮度  \03[4m   下划线  \033[5m   闪烁  \033[7m   反显  \033[8m   消隐  \ ...