KIVY Tutorials » Pong Game Tutorial¶

1Pong Game Tutorial — Kivy 2.3.0 documentation

Introduction¶

Welcome to the Pong tutorial  欢迎来到  乒乓球 导师辅导课

This tutorial will teach you how to write pong using Kivy. We’ll start with a basic application like the one described in the Create an application and turn it into a playable pong game, describing each step along the way.
这导师辅导课将教你如何写一个乒乓球使用KIVY。 我们将开始同一个基础的应用程序 像在Create an apllication描述的一样,并且将它变为一个可以玩儿的乒乓球游戏, 描述每一步伴随着进程。

Here is a check list before starting this tutorial:
这是一个检查列表 在开始这导师辅导课之前:

  • You have a working Kivy installation. See the Installing Kivy section for detailed descriptions
    你有一个正在运行的kivy 安装程序。 细节描述请看 安装kivy 节 

  • You know how to run a basic Kivy application. See Create an application if you don’t.
    你知道如何运行一个基础的kivy程序。 看 创造一个应用 如果你不知道的。

If you have read the programming guide, and understand both basic Widget concepts (A Simple Paint App) and basic concepts of the kv language (Kv language), you can probably skip the first 2 steps and go straight to step 3.
如果你读了项目知道, 并且都明白 基础组件概念(一个简单地绘画APP) 和kv语言基础概念, 你大概可以跳过一开始2步 并且直接径直去到第三步。

Note    注意

You can find the entire source code–and source code files for each step–in the Kivy examples directory under tutorials/pong/.
你可以找到整个源码-- 并且 每一步的源码文件  --- 在kivy案例文件夹的tutorials/pong/

Ready? Sweet, let’s get started!
准备好了吗? 甜心,让我们开始吧!

Getting Started¶ 开始

Getting Started   开始

Let’s start by getting a really simple Kivy app up and running. Create a directory for the game and a file named main.py

让我们开始以一个真正的简单的kivyapp 开始和运行。 为游戏创建一个文件夹和一个叫main.py的文件。

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

Go ahead and run the application. It should just show a black window at this point. What we’ve done is create a very simple Kivy App, which creates an instance of our PongGame Widget class and returns it as the root element for the applications UI, which you should imagine at this point as a hierarchical tree of Widgets. Kivy places this widget-tree in the default Window. In the next step, we will draw the Pong background and scores by defining how the PongGame widget looks.

继续和运行app。 它应该只展示一个黑色的窗口在这时。 我们要做的时创造一个非常简单的KivyAPP, 这app创造了一个我们PongGame组件类的案例, 并且返回它作为应用程序UI的一个根类元素, 你应该想象到在这点作为一个分等级的组件树。Kivy 放置 这个 组件树在默认的窗口。 在下一步, 我们将绘画乒乓球背景和分数通过定义如何PongGame 组件外貌。

Add Simple Graphics¶ 添加简单的图像

Creation of pong.kv     pong.kv 的创造

We will use a .kv file to define the look and feel of the PongGame class. Since our App class is called PongApp, we can simply create a file called pong.kv in the same directory that will be automatically loaded when the application is run. So create a new file called ``pong.kv`` and add the following contents.
我们将使用一个.kv文件 来定义 PongGame类的  景象 和 使用。 自从我们App类被叫作PongApp,我们可以简单地创造一个文件叫做 pong.kv 在相同的文件夹, 这文件夹将自动的被运行当应用程序运行时。 因此创造一个新的文件 叫 “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"

Note   注意

COMMON ERROR: The name of the kv file, e.g. pong.kv, must match the name of the app, e.g. PongApp (the part before the App ending).
常见错误: kv文件的名字, 例如  pong.kv , 必须匹配app的名字, 例如 PongApp(之前App结束部分有--上段代码)

If you run the app now, you should see a vertical bar in the middle, and two zeros where the player scores will be displayed.
如果你运行app现在, 你应该看见一个垂直的块在中间, 和俩零 在玩家分数将被展示的地方。

Explaining the Kv File Syntax¶  kv文件语法的说明

Before going on to the next step, you might want to take a closer look at the contents of the kv file we just created and figure out what is going on. If you understand what’s happening, you can probably skip ahead to the next step.
在继续下一步之前,你可能像近一点看看我们刚创造的kv文件的内容,并且弄明白正在干啥勒。如果你明白目前情况,你大概可以跳过继续到下一步。

