下面我们来为敌人添加近战武器:
- 首先,创建“敌人武器”角色,添加素材。
- 在敌人武器中添加如下代码。其中圈起来的代码可从敌人角色中拖过来。
克隆敌人武器
在射击游戏初级篇教程中,敌人的武器和敌人是一体的。这样的好处是更简便,不需要克隆敌人武器、不需要考虑如何让敌人武器跟随敌人并做出动作;但坏处是,无法让武器指向玩家,子弹射出方向和武器朝向不一致:
因此,在本教程中,敌人武器将从敌人分离出来,成为独立的克隆体,跟随敌人并做出动作。
- 我们可以在敌人角色中,添加下面代码,让敌人克隆出来时,也克隆自己的武器:
- 新建列表“克隆体生成请求”,用于保存克隆体的生成请求信息。(注:这里是敌人武器的生成请求,之后敌人子弹等的生成也会用到这个列表)
但是,如何让刚克隆出的敌人武器知道自己要跟随哪个敌人呢?
一个办法是,克隆武器前,使用全局变量记录武器要跟随的敌人编号,然后武器克隆出来后,读取全局变量的值。
但是这样可能会存在并发覆盖问题:例如同时克隆多个敌人,最后蓝框处全局变量的值会取决最后一个放置的敌人。这样 4 个敌人克隆的武器克隆体,读取全局变量时,读取到的都是最后一个敌人的编号,导致 4 把武器移到最后一个敌人,而前三个敌人没有武器。
因此,我们不使用变量,而是使用列表来保存敌人武器的生成请求。
然后,在敌人角色中,当需要生成武器时,将生成武器的请求存入列表(第一项存要克隆哪个角色,第二项存附加信息,比如武器跟随的敌人编号)
这样,武器的生成请求就都存入了列表里,不会发生覆盖丢失。然后再在“敌人武器”角色中处理这些请求。
我们可以把相关积木做成自制积木:
(注:“敌人武器”前面可以加上标识“##”,避免在某些极特殊情况下,“敌人武器”这个内容也在其他地方用到造成混乱)
- 回到敌人武器角色,编写处理请求的代码:
- 新建私有变量“temp”(即“temporary”,表示这是临时变量),存放请求在列表中的位置。
- 新建私有变量“武器名”、“武器所属敌人编号”。从请求中读取武器名,武器所属编号。然后武器克隆自己;
- 之后从请求列表中删除请求信息(一个请求占多少项,就删多少)。
a.点击绿旗时,清除请求列表;
b.新建自制积木“处理克隆体生成请求”(注意勾选“不刷新屏幕”,这样当同时存在多个请求时,也可以一瞬间处理完)
接着,完成自制积木代码:
让武器跟随敌人
- 首先,让武器一直移到自己所属的敌人,当敌人血量归零,就删除武器:
- 为了让武器面向所属敌人的方向,我们新建一个列表“敌人方向”。添加下面代码,这样,就可以读取每个敌人的方向了:
- 然后,回到武器,添加武器“刀”的动作
这样,我们就实现了武器跟随敌人:
为敌人编写攻击代码
接下来,为敌人添加攻击代码。
- 新建列表“敌人攻击指令”,敌人通过这个列表给自己的武器下达攻击命令。0 表示不攻击,1 表示攻击。
- 然后为敌人编写攻击逻辑:
- 让敌人面向某个坐标;
- 求敌人到某个坐标的距离;
- 可以把敌人碰撞检测、限制在地图内的代码放到右边的代码中,避免被左边的等待代码干扰;
- 将面向玩家的代码,替换为“面向坐标”自制积木(前面讲过原因,直接使用“面向玩家”代码不准确)
- 当离玩家较远时(距离>40),尝试靠近玩家;
- 否则,将攻击指令设为 1,等待指令变为 0(武器攻击完毕后将指令重新设为 0)
a.首先,给敌人编写下面的自制积木:
b. 将敌人代码修改如下:
为武器编写攻击代码
- 在武器中,编写下面的代码:
a.当没有攻击指令时,武器面向敌人相同方向;
b.当收到攻击指令时,武器播放攻击动画,然后将攻击指令设为 0。
效果:
<iframe
width="100%"
height="800px"
scrolling="no"
src="https://www.ccw.site/embed?id=STG202/Arkos/Lec4/05&type=comment"
title="{射击4-为敌人添加近战武器}"
frameBorder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
scrolling="0"
></iframe>