当前课程知识点:Python 交互式程序设计导论 >  第8周 >  A、课程视屏(精灵集合) >  战士类

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

战士类在线视频

战士类

下一节:编程技巧

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

战士类课程教案、知识点、字幕

各位同学,大家好

欢迎回到Python交互式程序设计课程中

终于迎来了本学期这门课程的最后一个项目——保卫家园

那这个项目呢,是对前面所讲述的内容的一个综合应用

相对而言呢,可能难度较大

所以本周的视频呢都是紧紧围绕这个项目开展的

本课,我们将介绍这个项目中一个重要的类,战士类

好,下面开始我们今天的内容

各位同学可能在前面的视频中

对保卫家园这样一个游戏项目呢,都有了一定的了解

在这里呢,我只是再简单的强调几个问题

第一个,在游戏启动以后,游戏界面中呀,会包括这样几类元素

一个是城堡,还有敌人,还有就是战士

那么当点击下鼠标,战士会射箭来攻击敌人

那这个就是游戏的一个基本运行情况

我们今天,就紧紧围绕战士来讨论一下战士类应该 具有的属性和方法

好,我们来思考一下,战士类中,应该包含哪些属性

换句话说,我们需要哪些属性或者参数才能把一个战士的行为描述清楚

那么实现游戏中战士拥有的一个功能,我们来看一下

首先我们要在界面上绘制一个战士,那么必然要回答两个问题

一个,你画什么样的战士,也就是图片信息, 这个图片资源是从哪里来的

怎么加载进来,这是我们要回答的一个问题

第二个,在哪里画,也就是说,这个图片资源,我会画在什么坐标

什么位置,这是我们必须要回答的问题

下面,当我们使用方向键来移动战士的时候,移动战士, 以什么速度,什么方向

当然这个速度呢当然会包括水平和垂直两个分量

那么通过正负号来控制战士移动的两个方向

那么当我点击鼠标以后啊,战士会射箭来攻击

那么战士在射箭的时候,向哪个角度射击,大家可以考虑一下

那么箭头的指向应该是我鼠标点击的那个位置

好,点击的那个位置,那么这就牵扯到射击的这个角度

最后一个,战士的状态,实际上大家通过执行这个游戏

可以发现,当我点击鼠标,它射箭的那一刹那, 战士的图片实际上是不同的

当你射击完了以后,战士图片又恢复到原来的状态

也就是说,战士图片资源的装载,取决于它的射击状态

它正在射击,还是已经射击结束了

所以这个时候呢,我们需要有一个状态信息来描述

通过信息状态来装载不同的战士图片资源

这是我们战士类应该包含的这些属性

好,下面我们来考虑一下

战士类中应该包括哪些操作或者哪些方法来支撑战士所能完成的行为

首先,战士要能够在画布中能够绘制自己,能够把自己绘制出来,

实际上这个绘制呢大家知道,随着它的射击状态不同, 实际上绘制的是两个图片资源

第二个呢,是射击,当你点击鼠标以后

这个战士会按照你点击的那个方向,射出一个箭

好,射出一个箭,那也就是shoot

我们要通过这样一个方法来实现它的射击这样一个动作

第三个呢,就是更新位置,这个含义很好理解

我们通过方向键啊,可以来调整这个战士所处的位置

好,在这儿呢,我只是强调一点,既然牵扯到战士的位置变化,

那就有可能移动出屏幕这个时候呢,大家就要考虑,

我们如何通过求模运算使得它锁定在这个画布范围之内

这个呢,我们在前面讲运动那一节课的时候,给大家提到过

好,大家现在看到的这个代码片段呢

实际上是我从各位同学的模板当中截取的一部分

我们首先在这儿呢做一个简单的分析

然后呢,会到PyCharm环境中,给大家具体来讲解

在这里呢,一个soldier,就class,就是所谓的战士类

应该包含哪些属性,这些属性应该能完成我这样一些功能描述

好,我们来看一下,除了self这个参数不讨论以外

剩下的,那大家看有几个,pos,vel,角度,图片和info

首先,我们如果想把一个战士绘制在屏幕中

当然要有一个位置信息,一个位置信息

这个参数呢,会传入到这个类的pos这个同名的属性里

那么当我敲击上下左右键,那么这个战士会发生移动

这个时候呢,我们会有一个速度的参数传入进来

当然,这个速度呢,应该包含x和y轴两个方向的分量

这个角度呢,大家可以想象,这个角度是来干什么的呢?

大家想,当我鼠标点击某一个位置,假设这个时候战士是正面朝前的

当我点击这个位置以后,实际上它需要向我这个位置发射一个箭

