注意到,子弹发射时是直接移到了武器的坐标位置,而不是武器枪口。
之前的解决办法是简单粗暴地让子弹发射后前移一段距离。但是这样有两个缺点:
- 只考虑了子弹的前移,还需要上移一点;
- 不同武器的枪口位置不同,还需要根据武器变化。
因此,可以让武器发射子弹前,计算武器枪口坐标。在枪口坐标克隆子弹。
计算枪口坐标
我们可以用相对武器的坐标来表示枪口位置,前移距离记为 x',上移距离记为 y'。
例如下面武器的枪口相对坐标(大概估计)为(30, 5)
我们可以在玩家武器中,编写下面的自制积木,用于求玩家武器的枪口位置:
(新建私有变量“枪口x”,“枪口y”,用于保存计算结果)
那么问题来了,已知武器坐标(x0, y0),枪口相对坐标(x', y'),武器方向 α,如何计算枪口坐标(x, y)?
一种计算办法是,先移到武器位置(x0, y0),然后面向武器方向移动 x',左转 90° 移动 y':
(其中,朝 xx 方向,移动 xx 步可以参考之前写的移动代码↓)
将上面的六行结果合并到两行,就是:
还可以继续化简成下面的代码:【因为 sin(a - 90°) = -cos(a);cos(a - 90°) = sin(a)】
这样,我们就可以使用下面的代码,计算玩家武器的枪口位置:
但是,当武器朝左时,似乎枪口位置不太正确:
这是因为,武器朝左时,武器前移后,应该右转,而不是之前的左转:
因此,代码修改如下。得到的就是最终用于计算武器枪口的积木:
计算敌人枪口坐标
同样,我们给敌人武器也添加计算枪口位置的代码:
- 由于敌人有不同的武器,例如 G18 手枪、AK-47 步枪,不同武器枪口位置不同。我们可以新建两个私有变量“武器枪口x”“武器枪口y”,记录武器的相对位置坐标,例如 AK47 枪口位置是前移 30,上移 5,武器枪口x、y 就设为(30, 5)。
- 然后,定义敌人武器时,设置武器的枪口位置,比如下面 G18 手枪枪口位置 (10, 3),AK-47 步枪枪口位置(30, 5)
这样,敌人的子弹也从枪口位置射出了:
此外,计算枪口坐标,除了上面的理解方法,也通过绘制下面的两个直角三角形,通过三角函数求出枪口 (x, y):
- 大三角形中,水平边 = x' sin(α),垂直边 = x' cos(α)
- 小三角形中,水平边 = y' cos(α),垂直边 = y' sin(α)
因此:
- x = x0 + 大水平边 - 小水平边 = x0 + x' sin(α) - y' cos(α)
- Y = y0 + 大垂直边 + 小垂直边 = x0 + x' cos(α) + y' sin(α)
(和前面的方法求出结果相同)
<iframe
width="100%"
height="800px"
scrolling="no"
src="https://www.ccw.site/embed?id=STG202/Arkos/Lec5/04&type=comment"
title="{射击5-远程敌人}"
frameBorder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
scrolling="0"
></iframe>