On the very first line we have:  一开头的第一步我们有的:

#:kivy 1.0.9

This first line is required in every kv file. It should start with #:kivy followed by a space and the Kivy version it is intended for (so Kivy can make sure you have at least the required version, or handle backwards compatibility later on).
这第一条线是被需求的在每个kv文件里。 它应该始同 #:kivy 被跟随着空格 和 Kivy版本。 Kivy版本是蓄意的(因此 Kivy 可以确保你至少有被要求的版本,或者操控回溯到兼容的后续版本等。)

After that, we begin defining rules that are applied to all PongGame instances:
在那之后,我们开始定义所有PongGame案例应用的规则:

<PongGame>:...

Like Python, kv files use indentation to define nested blocks. A block defined with a class name inside the < and > characters is a Widget rule. It will be applied to any instance of the named class. If you replaced PongGame with Widget in our example, all Widget instances would have the vertical line and the two Label widgets inside them because it would define these rules for all Widget instances.
像Python一样,kv文件使用缩进来定义嵌套块。 一个block区块定义一个在<>里的类名,这是Widget组件规则。 它将被应用在任何被命名类的案例。如果你更换我们案例中的PongGame和组件,所有的组件案例应该有这 竖直的线 和两个标签组件,因为它们定义这些规则为了所有的组件案例。

Inside a rule section, you can add various blocks to define the style and contents of the widgets they will be applied to. You can:
在一个规则节内, 你可以添加不同的块来定义将要被应用的组件们的样式和内容。你可以:

  • set property values    设置属性值

  • add child widgets    增加子类组件

  • define a canvas section in which you can add Graphics instructions that define how the widget is rendered.    定义一个画布节, 在这个画布中你可以增加定义如何组件渲染的图形用法说明。

The first block inside the <PongGame> rule we have is a canvas block:
在<PongGame>规则内的第一块我们所拥有的是画布块:

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

So this canvas block says that the PongGame widget should draw some graphics primitives. In this case, we add a rectangle to the canvas. We set the pos of the rectangle to be 5 pixels left of the horizontal center of the widget, and 0 for y. The size of the rectangle is set to 10 pixels in width, and the widget’s height in height. The nice thing about defining the graphics like this, is that the rendered rectangle will be automatically updated when the properties of any widgets used in the value expression change.
因此这个画布块说明 这PongGame 组件应该画一些图形基本体。 在这个案例中,我们增加一个长方形到画布中。 我们设置长方形的位置是 组件水平中心的左边5像素, 并且y坐标是0. 长方形坐标是被设定为10像素宽, 并且组件的高度是 整个高度。 像这样定义图形们的好事是, 渲染图形将自动更新当任何被使用的组件的属性们在表达值改变的时候。

Note   请注意:

Try to resize the application window and notice what happens. That’s right, the entire UI resizes automatically. The standard behaviour of the Window is to resize an element based on its property size_hint. The default widget size_hint is (1,1), meaning it will be stretched 100% in both x-direction and y-direction and hence fill the available space. Since the pos and size of the rectangle and center_x and top of the score labels were defined within the context of the PongGame class, these properties will automatically update when the corresponding widget properties change. Using the Kv language gives you automatic property binding. :)
尝试着重新定义应用窗口的大小, 并且注意将要发生什么。 是的,整个UI自动重新定义大小了。 窗口的表现标准是重新定义一个大小元素基于它的  size_hint  属性。 组件size_hint的默认值是(1,1), 意味着它将被拉伸100% 在x y两个方向, 并且因此之后,填满恰当的空白。 自从长方形的位置和大小 和center_x 以及 上部的分数标签在PongGame类的内容中都被定义好了以后, 这些属性们将自动地更新到组件属性们相一致的时候。 使用kv一眼给你自动地属性绑定。

The last two sections we add look pretty similar. Each of them adds a Label widget as a child widget to the PongGame widget. For now, the text on both of them is just set to “0”. We’ll hook that up to the actual score once we have the logic implemented, but the labels already look good since we set a bigger font_size, and positioned them relatively to the root widget.
上两节我们增加了看起来相同的美丽画面。 他们的每个增加了一个标签组件作为一个子类组件到PongGame组件中。 现在开始, 它们俩的文本 都被 设置为0. 我们将其连接到真正的分数, 一旦当我们有逻辑的执行时, 但是标签们已经看起来不错自从我i们设定了一个更大的font_size, 并且相对放置在根组件上了。 [已经很好了,你还想干嘛呀?]

