接下来,我们在敌人角色中,制作两个自制积木,分别是:
- 已知两点坐标,求两点距离:
- 已知两点坐标,求点 1 朝向 点 2 的方向:
这两个模块非常重要,会在之后的教程里多次用到。
注:你也可以使用下面的拓展积木,实现等价的效果:
求两点距离
首先,在滚动大地图作品中,检测到玩家的距离最好不要用下面的积木。因为当敌人被卡在舞台边缘,而没有移到屏幕外正确的地方,下面积木得到的距离就不是真实的距离。
此外,如果我们想要求两个克隆体之间的距离,也无法使用上面的积木(上面的积木只能求到某个角色的距离,无法求到克隆体的距离)。要求克隆体的距离,只能通过坐标来计算距离。
因此,我们需要制作下面的积木,用于求两点距离,这就涉及到一个数学知识:勾股定理。
勾股定理:
这样,已知两条直角边,就可以求出斜边的长度:
c = √(a² + b²) 【其中√(a) 是平方根运算,如果 x² = a(x>0),则 x = √(a)】
勾股定理的一个重要应用,就是求两点的距离。
解答:绘制如下的直角三角形,直角边垂直于坐标轴。
这样得到两条直角边长度:x2 - x1、y2 - y1。
然后根据勾股定理,就可以求出两点距离 d = √( (x2-x1)² + (y2-y1)² )
(注:对于 x2 < x1,y2 < y1 的情况,这条公式同样适用,因为(x1-x2)² = (x2-x1)² )
这样,我们就可以在 Scratch 中求两点距离。写法如下:
自制积木使用方法如下。例如,求敌人到玩家的距离:
求两点方向
类似的,在滚动大地图作品中,最好不要用下面的积木来面向玩家。因为当敌人被卡在舞台边缘,下面积木得到的方向就不是正确的方向。
同样,如果我们想要面向一个克隆体,也无法使用上面的积木(上面的积木只能面向某个角色)。
要想面向一个克隆体,可以通过求面向克隆体坐标对应的方向来实现。
而要制作这个积木,又涉及到一个知识点:反三角函数
同样,cos(x) = t,那么 acos(t) = x。
同样,tan(x) = t,那么 atan(t) = x。
三角函数的作用是,已知角度求边;而反三角函数的作用则是反过来:已知边求角度。
例如,在下面三角形中,已知a、b、c,可以通过反三角函数求出角 A 的大小:
- A = asin(a/c) (因为 sin(A) = a/c)
- 或 A = acos(b/c) (因为 cos(A) = b/c)
- 或 A = atan(a/b) (因为 tan(A) = a/b)
例:如下图,已知点 A(x1, y1),点B(x2, y2),求点 A 朝向点 B 的方向?
解答:绘制如下的直角三角形,直角边垂直于坐标轴。
这样,根据反三角函数,可以求得:角度 α = atan( (x2-x1)/(y2-y1) )
(这里只考虑了点 2 在点 1 右上角的情况,其他情况这里就不再讨论,可以直接看下面的结果)
最终,可以使用下面的代码,来求点 1 面向点 2 的方向:
例如,使用下面的代码,让敌人面向玩家:
<iframe
width="100%"
height="800px"
scrolling="no"
src="https://www.ccw.site/embed?id=STG202/Arkos/Lec4/04&type=comment"
title="{射击4-面向坐标、距离计算}"
frameBorder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
scrolling="0"
></iframe>