当前课程知识点:Python 交互式程序设计导论 >  第4周 >  B 课程视频(键盘控制) >  运动

返回《Python 交互式程序设计导论》慕课在线视频课程列表

运动在线视频

运动

下一节:编程技巧

返回《Python 交互式程序设计导论》慕课在线视频列表

运动课程教案、知识点、字幕

各位同学大家好,欢迎回到python交互式程序设计课程中

今天,我们要讨论一个非常有意思的问题——运动

在很多的游戏开发中,运动都是一个非常重要的问题

本周,各位同学需要完成的桌上冰球的游戏项目中也会用到运动

一提到运动,大家可能都会觉得,跟物体的位置和速度有关

在python中,可能还有一些因素是需要我们考虑的

好,下面开始今天的内容

一提到运动,大家可能会很自然的想到,我们在中学物理中

学过的一个最简单的运动形式——匀速直线运动

那么匀速直线运动中,运动的距离和运动的速度与时间是有关系的

大家看下面的示例,假设这个车以速度v做匀速直线运动

那么经过时间t以后,它的运动距离s=v*t,非常简单

那么在二维平面中,运动如何直观的表达,我们来看一下

如果一个物体,从坐标(x,y)运动到新的位置(x',y')

实际上,它的x方向上的分量,和y方向上的分量都发生了变化。

在直角坐标系下非常直观, 那么,我们在python的二维游戏开发中

我们用到的坐标系不是传统意义上的坐标系, 我们用到的是基于屏幕的坐标系

这种坐标系,与传统的直角坐标系相比有2个区别

第一,原点的位置改为左上角; 第二,y轴的正方向是竖直向下的

那么在这张图中,大家可以看到, 一个红色的小球,运动到了这个位置

实际上它的坐标发生了变化

在x轴方向上,它移动了8—3,5个像素

在竖直方向上,它移动了5-3,2个像素

速度大家都知道,实际上是一个二维的向量

所谓向量,是指有大小,有方向的量

在坐标系下,它可以分解为x方向上的分量和y方向上的分量

一般的表达方法是这样,V(Vx,Vy),里面有两个分量, 分别代表x方向上的,和y方向上的

那么,在python中,我们通常用列表这种数据类型来表示速度

大家看,中括号里面是两个元素, 前面这个表示的是x轴方向上的分量 第二个元素是y方向上的分量

当x方向上的分量,为正数,物体会自左向右移动

当x方向上的分量,为负数,小于0,自右向左

在y方向上这个分量,如果为正数,是自上而下的

因为我们y轴的正方向是竖直向下的

大家想一下,如果它是负数,就是自下而上的运动

大家一定要注意,尤其是纵轴

那么实际上,在我们的二维游戏开发中,运动的含义

我们可以用一句话来表达, 以特定的频率通过速度v更新运动对象的位置Pos

这句话有3个要素,请大家要格外的注意一下

首先,以特定的频率,什么叫做特定的频率

实际上简单的理解,就是在固定时间段内,你执行多少次,或你移动多少次

第二个要素是速度v,这个速度v我们讲过, 我们把它理解为两个方向上的分量

位置pos,运动对象的位置pos, 实际上它也是一个坐标(x,y),两个分量的一个坐标

那么,下面这两个表达式,实际上就是通过速度分量, 来修改对应的位置分量

这个时候如果在固定的时间内, 或者说以固定的频率来执行, 在视觉效果上,就会呈现出一个运动的状态

好,我们来想一想,如果一个小球, 它的原始位置是(pos[0],pos[1])

你每隔1/60秒,把它的位置修改一下

这个时候它就会移动,如果这个频率很高

从肉眼上来看,它就是一个连续的运动过程

下面我还想解释一下,什么叫特定频率

在我们现在的开发环境中,所谓的特定频率,有3种情况

第一种情况是draw()函数,draw()函数里面的代码

会每隔1/60秒执行一次,也就是说,每秒执行60次

第二种是创建计时器Timer

Timer我们在前面的课程当中已经给大家介绍过

实际上用户可以自定义刷新频率

也就是说,多久你想执行一次这个代码

你可以人工的来指定,注意单位是毫秒

第三种情况不常用,实际上,特定的事件驱动

也可以算做特定的频率, 比如说,人敲击键盘,或者点击鼠标等

下面这个示例非常简单,我在这给大家简单演示一下

后面还会在实际的pycharm环境中给大家详细讲解

首先,我定义了2个全局变量, 一个叫ball_vel, 表示的是速度

第二个是ball_pos,表示的是位置

那么看到draw()函数,大家就知道每秒钟会执行60次, 我们来看一下下面的代码

第一句代码是一个全局的声明

表示下面的这一个变量ball_pos是一个全局的变量, 我可以修改它

