现在我们的敌人可以追逐玩家。但是,当敌人移到屏幕外时,会被卡在边缘:
这是由于一个众所周知的原因:Scratch 中的角色的活动范围总是会限制在舞台内,如果想让角色移到很远的地方,往往会被卡在边缘。比如,下面让角色移到(100000, 100000),但实际只移到了(319,173)(被卡在了边缘)
在下面敌人的代码中,敌人实际希望移到的 x 是 -514(屏幕外),但由于被舞台边缘限制,只能移到 -321,导致出现敌人被卡在左边缘的尴尬场景。
解决这个问题有四个方法:
- 方法1(兼容原版):通过放大角色,让角色绕过 Scratch 的舞台边界限制;
- 方法2(兼容原版):当角色被卡在边缘时,就隐藏角色;
- 方法3(更简单):使用拓展积木“强行移到xy”,从而突破舞台边界限制。
- 方法4(最简单):使用拓展积木“关闭角色围栏”,直接关闭 Scratch 的舞台边界限制。
注:如果你是共创世界的用户,不考虑和原版的兼容性,强烈推荐使用拓展,会大大简化你的代码。
在这个教程里,我们将主要选择使用方法 2(在后续教程中你看到的相关代码也是方法 2 的)。
方法1:通过放大角色,让角色绕过 Scratch 的舞台边界限制
在 Scratch 中,如果角色的大小特别大,角色在舞台上移动的范围也越大(这是因为,如果角色很大,即使移动比较远,仍然能在舞台看到这个角色,而 Scratch 主要限制角色能有一部分保持在舞台上,因此对大型角色的移动限制比较宽)。比如我们的地图背景角色,就能够移到(1311, 616)这样远的位置。
这就给我们突破 Scratch 舞台限制提供了方法:
- 先将角色大小设置为很大,并切换到一个很大的造型。此时角色的移动就几乎不受舞台限制,移到舞台外后,再切换回角色原来的造型和大小。
- 首先,给敌人添加一个充满屏幕的大造型,命名为“满”:
- 制作如下自制积木“强行移到xy”,这个积木可以让角色移到极远的地方:
- 在使用了上面的积木后,还要将角色的造型和大小切换回来。因此,新建私有变量“原大小”、“原造型”(记得选择“仅适用于当前角色”),然后添加如下代码:
- 使用自制积木后,敌人不再卡在边缘:
方法2:当角色卡在边缘,隐藏角色
新建如下的自制积木。这个积木的作用是,当角色被卡在舞台边缘时,就隐藏角色(这样,角色看起来就像移到了屏幕外),而当角色在屏幕内时,就显示。
为新积木编写下面的代码:
- 首先,角色移到目标地点;
- 之后,判断角色实际坐标和目标坐标是否相等:
- 如果角色移动后,角色坐标等于目标地点坐标,说明角色正确移到了目标地点,此时显示角色;
- 否则,角色坐标和目标地点不相等,这说明,角色的朝目标移动后,被卡在了舞台边缘,导致角色实际坐标和目标坐标不相等。此时就隐藏角色。
但是,上面的代码可能有潜在的问题:考虑到小数的精度原因,通过相等来判断可能不是特别准确。(比如,可能存在目标 x 为0.3333334,而角色 x 为 0.3333333,两者相差0.0000001,但就是不相等)
因此,我们可以改用下面的代码,做近似判断:当两者的差值小于 1,就认为角色移到了目标位置。
其中,下面的积木的作用是,求两数的差:
绝对值含义:a 的绝对值,写为 |a|,结果为 a 去掉符号。
例如:-4 的绝对值 |-4| = 4,3 的绝对值 |3| = 3(正数和零的绝对值还是自己)
绝对值的一个重要应用就是求两数的差值。
例如:求 a 和 b 的差值,你可能想到的是 a - b,但如果 a=3,b=5 ,那么 a-b 结果是负数: -2
这时就可以使用“绝对值(a-b)”来求 a 和 b 的差值。
例如:绝对值(3-5) = 绝对值(-2) = 2,即 3 和 5相差 2。
因此,使用下面的积木,判断两数的差小于 1。
因此最终代码如下:
最终敌人的代码如下:
现在,敌人在屏幕外的时候就可以正确隐藏了👇
方法3:使用 Arkos 拓展
如果你不介意使用拓展,也可以使用“Arkos 拓展”中下面的积木,这样角色移动时不会被卡在边缘:
使用拓展后的代码 be like:
这样可以非常方便地解决上面的问题。
方法4:使用费米拓展
你也可以使用“费米拓展”中的积木:
使用下面的积木,关闭角色围栏(即舞台边缘限制)。这样角色就可以自由的移出舞台区外。这样,可以直接使用敌人原来的代码而不作任何修改。
<iframe
width="100%"
height="800px"
scrolling="no"
src="https://www.ccw.site/embed?id=STG202/Arkos/Lec1/05&type=comment"
title="{射击1-让敌人离开屏幕}"
frameBorder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
scrolling="0"
></iframe>