如果把人物的阵营都改成玩家的阵营(即放置友军),友军仍然会攻击玩家(只不过友军的子弹无法击中玩家)。这是因为,人物代码中“目标敌人编号”现在固定是 1(即玩家),即使是友军也会选择攻击玩家。
因此,下面我们来为 AI 添加索敌:AI 每次循环,都从列表查找离自己最近的不同阵营的敌人。
- 编写如下自制积木(记得勾选“不刷新屏幕”),实现如下功能:
- 从列表中查找所有和自己阵营不同的人物,要求最终选择的人物离自己距离是最近的。
- 开始时,将最近距离设为一个很大的值,将查找的敌人编号设为空;
- 检查所有敌人,计算距离,如果距离比目前的最近敌人距离还要小,就更新最近距离,并把最近敌人设为自己。
- 这样,最终得到的敌人编号就是最近的敌人。
- 这样,我们就完成了人物的索敌(查找最近的非同阵营敌人)。放置的友军不再攻击玩家
- 现在人物武器的攻击对象还是锁定为玩家,需要把人物的索敌结果传递给他的武器。
- 新建一个列表“人物攻击目标”,用于保存人物索敌结果。
- 让人物每帧上传自己的索敌结果:
- 来到人物武器,让武器每帧读取自己的目标敌人编号:
- 不过,目前敌人和友军长得一模一样,无法区分,我们可以为友军阵营添加特殊的造型:(名字后添加“友”后缀)
你知道如何完成这个自制积木吗?
写成代码大概是这样:
(之所以开始时“最近距离”设为很大的 9999999,是为了在第一次比较时,敌人距离总是小于最近距离)
其中,开始时的极大值“999999”可以替换成下面的“1/0”:
在数学中,1/0 是没有意义的(0 不能作为除数)。
但是在 Scratch 中,1/0 的结果是 Infinity(无穷);
如果是 -1/0,得到的则是 -Infinity。
在 Scratch 中,Infinity 比任何数都大,-Infinity 比任何数都小。因此可以用作查找最大、最小值时的初始值(找最小值时,初始数设为 1/0;找最大数时,初始数设为 -1/0)
(为什么 1/0 = 无穷?可以这样理解:x 越小,1/x 越大,例如 1/0.001 = 1000,1/0.000001 = 1000000,因此当 x 趋近于 0 时,1/x 就趋近于无穷大)
总之,开始时的“最近距离”可以设为 1/0(无穷),这样查找到的第一个敌人无论距离多大,都会比 1/0 小。
这样,敌人的觅敌功能就正式完成了!玩家的友军会自动攻击帮玩家攻击敌人,不同阵营的 AI 会相互攻击。
这样,我们就实现了阵营系统,实现了添加友军!
<iframe
width="100%"
height="800px"
scrolling="no"
src="https://www.ccw.site/embed?id=STG202/Arkos/Lec8/03&type=comment"
title="{射击中级-8-03-不同阵营的索敌}"
frameBorder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
scrolling="0"
></iframe>
本页索引