这个时候呢,这个战士本身的图片会发生一定角度的偏转

那么这个角度,就是来描述战士,它的图片资源转载以后的绘制角度的

它始终得把它的正面指向它的发射方向,也就是我鼠标点击的这个方向

那么这个image参数呢,很好理解了, 就是装载soldier这个class的图片资源

换句话说,就是战士的图片

好,那么在本项目当中,战士的图片实际上有两个

它在一个图片资源当中实际上是两部分

前面这个呢,是正常态的一个战士的图片

而后面呢,是一个设计状态的图片

这个呢,我们会在实际的项目当中,给大家展示一下

最后一个,info,info呢,可能在前面的视频当中

大家已经知道了,它实际上是对image这个图片资源的 相关属性的描述

那么有了这个info以后,我们再调用这个图片的时候就会很方便

前面我们在image,info里面class当中对它有具体的描述

装载图片资源的时候,实际上对它就初始化了

好,那么这一部分,大家应该非常熟悉了

实际上呢,是对传入的这些初始化的资源参数, 把它们赋予了同名的class的属性

但是,也有特例。什么特例呢

大家看一下,shoot,这个shoot呢,我默认的是false

它并没有接收来自外界传入的一个参数的初始化

那么这个shoot呢,就是前面提到过的描述这个soldier的状态

shoot如果是true,就表明,它正在处于射击状态

这个时候我就要装载的是后面这张图片

否则,我就装载的是前面这张图片,这个shoot,就是做这个判断

好,那么,下面这部分呢

就是刚才我所描述的soldier, 这个class需要提供的哪些操作或者哪些方法

顾名思义,shoot,是用来射出一个箭

而draw是用来绘制自己

第三个,update,是用来更新战士的位置

好,下面呢,我们在PyCharm的环境当中给大家再做详细的讲解

启动PyCharm,打开项目的程序模板,我们主要关注的是 soldier_class战士类

那么在课件当中,我们已经对战士类的主要的属性进行了详细的讲解

那在这儿呢,我就不重复了。我们主要来关注的是三个方法

那么这三个方法中啊,shoot方法可能实现起来要相对困难一点

它呢,是完成战士的射击动作,draw方法呢,是用来绘制战士

那么update呢,是用来更新战士的位置,实现一个移动的效果

Shoot方法中啊,为什么会相对复杂一些?

大家可以考虑一下,当用户在界面上点击鼠标左键的时候

那么战士会调用shoot方法来创建一个新的游戏精灵

也就是创建一个新的箭,并把这个箭呢,加入到相应的集合中

同学们对游戏精灵这个概念应该有了一定的了解

好,我们来看一下

实际上啊,在程序的一开始,我们在全局变量的申明位置呢

已经定义了一个全局变量,叫arrow group, 这是一个集合类型的变量,

那么,注释上也写得很清楚,所有的箭对象,它都存在这个集合当中

那么程序呢,定义了一个专门的处理游戏精灵的一个辅助函数

大家看,在这里,它呢,主要完成的是对游戏精灵集合的一个绘制

它会逐一扫描集合当中的所有的游戏精灵

并按照游戏精灵提供的参数把它绘制在界面上

这就是说,我们在soldier class当中,shoot这个方法

我们不需要管绘制,只需要生成一个箭对象, 并把它加入到一个相应的集合中就可以了

好,那我们来看一下,shoot当中,我们应该实现哪几个步骤

那我在这儿用文字来描述一下

第一步,我们想一想,当然我们希望创建一个所谓的arrow对象

假设我们就这么写成汉字,创建一个新的arrow对象, 创建了一个箭

那么作为一个游戏精灵,我需要把它加入到一个相应的集合中

实际上就是我在前面提到的arrow group这个集合中

好,看上去就两步,但是同学们想一想

我如果想创建一个arrow对象,可以直接创建吗?需要计算吗? 大家思考一下

同学们想一想,在界面中啊,我点击一下鼠标左键,那么这个战士

它就会面朝我的这个点击方向,并且它发射出去的箭呢

也必须指向我的点击方向,那这个时候呢,也就是说, 在创建arrow对象之前

我先要对arrow对象的角度进行计算

所以呢,实际上,我们前面应该还有一步,什么呢?

计算角度。有些同学可能会问,这个角度该怎么计算呢?

实际上,不复杂,只需要用一些基本的数学知识就可以完成

我们在幻灯片当中,简单的来描述一下

好,大家看,假设,我点击了这样一个位置

那么这个时候呢,鼠标的点击事件里面会修改这个战士的角度

它呢,就会面向我,也急速它会面向这个方向

好,那我们把它面向的这个方向延长,那当然,直线画的不是太直

