模拟到数字输入转换

模拟到数字输入转换

Analog to Digital Input Translation

模数转换             

通常使用模拟输入法(控制棒、触发按钮)来控制数字系统。也许你想用模拟棒控制菜单。也许你想检测一下模拟棒的敲击或双击。或者,正如本文的重点,您可能想用模拟触发器发射子弹。要做到这一点,需要比你预期的更为微妙。             

虽然INVERSUS并没有将射击绑定到模拟触发器上,但它的开始确实是这样的。你可以在我关于parry系统的文章中了解到为什么我改变了计划(尽管它可能值得它自己的文章),但重要的是要弄清楚它并不是因为触发器的感觉而改变的;触发器感觉很棒。             

假设我们已经成功地预处理了控制器数据,并且有一个从0.0到1.0的干净的浮点值,代表触发压力。0表示释放的触发器,1表示完全按下的触发器。             

我的具体目标是在玩家扣动扳机的情况下实现一次射击,但我将把这个目标抽象一点。我真正想要的是把模拟按钮输入转换成数字按钮输入。数字按钮处于按下状态或释放状态。如果我们可以评估一个模拟按钮的按下/释放状态,那么它应该很容易绑定到任何需要数字输入的游戏动作上。对于射击,我们可以在状态从释放状态转换为按下状态时发射子弹。             

那么我们如何将模拟按钮转换成数字按钮呢?             

分而治之(有点)             

最简单的事情就是选择一个压力阈值,将压力范围分为按下和释放状态。例如,如果压力低于0.5,则释放压力,否则压力将被按下。

如果你曾经玩过这样的游戏(不是那么常见)或者你自己也尝试过,你可能会注意到在阈值附近输入变得易变。不小心来回穿过门槛太容易了。就像用颤抖的手按下数字按钮。             

两个阈值门槛总比一个好             

对于我们的单阈值实现,常见的修复方法是将其拆分为单独的阈值,以便从release转换为pressed,再从pressed转换为release。例如,我们可以说,当按钮处于释放状态时,如果压力增加到0.6以上,它将转换为按下状态。当压力降到0.4以下时,当压力降到0.4以下时,它将转变为释放状态。现在中间有一个0.2的缓冲区,你的手指可以随意移动,而不会意外地松开或按下按钮。

这是一个更常见的实现,可以在野外看到。它需要更多的小心去注意,并在它出错时给予尊重。打完一个小时后,你的一个球就不会发射了,因为你把扳机扳到了0.5而不是0.6。这在试图快速连续射击时更为常见。我发誓我开了五枪而不是四枪!把责任推到球员身上很容易,但通常情况下,应该把责任推到比赛上。我们可以更好地解释玩家的输入。             

压力Deltas和移动阈值             

人们不善于知道他们输入了什么样的压力值。当有人试图射击时,他们不会考虑扣动扳机来达到0.6的压力值。他们只是想扣动扳机。更具体地说,他们正在考虑扣动扳机相对于目前的压力。游戏应该用类似的方式来思考。             

让我们改变我们的框架来定义压力的变化,它将从释放过渡到压力,以及从压力到释放的转换。让我们分别从0.3和-0.2开始(为您的游戏调整这些)。这些增量将用于动态定义导致状态转换的阈值。因为Deltas是相对值,让我们定义它们的相对值。             

当处于释放状态时,我们的转换阈值将比所遇到的最小压力高0.3。例如,让我们浏览一个场景,其中我们以0.2的压力进入释放状态。             

首先,我们将最小值初始化为当前压力0.2。进入按下状态的阈值现在是0.5,基于0.2最小值加上0.3增量。

在下一帧中,我们轮询压力为0.1,并相应地更新最小值。进入按下状态的阈值现在是0.4,基于0.1最小值加上0.3增量。

在下一帧中,我们轮询0.2的压力,该压力不影响最小值。根据0.1最小值加上0.3增量,进入按下状态的阈值保持在0.4。

在下一帧中,我们轮询0.4的压力,该压力不影响最小值。阈值再次保持在0.4,我们触发我们进入按下状态的转换。

当处于压力状态时,我们的转换阈值将比所遇到的最大压力低0.2。这和上面发布的示例一样,只是方向相反。             

边缘案例             

在我们宣布胜利之前,我们要讨论一些边缘情况。您会注意到,在这个例子中,我选择了单独的delta来按下和释放。这不是必需的,但我确实认为让释放更快/更容易感觉更好,因为玩家更清楚他们在对抗按钮的物理阻力的情况下,拉了多远。他们不太清楚自己释放了多大的压力。不管这是否是最佳的感觉,让我们看看使用不对称三角洲的含义。             

因为我们选择了一个比释放更长的拉力,有一个接近全压的区域,我们可以释放按钮,但没有足够的空间再次按下它。具体地说,如果按钮完全按下,则为1.0。现在释放-0.2的压差,进入释放状态。这将我们的值设为0.8,并且由于0.3 delta,重新进入按下状态的阈值为1.1。不幸的是,我们实际上不能输入1.1的值,所以我们需要一直释放到0.7,然后才有足够的空间再次开火。当压力增量小于释放增量时,在接近0.0的情况下,我们也会遇到类似的问题。

我们能做得更好吗?我认为是这样。让我们把阈值限制在[0,1]范围内。这意味着对于压力增量大于释放增量的情况,我们总是可以从释放状态发射,但当接近1.0时,我们有时不需要按得太远。也就是说,物理播放器的输入达到了一个极限,因为机械按钮不能再拉进去,所以对玩家来说就不会觉得奇怪了。

请注意,如果释放阈值与按下阈值(例如0.01和0.3)相比调得非常小,则最好采用另一种方法,该方法要求最小拉力增量接近1.0。             

正如我之前所说,如果你能通过控制器的语言准确地翻译出玩家的意图,你就可以做出一个严格控制的游戏。这是这条道路上的又一步。

posted @ 2020-07-13 19:41  吴建明wujianming  阅读(482)  评论(0编辑  收藏  举报