目前,我们的主角只有 AK-12 步枪这一把武器。下面我们来为他添加更多武器,包括:
- G18 手枪
- UMP45 冲锋枪
- 刀(近战武器)
- 火箭筒!
添加更多远程武器
- 首先,在玩家武器角色中,新建如下自制积木,用于玩家切换武器并读取武器数据:
- 新建若干私有变量,记录武器信息:
- 武器名:当前玩家武器的名称;
- 武器类型:远程/近战;
- 武器攻击间隔:两次攻击的间隔;
- 武器攻击音效:攻击时播放的音效;
- 武器枪口相对x/y:枪口相对坐标;
- 武器伤害:子弹伤害或近战武器伤害。
- 切换武器时将造型切换到对应武器。
- 接着,我们修改之前的攻击代码:
- 开始时武器切换为AK-12;
- 按下鼠标时,如果“武器类型=远程”,执行远程武器动作(否则执行近战武器动作,这会在之后编写);
- 开火造型根据当前武器名设置;
- 开火结束后,等待“武器攻击间隔”。
- 修改发射子弹代码:
- 攻击音效填入定义的音效;
- 枪口位置填入定义的位置;
- 伤害填入定义的武器伤害。
- 这样,我们就可以通过添加武器定义,来增添更多远程武器。例如,添加 G18 手枪、UMP45 冲锋枪:
- 这样我们就实现了,通过按下1、2、3数字键切换 3 种不同的远程武器:
添加代码,通过按下数字键切换武器:
上面的代码有个小问题:如果一直按下数字键,就会一直执行切换武器的代码。因此做如下修改,按下数字键后,等待直到放开按键才执行后面动作:
添加近战武器
- 在定义中添加“刀”的定义
- 添加近战武器的攻击动作:
- 新建私有变量“造型编号”,记录当前造型的序号;
- 播放挥刀动作,造型依次切换为“刀攻击1”、“刀攻击2”……“刀攻击5”;
- 接下来,我们要考虑一个稍微复杂的问题——玩家播放挥刀动画后,怎么判断是否击中敌人,并扣除相应敌人的血量?
- 一个思路是:求武器到每个敌人的距离,如果距离小于一定半径(比如 90)就认为击中敌人,扣除敌人血量。
- 添加如下自制积木,用于检测击中的敌人编号:(由于计算到每个敌人的距离,会用到重复执行,要注意勾选“运行时不刷新屏幕”,以瞬间完成检测)
- 那么,这个自制积木要怎么编写呢?
- 开始时将检测编号设为空(即默认没有砍中的敌人)
- 循环,检测每个存活的敌人,计算到对方的距离。如果距离 < 检测半径 r,就设置砍中的敌人,并退出循环。
- 检测完毕后,添加下面的代码,如果判定半径内有敌人(检测结果不为空),就播放击中音效,并扣除相应敌人的血量:
- 然后,添加切换到近战武器的代码:
- 但是简单粗暴的距离判定也有点问题,比如敌人站在背后时,也会判定为打到:
- 敌人的近战武器判定也需要做出类似修改,让玩家站在敌人背后时,敌人无法砍到玩家:
(这个思路下,是否击中敌人的判定区域是一个圆(半径为判定距离,如90),如下↓)
答案如下:
这样,就可以得到武器半径内的一个敌人的编号:
完成!
一个办法是,改成半圆形判定,只有敌人站在玩家前方时,才判断为击中:
判断方法如下:武器朝右且敌人在右,或者武器朝左且敌人在左时,则认为敌人在玩家前方:
上面的代码也可以简化成下面的写法:
使用这个代码可判断“方向”和“敌人x - 武器x”是否同号。 (注:使用形如 a * b > 0 判断 a、b 是否同号(同正或同负), a * b <0 判断 a、b 是否异号(一个正一个负)) 最终半圆形的检测写法如下:
这样,敌人站在玩家背后时,玩家的攻击就不会击中敌人:
拓展 —— 扇形判定
前面讲了圆形判定和半圆判定,下面介绍一个更复杂的扇形判定,你可以选择性阅读。 扇形判定:敌人位置在武器朝向的一定角度内,认为是击中。
这个问题可以抽象为下面的问题:已知武器坐标 A,武器方向 α,敌人坐标 B,如何求武器和敌人夹角 θ?
要解决这个问题,有两个思路,三角函数或向量。这里介绍三角函数的做法:
首先,如下图, tan β = (x2-x1) / (y2-y1) (tan = 对边 / 邻边)
可求出 β = atan( (x2-x1) / (y2-y1) )
这样,就求出 θ = α - β = α - atan( (x2-x1) / (y2-y1) )
(这里只考虑了 B 在 A 的右上角的情况,其他情况还要分情况讨论,这里不再详细讨论)
写成代码大概是这样:(dx、dy为坐标差) (你会发现和上面介绍的内容相比,多了一些代码,是用来修正结果的)(注:布尔判断积木也可以参与运算,true 相当于 1,false 相当于 0)
这个自制积木的使用方法如下(求出敌人位置和武器当前方向的夹角):
得到的夹角为 -180~180,示意图如下,在左边时夹角为正,右边时夹角为负:
计算出夹角后,可以使用下面的代码,判断夹角在某个半角内(例如50°)
最终,判定代码如下:
这样,我们就实现了一个 60° 半角的扇形判定:
<iframe
width="100%"
height="800px"
scrolling="no"
src="https://www.ccw.site/embed?id=STG202/Arkos/Lec7/01&type=comment"
title="{射击7-添加手枪与刀}"
frameBorder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
scrolling="0"
></iframe>