2016.03.3123:08

AI 辅助器 记录对手滞空时间

Episode 7 记录对手滞空时间

今天的内容可能会略复杂,嗯,所以没看懂的也不太要紧,会用就行了

于是,不谈其他的闲话了,直接进入正题,需要用到的有yaccel计算器,TAG计算器,这两个前面都有讲过这里就不谈了

那么给出辅助器,(不知道的看前面,fvar(20)是记录yaccel的变量,var(58)为TAG变量)

;--------------------------------------------------------------------
; 相手の滞空時間、超絶やっつけ 对手滞空时间
;--------------------------------------------------------------------
[State -3, VarSet]
Type = VarSet
Trigger1 = 1
fvar(1) = 0
IgnoreHitPause = 1 ;还原

[State -3, VarSet]
Type = VarSet
Trigger1 = EnemyNear(var(58)),StateType = A && fvar(20) != 0
Trigger1 = ((floor(EnemyNear(var(58)),Vel Y))**2-2*(fvar(20))*(floor(EnemyNear(var(58)),Pos Y))) >= 0
fvar(1) = floor(((-EnemyNear(var(58)),Vel Y)+(((floor(EnemyNear(var(58)),Vel Y))**2-2*(fvar(20))*(floor(EnemyNear(var(58)),Pos Y)))**0.5))/(fvar(20)))+1
IgnoreHitPause = 1 ;记录

条件略复杂,我们假设一下元,计算的时候把floor忽略

令EnemyNear(var(58)),Vel Y = v, fvar(20) = a, EnemyNear(var(58)),Pos Y = h

trigger1等价代换一下,v**2(y方向v的平方) - 2ah >= 0,也就是v**2 >= 2ah

我们知道,h = 1/2*a*t**2 ,v = at 两式子合并,消去t,得到 v**2 = 2ah,而v**2 = 2ah只是临界条件,v**2 - 2ah >= 0就是说在临界条件之上,这是第一个公式的来源

我们要得到的数据是时间,令fvar(1) = t,那么把公式代换一下,同样的,忽略掉floor,((xxx**0.5)代表对xxx开平方)

((-v)+(v**2-2ah)**0.5)/a + 1 = t, (t-1)*a = -v+(v**2-2ah)**0.5, 令(t-1) = T

aT+v = (v**2-2ah)**0.5, v**2 + 2avT + (a**2)*(T**2) = v**2 - 2ah

舍去两边v**2,舍掉一个a, 2vT + 2ah + aT**2 = 0,这是最终结果

证明结论,令h = 0,也就是说对手在地面被击飞,刚刚pausetime结束的时候,此时pos y = 0

2vT = -aT**2, 2v = -a*T , v = -(1/2)*a*T = -(1/2)*a*(t+1),+1为起始值

那么来图证明一下结论吧,这招的打击速度为 -2,-10,yacce = 0.5
LR~(S)8FQ5P4FAD[)4_$IUX

可以看到下面的打击时间,因为是1起始,所以是40+1 = 41,所以刚才的公式成立
GPDVR802S`JG2VTYET2{2T3

对手在此过程中,如果不受外力,那么对手做匀加速曲线运动,a一定,y方向v随着T变化,x方向的v不变,那么对手做的是抛物线运动,可以看到下图,对手的滞空时间在减少A3EET3X9`{1_NC~HI9SW{P

好的,对手现在着地了,我们也能看到fvar(1)的值变为0了,说明对手不再浮空
_7(H$V~(9Q[68ICA}2NR927

此变量因为有floor的限制,所以会有一定的小误差,但不会超过4,那么,记录对手这个数据有什么用呢?这个变量,在对手Pausetime未消失的时候,虽然有ignorehitpause,但对手没有vel和yaccel,那么我们只能记录下对手pausetime以外的滞空时间

这个变量,给弹幕起手的角色比较好用,能计算对手滞空还有多少时间,来确认进行接下来的连招,如果是比较朴素的角色,还是建议不要用这个了,还省了你一个变量,但是给弹幕起手角色的再合适不过了,当然,如果有援护招式的话,也是很合适的,来判断对手还剩下多少滞空时间进行出招判断

好了,今天的课就先到这,如果您有什么问题的话可以私信我(只要是我会的,不管什么问题),我会第一时间给您答复,或者把问题发到我的邮箱

mizore@kotori.moe, 谢谢大家!

发表留言

秘密留言

Re: 如何得到40

> 可以看到下面的打击时间,因为是1起始,所以是40+1 = 41,所以刚才的公式成立
>
> 可以知道您怎么得到40吗?

您好,根据您的问题来看,这个问题其实是一个很简单的物理问题,Mugen忽略空气阻力,击飞时候是向上的速度,速度为-10(负号代表上),那么对手下落到地面前1帧的速度肯定是10,所以40的由来就是20/0.5 = 40,0.5为y方向的accel(加速度)

如果您有什么问题欢迎继续留言或者私信

Re: 如何得到40 (第二回回复)

> 原来如此,不好意思,刚才才看到这里您已经回复了,
> 回到正题,我只要再次肯定一些东西,这里有几个问题:-
>
> (i) 首先,从你的解说,20/0.5 = 40,我想知道20是跟着哪一个设定来判定(pausetime? slidetime? hittime? 还是从您答案中的-10和10合成abs 20?)
>
> (ii) 这一个一问我不记得从哪里看到,没记错是这里的教程(如果不对就不好意思了),slidetime 和 hittime是以倒扣的方式来减少的吗?,因为我有时候会混乱,哪一个是增加式的(比如time),哪一些是倒扣的方式计算.
>
> (iii) "此变量因为有floor的限制,所以会有一定的小误差,但不会超过4,那么"
>
> 这一句话,是怎么肯定不会超过4?或者说怎么得到4?
>
> (iv) "对手在此过程中,如果不受外力,那么对手做匀加速曲线运动,a一定,y方向v随着T变化,x方向的v不变,那么对手做的是抛物线运动,"
>
> a一定,原谅我理解能力不佳,是指一致的意思吗?
>
>
> 希望不会阻扰或者造成不便,非常感谢您的指导 :)


(1)20是ground.vel里面的y,看到-10了没有,abs(-10*2)就是20

(2)两项都是通过time递减的

(3)这个误差需要自己测试的

(4)是的

アクセス

オンライン