上一节中我们实现了固定地图的碰撞箱:
下面我们来看如何实现滚动大地图中的碰撞箱:
在大地图中实现碰撞箱:
在滚动地图中,由于玩家、背景都在移动,碰撞处理会变得比较麻烦。
而且,在 Scratch 中,当角色移到了舞台外,下面的检测积木会失效,因此在舞台外的子弹或敌人将无法判断和地图的碰撞。
(注:如果使用了大地图拓展,则舞台外也可以检测碰撞,无需担心这个问题,可直接使用非大地图碰撞箱的方法)
为了解决这个问题,可以采用下面的办法:
- 让地图碰撞箱缩小,固定在舞台中心:
- 然后,当角色需要检测是否碰到地图障碍时,就让角色切换为碰撞箱造型,缩小并移到碰撞箱小地图上的对应位置,再检测碰撞:
编写代码:
- 首先,创建角色“地图碰撞箱”,添加碰撞箱造型:
2.为地图碰撞箱编写下面代码:
a. 新建一个变量“碰撞箱缩放系数”,用来记录从地图到地图碰撞箱的缩小倍数。
(例如,填 0.1 表示从地图到地图碰撞箱的大小,缩小了 10 倍)
b.其中,下面黑框圈起来的积木的值对应右侧的积木:
这样,地图角色大小为 300,则碰撞箱角色大小 = 300 * 碰撞箱缩放系数 = 300 * 0.1 = 30
这样,地图碰撞箱就被缩小并固定到了舞台中心:
由于我们不想让碰撞箱显示出来,我们添加下面的虚像设为 100 代码。和直接隐藏的区别是,虚像 100 后仍然可以参与碰撞检测,而直接隐藏将无法检测碰撞。
3.接下来,在“玩家”角色中使用下面的代码,让玩家移到碰撞小地图对应的位置,以便检测碰撞:
4.为玩家编写如下代码:
a.首先,玩家切换到碰撞箱造型,并缩小大小,移到小地图碰撞箱对应位置。
b.如果玩家碰到了障碍,则回到(上一刻x, 当前y),再检测碰撞。如果没碰到障碍,就回到上一刻x;
c.如果仍然碰到了障碍,则回到(当前x, 上一刻y),再检测碰撞。如果没碰到障碍,就回到上一刻y;
d.如果仍然碰到了障碍,就回到(上一刻x, 上一刻y)
e.检测完碰撞后,设置回之前的造型,并移到正确的位置,设置大小(注:这里把移到正确位置和设置大小的代码做成了一个自制积木,方便调用)
这样,我们的玩家就实现了碰撞箱效果!
5.同样,给敌人编写类似的代码,让敌人也受到碰撞箱的限制:
注意:在检查碰撞前,必须让角色显示(如果角色被隐藏了,将无法检测碰撞)。
完成!
<iframe
width="100%"
height="800px"
scrolling="no"
src="https://www.ccw.site/embed?id=STG202/Arkos/Lec3/02&type=comment"
title="{射击3-大地图的碰撞箱}"
frameBorder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
scrolling="0"
></iframe>
本页索引