大家知道这个意思就可以了。这是水平方向

那么点击了这个鼠标的位置以后呢,它的角度会发生变化

那么在程序的这个soldier class里面,刚好有一个属性, 是用来描述这个角度的

如果我知道了这个角度,大家可以想一想,我发出去的箭,发出去的箭

也就是创建的这个游戏精灵箭,这样一个对象

大家想一想,这个图片绘制的角度我就知道了,对吧,刚好是这个角度

下面需要注意的是,我还需要给这个箭呢,赋一个速度

这个速度呢,是有x和y两个分量的,这两个分量,我该如何设置?

大家想一想,速度实际上本身是一个向量,它是有大小有方向的

那么我在给这个箭赋速度的时候,也要遵循这样一个角度

换句话说,我给它的速度

必须按照这个角度确定横方向上的速度和纵方向上的速度关系

大家想一想,假设,我在横方向上和纵方向上,这个比例关系是已知的

假设这是2:1的关系,那么我在速度分量上

它的x和y也必须保持这样一个2:1关系,它才能 沿着这样一个角度向前移动

所以啊,我们对于角度的计算,不仅确定了 这个箭头的图片的绘制的扭转角度

偏转角度,实际上还确定了速度的x分量和y分量的关系

这个是大家需要注意的

好,当我们确定了箭头的指向,并且也确定了箭头的初始速度

这个时候我们就可以创建一个arrow对象

创建的时候呢,同学们应该还有印象

我们需要用到sprite这个游戏精灵类来创建

然后调用的是这个arrow_group这个集合的add的方法

把这个箭头的对象呢,加入到这个集合中

实际上我们的设置方法呢,就是实现这么几步就可以了

好,下面呢,我们来看第二个方法,绘制

对于绘制来讲,同学们已经做过很多遍了

理解起来也不困难,那么在这儿我要强调的一个问题是

我们绘制战士呢,是分情况的。什么意思呢?

同学们还记得我们在课件当中提到shooting

实际上我们,初始化的方法展开,大家看

它有个shooting的属性,初始状况下是false

那么当你点下鼠标的时候,它发射出新的箭

那么这个时候,shooting呢就改为true了

我在draw方法中,我需要判断一下shooting的值

换句话说,我要判断一下战士的状态, 大家想想是不是这个道理,为什么呢?

因为战士的不同状态决定了我绘制不同图片资源

我们来看看,应该是shooting它本身是个布尔型的

如果这个值是真值,我会绘制图片1

图片2

这个含义是什么呢

根据战士的状态类型来决定绘制哪个图片

怎么理解,我们来看一下这个图片资源,同学们就会很清楚

大家来看一下这个图片,这个呢,是一张图片,左边的这个图片呢

这个图片的左边部分呢,是不处在射击状态,就是正常状态

而右边这个图片呢,是处在射击状态的一个图片

那么当shooting这个状态变量,它如果处于false, 就是没有在射击状态的时候

实际上我们绘制的是这样一部分

当shooting为true的时候,我们绘制的是这样一部分

大家知道,那么我们在绘制这个图片的时候, 实际上获取了它的中心节点和半径

也就是范围,是不一样的,在draw当中还需要注意这样一个问题

其他的内容呢,跟我们前面用到的draw函数几乎是一样的

就是来绘制draw,image这样一个图片资源

第三个方法呢,非常简单,我们一两句话就可以介绍清楚

这个update呢,是用来相应什么呢,当你敲下去键以后

上下左右的这样一个方向键,那么战士会发生移动,战士移动的时候

实际上就是来更新位置,什么样的一个位置呢,战士的位置

战士的中心点的位置,也就是pos。在这里呢,我只想强调一句

如果你持续更新的话,它很有可能会超出画布的范围

这个时候我们需要对位置,加上它的移动的偏移量需要 跟它画布的长和宽求余

这个时候才能将这个战士锁定在这个画布内

那么对于战士类呢,我们就介绍这么多,我要强调的是什么呢?

同学们在研究某一个类的时候啊,一定要搞清楚整个程序的框架

因为这个类当中的很多代码的使用或者是调用或者是实现步骤

实际上是跟类之外的代码有关系的

好,比如说,我们刚才讲到的shoot这个方法当中

我要创建一个arrow对象,需要把它加入一个集合

那么集合内部的游戏精灵的绘制实际上是其他函数来完成的, 这是需要大家清楚的

好了,今天的课程就讲到这里

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周--小测验

-本周项目:守卫家园

--游戏说明

--程序说明

--编程步骤

--评分标准

--项目模板

战士类笔记与讨论

也许你还感兴趣的课程:

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