下面这两个表达式,实际上就是用速度对应的这个分量

来修改对应的位置分量, 跟我们上一张幻灯片的这两个表达式实际上是一个含义

只不过,我在这用了+=运算符进行了一定程度的简化,

最后一句话,就是绘制这个圆了,当然从视觉上来讲,就是小球

那么ball_pos,是每隔1/60秒就会被更新一次, 于是这个小球就会不断地移动

最后我还想强调,两点需要注意的问题

第一, 在处理对象运动这样一个过程中, 需要考虑对象超出画布的范围

大家可以想象,如果一直沿着某一个方向运动

它最终一定会超出画布的范围

你会看不到,当然程序不会报错,但是你会看不到

第二, 那么这种情况我们如何处理

我在这给大家一个简单的解决办法

假设画布的宽度为WIDTH,高度为HEIGHT, 可以通过求余数的运算来实现

大家看一下,这是我的原始位置, 这是我的速度,更新以后的位置

我会跟这两个常量进行求余

这个时候实际上,把它的位置始终会锁定在画布的范围内

具体的内容和这个示例, 我会在pycharm环境中给大家做进一步的讲解

打开pycharm,我们来看一下课件中所提到的这个程序

首先我们来看一下这个程序的基本结构

第一部分仍然是导入一些开发包和相关的源文件

第二部分是常量和变量的定义

这部分是函数,当然在这很简单,就一个draw()函数

最后面是创建程序界面,以及启动程序

好,我们来看一下

这两个常量,我分别定义的500和300,表示的是画布的宽和高

这两个全局变量,一个表示的是ball小球的vel速度

x轴方向上的分量是1,y轴方向上的分量是2

那么第二个全局变量ball_pos表示的是小球的位置

初始位置在(0,0),也就意味在画布的左上角

那么这个draw()函数,大家都知道, 它的执行频率是60,也就是一秒钟执行60次

下面我们看里面的代码

第一句,也就是第9行, global ball_pos,还记得我们在课件中提到

要想修改一个全局变量, 需要对全局变量做global这个关键字的声明

表示我下面要对全局变量进行修改了

好,我们来看一下这两个表达式

这两个表达式非常容易理解

我们来看

实际上是对小球原来的位置pos0,pos1这两个分量

分别加上它的速度对应的分量

Vel0和vel1

然后更新它的位置信息

这个时候小球的位置就会发生变化

那么又因为draw()函数是每秒钟执行60次, 所以这个小球的位置1秒钟会变化60次

如果频率够高,那么很连续的过程我们是仍然看上去就是在运动

最后一句话,是用更新后的位置, 来重新绘制,draw_circle,重新绘制这个小球

下面第14行,用simplegui创建一个frame

这个我们在很多程序当中已经用到过

那么15行是来注册draw()函数, 就是屏幕绘制的这样一个处理函数

最后来启动这个程序

我们运行一下,看下实际效果,运行motion

我们来看一下

没有任何变化

怎么会这样尼

我们再来运行一下

关掉

我们把这个窗口放到一边

我们运行一下

好,大家看到,一个小球,会斜向右下角这样一个方向运动

刚才我们看到就是这样一个效果

为什么小球消失了

实际上小球并没有消失

只是它超出了画布的范围

同学们还记得,我们在课件里提到

如果小球以某一个速度,固定速度持续运动

它终究会超出画布的范围

如何解决这个问题

非常简单

我们来看一下

我们只需要做一个非常简单的处理

对更新后的位置信息做一个求余的运算

我们来看一下怎么做

这个是x轴方向上的

加完以后,它很有可能会超出我的WIDTH这个宽度

怎么办呢

我会对它进行求余

这个时候大家可以想象

即便你这个数也可能会变得很大

但是,跟我的WIDTH这个常量一求余

它会始终锁定在0到WIDTH之间

所以它不会超出屏幕的范围

画布的范围

同样的道理,我们对y方向上的这样一个坐标

也进行求余运算

我们来看一下实际效果

运行一下

大家看

只要一出屏幕

它会重新计算

求余运算

它会重新绘制到这个画布中

画布范围内

所以通过这个简单的求余运算

实际上是把运动对象

始终锁定在画布范围之内的

也就是我在课件中最后部分讲到的内容

同学们再来看

我可以做一个修改

如果我把初始的速度变为-1,大家看会发生什么事情

关掉这个窗口重新运行一下

大家看

会向左

为什么会向左呢

实际上你的x轴分量是负值,它是自右向左的

为了更明显起见

我把这个纵方向上的速度置为0

也就是不垂直移动了

我再把它的初始位置改为10,或者100吧

更明显一些

我们来看看效果

关闭一下,运行

大家看,如果当它的x分量,速度分量是负的

