redstone_machine...吧 关注:3,604贴子:60,841

【从源码分析】为什么说方块和实体的交互永远无法绝对精准

只看楼主收藏回复


一楼喂熊,tnt镇楼


IP属地:中国香港1楼2020-03-31 14:20回复
    首先是一串数字。

    这是每一个炮党都为之颤抖的数字


    IP属地:中国香港2楼2020-03-31 14:22
    回复
      这数字(0.9800000190734863)是tnt的边长。
      你一定很迷惑,为什么它是这样滚键盘的数字
      事实上,这和麻将的一些很zz的操作有关。


      IP属地:中国香港3楼2020-03-31 14:24
      回复
        如果我们打开MC的源码,可以发现tnt的边长在代码中的确是“0.98”。我们也没理由相信麻将为了给玩家挖坑,特地滚键盘

        所以这是什么问题呢?难道Java出bug了?
        不要慌,先默念三遍,Java没bug,Java没bug,Java没bug。
        然后,再看一段代码。


        IP属地:中国香港4楼2020-03-31 14:28
        回复

          这是方块和实体交互的一段代码,乍一看也没问题
          等等,这是什么

          我们终于找到了问题所在——MC在计算方块和实体的交互的时候,会把float转换成double。
          float和double是两种浮点数,单精度和双精度。而它们之间的转换,则会导致那串滚键盘的数字产生。


          IP属地:中国香港5楼2020-03-31 14:33
          回复

            计算一下,也印证了我的猜想。


            IP属地:中国香港6楼2020-03-31 14:34
            回复

              又比如说,爆炸的代码。
              可以看到所有地方都是拿double来计算的。这也表明tnt的边长在游戏中可以等效为0.9800000190734863,不需要考虑一开始那个浮点数。


              IP属地:中国香港7楼2020-03-31 14:37
              回复
                再来看看别的

                这是tnt创建爆炸的代码,可以看到(this.height/16)是导致高度衰减的元凶。而压爆效应的真正高度,变为了:

                而不是简单的0.06125


                IP属地:中国香港8楼2020-03-31 14:41
                回复
                  当然,在对精度的要求不高的情况下,这个东西的影响不大;然而有些东西要求高精度
                  比如:珍珠炮
                  即使完全校准,珍珠的飞行轨迹还是会有微小的偏移,这就是这个原因导致的。
                  不仅仅是tnt,包括矿车、珍珠、生物、玩家在内的实体,都有这个问题……


                  IP属地:中国香港9楼2020-03-31 14:45
                  回复
                    那么最后一点,如何解决这个问题?


                    IP属地:中国香港10楼2020-03-31 14:46
                    回复
                      这里以tnt炮为例:
                      第一种方法,自暴自弃【划掉】
                      有些时候不需要极高的精度,那么这样的0.0……01的误差也在接受范围之内。
                      第二种方法,把所有的tnt都归正到同一个角落。这样即使哪一个tnt都不在方块中心,tnt之间的相对距离还是能精确到1方块边长的。
                      第三种方法,把两叠含相同数量tnt的tnt堆分别放到方块的两个角落,用对称来打败游戏机制

                      这时候tnt对于上方的实体的爆炸效果就几乎相当于方块中心的爆炸


                      IP属地:中国香港11楼2020-03-31 14:55
                      回复
                        当然,tnt是这样,有些实体有着另外一种方法来归正那就是游戏机制
                        比如,teleport【划掉】
                        比如这玩意


                        当你把矿车打掉的时候,猪会出现在旁边方块精确的中心位置上方。没有小数点。


                        IP属地:中国香港12楼2020-03-31 15:00
                        回复
                          利用这个,可以做出精准的猪炮
                          朝天上开炮之后,猪飞过几万格高后,可以精确无误地掉到原来的炮管的那格水里面。
                          图片我就不放了,总之这是一个可行的方法。
                          =================================此贴完结===================================


                          IP属地:中国香港13楼2020-03-31 15:02
                          收起回复
                            我来@一波大佬们
                            @duoduo_123dong @正正正正正好 @滚大幕


                            IP属地:中国香港14楼2020-03-31 15:04
                            收起回复
                              看不懂,打扰了


                              IP属地:广东15楼2020-03-31 15:04
                              收起回复