i_wanna_be_the_guy吧 关注:62,553贴子:1,119,252

关于I wanna 的跳跃机制

只看楼主收藏回复

最近两个月开始学习做I wanna,无聊的时候喜欢查代码,终于在今晚解决了一个困扰了我很久的问题——kid跳跃的高度问题。
通常情况下,I wanna引擎中kid的数据为
jump=8.5(一段跳跃)
jump2=7(二段跳跃)
gravity=0.4(重力加速度)
由以上数据再结合物理知识v^2=2gh算得的二次跳跃可以达到的最大高度是151.5625,而在实际游戏中kid连4.5格都很难跳上去(4.5*32=144)。这种算法显然是不对的。
于是考虑到游戏是按帧进行计算的,才恍然大悟。
一段跳初始(第一帧)速度是8.5-0.4=8.1(这是由于对于kid而言gravity是一个常量,一直存在,所以每一帧向上的速度都要减去0.4,向下的速度则要加上0.4),以后每一帧速度都会减少gravity的值0.4,因此可以构成一个等差数列,当速度减少到0.1之后下一帧就会变成反向的速度,因此末速度是0.1。根据等差数列前n项和(此处为21项)计算公式(8.1+0.1)*21/2=86.1,同理二段跳跃初速度是7-0.4=6.6,末速度是0.2,帧数为17,二段跳跃最大高度是(6.6+0.2)*17/2=57.8
以上相加86.1+57.8=143.9恰好不足144。至于不使用BH大法能不能征服4.5格高度我也不是很清楚(虽然个人没有成功过),因此无法断言这里的143.9能不能四舍五入。


IP属地:河北1楼2018-08-19 22:19回复
    不使用BH上4.5需要特殊的ya。


    IP属地:天津3楼2018-08-19 22:29
    收起回复
      广告
      立即查看
      至于最小跳跃高度,引擎中有一个playerVjump的脚本,限定了当检测到玩家松开跳跃键时,竖直速度(向上)变为原来的0.45倍。即理论上的最小一段跳初速为8.,1*0.45=3.645,由此数值计算,末速度为0.045,帧数为10
      计算得最小一段跳跃高度为3.69*10/2=18.45,此高度刚好可以跳过小刺(16格)。而二段的初速最小为6.6*0.45=2.97,末速度为0.17,同理算得最小二段跳跃高度(2.97+0.17)*8/2=12.56。
      但是以上的一大必要条件就是手速足够快以至于可以在跳跃的第一帧还没有执行完毕就松开了跳跃键,使得第一帧的速度就已经*0.45,实际是否可行尚无法断言,因为实际游戏也只是目测过,并没有可以拿来作证据的实例,但第二帧的速度*0.45是必然可行的。
      由以上还可以推出的一些数据:一段跳跃到最大高度所需按键时间约为0.4s,二段约为0.35s,二者相差不大,但是由于二段跳跃最大高度明显低于一段跳跃,使得二段跳跃的高度控制相对于一段更加精密。理论上一段有21种高度,二段有17种之多,至于实际……


      IP属地:河北4楼2018-08-19 22:41
      回复
        暂时想到这些,今天就唠到这吧,还是希望大家能够一直喜欢这个游戏家族,可以的话再拉更多的人入坑


        IP属地:河北5楼2018-08-19 22:44
        回复
          这到底哪个神的的小号


          IP属地:江苏6楼2018-08-19 22:47
          收起回复
            推论大体上是正确的 另外我觉得新人看到这个只会被吓跑(


            IP属地:江苏7楼2018-08-19 22:51
            收起回复
              会读代码的大佬呀


              IP属地:贵州来自iPhone客户端9楼2018-08-20 00:35
              回复
                em


                IP属地:江苏来自Android客户端10楼2018-08-20 00:48
                回复
                  广告
                  立即查看
                  大佬喝茶新人瑟瑟发抖…


                  来自Android客户端11楼2018-08-20 08:56
                  回复
                    原来只差0.1。。。


                    IP属地:山东来自Android客户端12楼2018-08-20 09:52
                    回复
                      补充:这里的速度并不是严格意义上的速度,只是player在一帧之内移动的距离,因此计算高度实际就是每一帧的距离逐个累加。
                      另外,关于贴墙滑倒刺的问题(如下图),经测试,自由落体情况下,两格墙(最左)和四格墙(最右)的情形是可以直接贴墙不死的。
                      这是因为
                      1.两格墙时,kid自身高度为21,墙的高度为64,则kid理论上至少要下落85像素的距离才能撞向刺(小于85则会被墙挡住),而实际上自由落体的临界值是(0.4+8)*20/2=84像素,计算方法同一楼,下一帧的话则要在此基础上加8.4,84+8.4=92.4>85,因此在这一帧kid可以向刺的方向移动3像素,而刺的形状是在右侧,每下降2像素,边界左移1像素(如图),而92.4是自刺最上端起向下数8像素的位置,如红线,可见红线的长度正好为3像素,即kid在这一帧之内向左滑动恰好不会撞到刺,顺带提一下GM的碰撞机制是两者存在重合的部分时才会有碰撞判定。
                      而在之后的几帧中,kid的水平速度恒定为3,竖直速度在此刻已经大于8.4,因此下落斜率是要大于刺边缘的斜率的,所以一定不会撞到刺。


                      IP属地:河北13楼2018-08-20 11:12
                      回复
                        2.四格墙是同样的道理,不过由于kid下落最大的速度是9+0.4=9.4,所以当速度增加到9.2时,下一帧起每一帧移动的像素数都是9.4了。以9.2为末速度计算得到下落距离为(0.4+9.2)*23/2=110.4,那么下落4格墙的高度是32*4+21=149,于是临界值是110.4+4*9.4=148,下一帧则会落到刺的最上端(包括最上端)以下8像素处,和2格墙的情形相同,因此得证。


                        IP属地:河北14楼2018-08-20 11:18
                        回复
                          所以。。。你想表达什么。。。证明了一些已知的结论吗。。。。建议你加一下iw制作群可能你比较能大展拳脚


                          IP属地:江苏来自Android客户端15楼2018-08-20 12:10
                          收起回复
                            你是神仙吧


                            IP属地:河北来自Android客户端16楼2018-08-20 12:56
                            收起回复
                              广告
                              立即查看
                              理科大佬您是真的闲着吧emmmm


                              IP属地:吉林来自Android客户端17楼2018-08-20 22:26
                              收起回复