851892190
为什么连跳比普通跑提速更快,不一样的连跳方式加速又为什么不一样,请问他们是取决于什么的。有没有大佬可以从代码方面什么的讲一下

[A.C]SWAT
你可以尝试从物理学角度看一下这个问题

狂奔者、
游戏设定就是这样的,不是什么代码方面

851892190
mc不科学啊2333

Lucky_fish0w0
注:代码源自mcp,代码版本1.12

终于被我找到了,于net.minecraft.entity.EntityLivingBase的jump()方法中,有一段是这样的

  1. if (this.isSprinting())
  2. {
  3.     float f = this.rotationYaw * 0.017453292F;
  4.     this.motionX -= (double)(MathHelper.sin(f) * 0.2F);
  5.     this.motionZ += (double)(MathHelper.cos(f) * 0.2F);
  6. }
复制代码

意思是说,mc中的生物在疾跑状态中,跳跃时会获得0.2格/tick的速度加成。对,所有生物都会有这个加成,但是取决于她们会不会疾跑了。不同的连跳方式?你说的是疾跑与不疾跑吧,不疾跑不会有这个速度加成的。

如果是斜着走的速度会稍微变快,可能也只是计算误差的问题了,许多关于坐标系换算的代码都使用到了net.minecraft.util.math.MathHelper的sin、cos和atan2函数,比如说上方的跳跃代码。
她们的实现方式如下:
  1. public static float sin(float value)
  2. {
  3.     return SIN_TABLE[(int)(value * 10430.378F) & 65535];
  4. }
  5. public static float cos(float value)
  6. {
  7.     return SIN_TABLE[(int)(value * 10430.378F + 16384.0F) & 65535];
  8. }
复制代码

atan2的代码超长,但忘了折叠夹怎么做,这里就先不展示了。
从代码上看,sin和cos的计算结果都是缓存到一个名为 SIN_TABLE 变量里头,也就是说,她们的计算结果是近似值,而不是准确值,从而也能大幅度地提升代码的运行速度(然而在我的电脑上还是那么的卡)至于为什么到了甚至0.2block/s的误差的话,可能是因为这些计算出来的一点点的误差所累积造成的结果。

851892190
cx62d 发表于 2018-7-22 17:07
注:代码源自mcp,代码版本1.12

终于被我找到了,于net.minecraft.entity.EntityLivingBase的jump()方法中 ...

emm跳跃状态获得加成的话,请问跳跃状态是哪一部分,从起跳到落地,还是上升的过程?
按住疾跑连跳,速度上貌似会再落地再次起跳瞬间有一个爆发请问是如何解释?
很抱歉问题没说清楚,连跳方式不同是指,在疾跑状态下连跳,跳两远一格高连跳和跳3远1格高连跳速度加成不一样。我是看一个测速mod的,,,
劳烦了

Lucky_fish0w0
本帖最后由 cx62d 于 2018-7-25 22:44 编辑
851892190 发表于 2018-7-23 11:13
emm跳跃状态获得加成的话,请问跳跃状态是哪一部分,从起跳到落地,还是上升的过程?
按住疾跑连跳,速度 ...

实际上跳跃加成是在跳起的一瞬间获得加成,后面是每gametick乘以0.98以进行减速
事实上仅仅乘以0.98是不够的,另外还有一段关于脚下代码的计算
展开后为代码部分,刷屏警告


由代码得知玩家的移动速度也和脚下的方块的滑度有关(是否涉及生物暂未验证),比如说明显的,冰块,灵魂沙在代码里头是直接把速度乘以0.4,其他绝大多数方块则是约为0.16277136除以滑度的立方(举个离子,冰块滑度是0.98),再经过某种算法(代码太难看。。懒得解读了)再参与到玩家运动的计算中,摔落时平面上的速度就直接乘以0.91以做到减速。故跳远个人来看可能是滞空速度的差异,造成感觉上的不同,比如说2格1高可能到达下一个方块的速度会相对快一些,而由于3远1高滞空较长,故可能会造成慢速的感觉

lovexyn0827
Lucky_fish0w0 发表于 2018-7-22 17:07
注:代码源自mcp,代码版本1.12

终于被我找到了,于net.minecraft.entity.EntityLivingBase的jump()方法中 ...

直接放源代码不太好吧,指定行号会更保险