接下来,我们尝试为我们的大地图游戏添加敌人,让敌人追随玩家移动。
首先,新建一个角色,命名为“敌人”,添加敌人造型。
让敌人动起来
接着,让敌人面向玩家移动。你可能会使用下面的代码:
但这样做是不对的!因为除了敌人自身在移动,还要考虑地图背景的移动。敌人需要跟随背景一起移动。
因此,我们之前讲到的内容就派上用场了:用私有变量记录敌人的地图坐标,通过修改敌人的地图坐标来移动敌人。
- 首先,为敌人新建私有变量“位置x”、“位置y”(记得选择“仅适用于当前角色”):
- 然后,将敌人代码修改如下:
通过上面的写法,敌人就可以跟随背景运动。通过修改敌人坐标,来改变敌人位置。
但这里有个问题:由于我们只能使用下面的积木,通过修改角色的坐标来进行角色的移动。
那么,如果我想实现“移动 10 步”的效果,如何通过增减 x、y 坐标来实现呢?
我们可以将移动 10 步分解成:先将 x 增加一定值,再将 y 增加一定值。
- 例如,当敌人朝 60 度方向,移动 10 步,实际上可以等价于:将 y 增加 5,再将 x 增加8.66。(注:x、y 的移动顺序可以调换,也可以先移动 y ,再移动 x,效果相同)
那么问题来了,如何根据移动方向,移动距离,求出 x 增加多少,y 增加多少呢?
先说结论,通过下面的代码,使用三角函数,可以求出 x、y 对应的增量。
那么,什么是三角函数?上面的 sin、cos 作用是什么?下面就来向你揭晓~
三角函数
三角函数其实并不复杂。三角函数主要包括三种:sin、cos、tan。他们读法依次为:
sin:
cos:
tan:
三角函数 sin、cos、tan 的含义如下:
在一个直角三角形中,选择一个锐角 A,那么有:
- sin(A) = 对边长/ 斜边长
- cos(A)= 邻边长/ 斜边长
- tan(A) = 对边长/ 邻边长
这样,通过三角函数,我们就可以把角度和各个边联系起来。已知一个角度,一条边,就可以直接求出另外两条边的长度!
例如,已知角 A 的大小,对边的长度,我们就可以求出邻边、斜边长:
- 邻边 = 对边 / tan(A)
- 斜边 = 对边 / sin (A)
注:对于同一个X,sin(X)、cos(X)、tan(X) 的值是分别固定已知的。在 Scratch 中,使用下面的积木来计算三角函数:
例子:下面的直角三角形中,已知斜边长度 10,一个角为 30°,求 x、y 分别为多少?
解答:使用三角函数,已知:sin(30°)=y/10,cos(30°)=x/10
那么,可以求出:
x = cos(30°) * 10
y = sin(30°) * 10
应用三角函数
在上面的简单介绍中,我们已经了解了三角函数的含义,以及基本用法。
接下来,我们来应用三角函数,解决刚刚遇到的问题:已知敌人的方向,以及移动的距离 d,如何求 x、y 的增加值?
运用刚刚学到的三角函数知识,可以知道:
- sin (方向) = x增量 / d
- cos (方向) = y增量 / d
因此,求出:
- x增量 = sin(方向) * d
- y增量 = cos(方向) * d
用积木写出来,也就是:
为了方便使用,我们可以将这个功能做成自制积木:
Scratch 中,可以添加自制积木。例如上面的例子中,创建了一个“移动 xx 步”的自制积木。
在积木的“定义”下编写积木要做什么。然后调用积木时,就会运行“定义”下方的积木。
可以给自制积木添加“参数”(传入的值),例如,上面的自制积木传入了“步数”参数,然后可以在代码中使用这些。
如果你仍然对自制积木的使用有疑惑,可以先去学习关于自制积木的教程。
运行效果:敌人将跟随玩家,并且会跟随背景偏移。
在上面,我们只考虑了方向在0~90°之间的情况:
如果方向>90°,或者方向是负数,三角函数还适用吗?
幸运的是,三角函数不仅适用于锐角的情况,也适合大于 90°,以及负数角的情况。因此,上面的两种特殊情况依然不会出现问题。
那么当角度大于 90°,或为负数时,sin 和 cos 运算的结果是多少呢?
- 如果我们将角度作为 x,将 sin(x) 作为 y,画在坐标系中,就会得到下面的图像:
通过这个图像,我们就可以得出当角度 x 为不同值时,sin(x) 的值为多少:
比如,当 x 从 0 变化到 90,sin(x) 从 0 变化到 1。这是我们熟悉的锐角的情况。
在其他特殊的角度,也可以通过将已有的图像对称过去,得到其他情况的图像。例如,当角度从 0 变化到-90,sin(x) 从 0 变化到 -1;当角度从 90 变化到 180,sin(x) 从 1 变化到 0。
- cos(x) 和 sin(x) 的图像比较类似,通过图像可以看出当角度 x 取不同值时,对应的 cos(x) 的值:
<iframe
width="100%"
height="800px"
scrolling="no"
src="https://www.ccw.site/embed?id=STG202/Arkos/Lec1/04&type=comment"
title="{射击1-尝试添加角色}"
frameBorder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
scrolling="0"
></iframe>