The root keyword can be used inside the child block to refer back to the parent/root widget the rule applies to (PongGame in this case):
root 键 可以被使用在子块内来回溯到 规则应用到的 父类/根类  组件。

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

Add the Ball¶   添加球

Add the Ball

Ok, so we have a basic pong arena to play in, but we still need the players and a ball to hit around. Let’s start with the ball. We’ll add a new PongBall class to create a widget that will be our ball and make it bounce around.
好了,现在我们有一个基础的区域来玩乒乓球了,但我们仍需要玩家们和一个球来围绕着击打。 让我们从球开始。 我们将添加一个新的乒乓球类 来创建一个将是我们的球的组件,并且让这球绕着跳。

PongBall Class¶

Here is the Python code for the PongBall class:
这儿是PongBall类的Python代码

class PongBall(Widget):# velocity of the ball on x and y axis# 球在x 和y  轴的 速率velocity_x = NumericProperty(0)velocity_y = NumericProperty(0)# referencelist property so we can use ball.velocity as# 参考表属性 因此我们可以使用球。  速率作为一个速记的, 像  位置, x  y。。。# a shorthand, just like e.g. w.pos for w.x and w.yvelocity = ReferenceListProperty(velocity_x, velocity_y)# ``move`` function will move the ball one step. This#  will be called in equal intervals to animate the ball# '''move''' 功能将移动球一步, 着将被召唤有间隔的平等的来动画这球def move(self):self.pos = Vector(*self.velocity) + self.pos

And here is the kv rule used to draw the ball as a white circle:
并且这里是kv规则 被用来画球  作为一个白色的圆圈。

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

To make it all work, you also have to add the imports for the Properties Property classes used and the Vector.
为了让它都运行,你也不得不添加  imports 来导入Properties 属性类们 , 和Vector

Here is the entire updated python code and kv file for this step:

这是这步整个更新的python代码和kv文件

main.py:

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.properties import NumericProperty, ReferenceListProperty
from kivy.vector import Vectorclass 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):passclass PongApp(App):def build(self):return PongGame()if __name__ == '__main__':PongApp().run()

pong.kv:

#:kivy 1.0.9<PongBall>:size: 50, 50 canvas:Ellipse:pos: self.possize: self.size          <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"PongBall:center: self.parent.center

Note that not only a <PongBall> widget rule has been added, but also a child widget PongBall in the <PongGame> widget rule.
注意,不仅仅是一个 <PongBall>组件规则已经被添加, 还有一个子类 PongBall在<PongGame>组件规则里。

from kivy.vector import Vector 中的Vector 是干啥的

在 Kivy 框架中,Vector 类是用于表示和操作二维或三维向量的。Vector 类提供了许多有用的方法来处理向量,如加法、减法、点积、叉积(仅限三维)和归一化等。

在图形编程和物理模拟中,向量是非常常见的数学工具。它们可以表示位置、方向、速度、加速度等。

以下是一些 Vector 类中常见的方法和它们的作用:

1    加法:两个向量相加会产生一个新的向量,其各个分量分别是两个向量对应分量的和。

v1 = Vector((1, 2))  
v2 = Vector((3, 4))  
result = v1 + v2  # result is (4, 6)

2        减法:一个向量减去另一个向量会产生一个新的向量,其各个分量分别是两个向量对应分量的差。

v1 = Vector((1, 2))  
v2 = Vector((3, 4))  
result = v1 - v2  # result is (-2, -2)

3        点积:两个向量的点积是一个标量值,等于两个向量对应分量乘积的和。

v1 = Vector((1, 2))  
v2 = Vector((3, 4))  
dot_product = v1.dot(v2)  # dot_product is 1*3 + 2*4 = 11

4        叉积(仅限三维):两个三维向量的叉积会产生一个新的三维向量,这个向量垂直于原来的两个向量。

5        长度:向量的长度(或称为模)是一个标量值,表示向量从原点到其末端的距离。

6        归一化:将一个向量转化为单位向量(长度为1的向量),同时保持其方向不变。

v1 = Vector((3, 4))  
normalized = v1.normalize()  # normalized is (3/5, 4/5)

在 Kivy 中,Vector 类通常用于处理与图形界面相关的位置和大小信息,以及动画和物理模拟中的速度和加速度等。

Adding Ball Animation¶

Making the ball move