大家可以想象,它的位置,每一秒钟会减60次1, 这个时候它自然会从右向左运行

好,那我们把它改成10,正的10,而且数值变大

会发生什么事情呢?

运行速度会加快

同样的道理,我们再来看一下

我们把x设置为0,y方向设置为负的,-1

我们看下效果

-1大家想一想,y方向负1,记得我们在课件里面讲过

Y轴的正方向是向下的,所以负值,它实际上是从下向上运动

好,我再把它改成正的1

运行一下

关掉,运行下

这个效果就非常能够说明我们的y轴是竖直向下为正方向

好了,关于运动这一块的内容我就介绍到这里

今天的课到此结束。

Python 交互式程序设计导论课程列表:

第0周

-课程简介

--课程简介

-A 课程视频(算数操作符及表达式)

--绪论

--Python交互式解释器使用方法

--PyCharm集成开发环境介绍

--算数操作符及表达式

-B 课程视频(变量及赋值)

--变量

--项目提交

--“我喜欢Python”热身小项目

-C 辅助视频(计算机结构、Python开发环境安装)

--Windows平台安装Python开发环境

--Mac平台安装Python开发环境

-D 辅助视频(如何提交项目)

--项目提交

-第0周--小测验

-本周项目:"我喜欢Python"

--项目发布、完成、提交及评分流程

--游戏说明

--程序说明

--编码步骤

--评分标准

--项目模板

--项目提交

第1周

-A 课程视频(函数)

--函数

--其它操作符

--随机函数

-B 课程视频(逻辑及表达式)

--逻辑值和比较

--条件

--编程技巧

--“老虎杠子鸡虫”游戏

-第1周--小测验

-本周项目:“老虎杠子鸡虫”游戏

--游戏说明

--程序说明

--编码步骤

--评分标准

--项目模板

第2周

-A 课程视频(Python交互式应用)

--事件驱动编程

--事件可视化跟踪执行

--SimpleGUITk

--按钮

-B 课程视频(输入框、全局变量)

--输入框

--局部变量和全局变量

--编程技巧

--“猫咪藏在哪个房间”游戏

-第2周--小测验A

-第2周--小测验B

-本周项目:猫咪藏在哪个房间

--游戏说明

--程序说明

--编码步骤

--评分标准

--项目模板

第3周

-A 课程视频(画布绘图)

--画布和图形绘制

--字符串处理

--绘图和计时器可视化跟踪执行

--图片和音效

-B 课程视频(计时器)

--计时器

--交互式绘图

--“神奇时钟”游戏

--编程技巧

-第3周--小测验A

-第3周--小测验B

-本周项目:“神奇时钟”

--游戏说明

--程序说明

--编码步骤

--评分标准

--项目模板

第4周

-A 课程视频(列表)

--列表

--键盘输入

--列表及变化可视化跟踪执行

--碰撞和反射

-B 课程视频(键盘控制)

--速度控制

--运动

--编程技巧

--“桌上冰球”游戏

-第4周--小测验A

-第4周--小测验B

-本周项目:“桌上冰球”游戏

--游戏说明

--程序说明

--编码步骤

--评分标准

--项目模板

第5周

-A 课程视频(鼠标输入、列表进阶)

--鼠标输入

--Video

--Video

--Video

-B 课程视频(字典和图片)

--Video

--Video

--Video

--Video

-第5周--小测验A

-第5周--小测验B

-本周项目:“世界杯八强连连看”

--游戏说明

--程序说明

--编码步骤

--评分标准

--项目模板

第6周

-A 课程视频(类)

--面向对象编程(类和对象入门)

--面向对象编程(类和对象进阶)

--对象可视化跟踪执行

--华容道中的类

-B 课程视频(平铺图片)

--平铺图片

--理解对象

--编程技巧

--“华容道”游戏

-第6周--小测验A

-第6周--小测验B

-本周项目:“华容道”游戏

--游戏说明

--程序说明

--编码步骤

--评分标准

--项目模板

第7周

-A 课程视频(类进阶及文件操作)

--集合

--文件操作

--文字块类

--处理停止的文字块

-B 课程视频(游戏状态控制)

--游戏记分规则

--游戏结束的条件及处理

--编程技巧

--“决战三字经”游戏

-第7周--小测验A

-第7周--小测验B

-本周项目:决战三字经

--游戏说明

--程序说明

--编程步骤

--评分标准

--项目模板

第8周

-A、课程视屏(精灵集合)

--Video

--精灵类

--战士类

--编程技巧

-B、课程视屏(动画)

--精灵碰撞

--精灵动画

--编程技巧

--保卫家园游戏

-第8周--小测验

-本周项目:守卫家园

--游戏说明

--程序说明

--编程步骤

--评分标准

--项目模板

运动笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。