Cool, so now we have a ball, and it even has a move function… but it’s not moving yet. Let’s fix that.

Scheduling Functions on the Clock¶

We need the move method of our ball to be called regularly. Luckily, Kivy makes this pretty easy by letting us schedule any function we want using the Clock and specifying the interval:

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

This line for example, would cause the update function of the game object to be called once every 60th of a second (60 times per second).

Object Properties/References¶

We have another problem though. We’d like to make sure the PongBall has its move function called regularly, but in our code we don’t have any references to the ball object since we just added it via the kv file inside the kv rule for the PongGame class. The only reference to our game is the one we return in the applications build method.

Since we’re going to have to do more than just move the ball (e.g. bounce it off the walls and later the players racket), we’ll probably need an update method for our PongGame class anyway. Furthermore, given that we have a reference to the game object already, we can easily schedule its new update method when the application gets built:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/27328.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

笔记100:使用 OSQP-Eigen 对 MPC 进行求解的方法与代码

1. 前言&#xff1a; 我们在对系统进行建模的时候&#xff0c;为了减少计算量&#xff0c;一般都将系统简化为线性的&#xff0c;系统如果有约束&#xff0c;也是将约束简化为线性的&#xff1b; 因此本篇博客只针对两种常见系统模型的 MPC 问题进行求解&#xff1a; 线性系统…

【Android面试八股文】你知道如何实现非阻塞式生产者消费者模式吗?

文章目录 这道题想考察什么 ?考察的知识点日常生活中的生产者消费者模式生产者消费者模式简介为什么需要缓冲区?阻塞与非堵塞非阻塞式生产者消费者模式的实现非阻塞式生产者消费者模式的实现阻塞式生产者消费者模式实现特点这道题想考察什么 ? 是否了解非阻塞式生产者消费者…

S686量产工具授权版,S686开卡教程,S686+EMMC固态硬盘开卡量产成功记录

手里有个S686EMMC组合的固态硬盘&#xff0c;华澜微的S686主控&#xff0c;之前一直没找到工具&#xff0c;感觉是废了&#xff0c;一直放着&#xff0c;偶然机会从桌子里又找到它&#xff0c;于是继续搜寻量产工具。 找到量产部落的一篇文章&#xff0c;里面说首发了S686的量产…

php收银系统源码推荐

智慧新零售系统是一套线下线上一体化的收银系统。致力于给零售门店提供『多样化线下收银』、『ERP进销存』、『o2o小程序商城』、『精细化会员管理』、『丰富营销插件』等一体化行业解决方案&#xff01; 一、多样化线下收银 1.聚合收款码 ①适用商户&#xff1a;小微门店&am…

后端高频面试题分享-用Java判断一个列表是否是另一个列表的顺序子集

问题描述 编写一个函数&#xff0c;该函数接受两个列表作为参数&#xff0c;判断第一个列表是否是第二个列表的顺序子集&#xff0c;返回True或False。 要求 判断一个列表是否是另一个列表的顺序子集&#xff0c;即第一个列表的所有元素在第二个列表需要顺序出现。列表中的元…

【实例分享】银河麒麟高级服务器操作系统环境资源占用异常-情况分析及处理方法

1.情况描述 使用vsftp进行文件传输&#xff0c;发现sshd进程cpu占用异常&#xff0c;并且su和ssh登录相比正常机器会慢2秒左右。 图&#xff11; 2.问题分析 通过strace跟踪su和sshd进程&#xff0c;有大量ssh:notty信息。 图2 配置ssh绕过pam模块认证后&#xff0c;ssh连接速…

python通过selenium实现自动登录及轻松过滑块验证、点选验证码(2024-06-14)

一、chromedriver配置环境搭建 请确保下载的驱动程序与你的Chrome浏览器版本匹配&#xff0c;以确保正常运行。 1、Chrome版本号 chrome的地址栏输入chrome://version&#xff0c;自然就得到125.0.6422.142 版本 125.0.6422.142&#xff08;正式版本&#xff09; &#xff08;…

全息图分类及相位型全息图制作方法

全息图是一种光学器件&#xff0c;全息图分为振幅型和相位型全息图&#xff0c;振幅型全息图记录光的振幅信息即强度信息&#xff0c;相位型全息图记录光的相位信息&#xff0c;利用相位信息可以恢复光的波前形状&#xff0c;从而记录物体形状&#xff0c;这里主要介绍相位全息…

【尚庭公寓SpringBoot + Vue 项目实战】图片上传(十)

【尚庭公寓SpringBoot Vue 项目实战】图片上传&#xff08;十&#xff09; 文章目录 【尚庭公寓SpringBoot Vue 项目实战】图片上传&#xff08;十&#xff09;1、图片上传流程2、图片上传接口查看3、代码开发3.1、配置Minio Client3.2、开发上传图片接口 4、异常处理 1、图片…

适合小白学习的项目1832javaERP管理系统之仓库采购管理Myeclipse开发mysql数据库servlet结构java编程计算机网页项目

一、源码特点 java erp管理系统之仓库采购管理是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助采用了serlvet设计&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用web模式&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Mye…

GitCode热门开源项目推荐:Spider网络爬虫框架

在数字化高速发展时代&#xff0c;数据已成为企业决策和个人研究的重要资源。网络爬虫作为一种强大的数据采集工具受到了广泛的关注和应用。在GitCode这一优秀的开源平台上&#xff0c;Spider网络爬虫框架凭借其简洁、高效和易用性&#xff0c;成为了众多开发者的首选。 一、系…

工资信息管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;基础数据管理&#xff0c;公告管理&#xff0c;津贴管理&#xff0c;管理员管理&#xff0c;绩效管理 用户账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;公告管理&#xff0c;津…

STM32项目分享:智能窗帘系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 2.PCB板打样焊接图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片&#xff1a; 哔哩哔哩视频链接&#xff1a; https://www.bilibili.c…

C#观察者模式应用

目录 一、什么是观察者模式 二、C#中观察者模式的实现 三、两种实现的用法 1、事件与委托 2、IObserver和IObservable 四、参考文献 一、什么是观察者模式 观察者&#xff08;Observer&#xff09;模式的定义&#xff1a;指多个对象间存在一对多的依赖关系&#xff0c;当…

探索AIGC与3D技术的融合:从图像到可探索的3D动态场景

随着人工智能和计算机图形技术的飞速发展,AIGC(人工智能生成内容)与3D技术的结合正在为我们打开一扇全新的创意之门。最近,我深入研究了几个令人兴奋的AIGC+3D方案,它们不仅展示了从单张图片或文本提示生成3D点云的强大能力,还进一步实现了AI虚拟试穿和生成高保真3D数字人…

【PX4-AutoPilot教程-TIPS】离线安装Flight Review PX4日志分析工具

离线安装Flight Review PX4日志分析工具 安装方法 安装方法 使用Flight Review在线分析日志&#xff0c;有时会因为网络原因无法使用。 使用离线安装的方式使用Flight Review&#xff0c;可以在无需网络的情况下使用Flight Review网页。 安装环境依赖。 sudo apt-get insta…

串口屏介绍

一、串口屏简介 串口屏&#xff08;Serial LCD/Serial TFT Display&#xff09;是一种集成了串行通讯功能的显示屏&#xff0c;广泛应用于各种嵌入式系统、工业控制、人机界面&#xff08;HMI&#xff09;等领域。该显示屏通过串口&#xff08;如UART、RS232、RS485等&#xf…

【面试干货】Java集合类详解:List、Set、Queue、Map、Stack的特点与用法

【面试干货】Java集合类详解&#xff1a;List、Set、Queue、Map、Stack的特点与用法 1、Map1.1 特点1.2 用法1.3 常见的实现类 2、Set2.1 特点2.2 用法2.3 常见的实现类 3、List3.1 特点3.2 用法3.3 常见的实现类 4、Queue4.1 特点4.2 用法4.3 常见的实现类 5、Stack5.1 特点5.…

FastWeb - Lua开源跨平台网站开发服务

在网站开发领域&#xff0c;大家都熟知PHPStudy和宝塔这两款广受欢迎的工具&#xff0c;但今天我要介绍的是一款功能强大、支持跨平台的开源Lua网站开发服务——Fast Web&#xff0c;以及与之配套的网站管理器。 Fast Web简介 Fast Web是一款基于Lua编写的网站开发框架&#…

注解 - @ResponseStatus

注解简介 在今天的每日一注解中&#xff0c;我们将探讨ResponseStatus注解。ResponseStatus是Spring框架中的一个注解&#xff0c;用于为控制器方法指定HTTP响应状态码和理由短语。 注解定义 ResponseStatus注解用于标记控制器方法或异常类&#xff0c;以指示HTTP响应的状态码…