[mcbe]關(guān)于漏斗的一些特性分析(搬運(yùn))
寫(xiě)在前頭
本篇專欄是來(lái)自 @Maple_楓溪 的 《關(guān)于漏斗的一些特性分析》,授權(quán)搬運(yùn)是為了收錄于文集《基石》中,方便整理be儲(chǔ)電相關(guān)理論。也歡迎各位網(wǎng)友向我推薦其他up的優(yōu)質(zhì)文章

由于漏斗的一些特性(bug)實(shí)在讓人費(fèi)解,所以我們拜托了?@hhhxiao_?從源碼級(jí)別來(lái)分析了一下漏斗的行為,以此推斷出了一些漏斗的特性(bug)成因。

一、漏斗的范圍
在代碼中,首先定義了漏斗的吸取范圍為1*1*1,這個(gè)范圍在漏斗上方是1*0.625*1,漏斗中1*0.375*1(漏斗上表面碰撞箱有凹陷),在這之后,吸收范圍往六個(gè)方向各收縮0.0001格,變?yōu)榭傮w0.9998*0.9998*0.9998。(如圖)

如圖,假設(shè)漏斗(灰色)吸取范圍為1,漏斗應(yīng)該會(huì)吸取到處于隔壁方塊邊界的物品(如圖橙色方塊),而漏斗實(shí)際范圍是0.9998,所以物品與漏斗吸取范圍沒(méi)有接觸,不會(huì)吸取到這個(gè)物品。成功的防止了“誤吸入”。

二、精度下溢導(dǎo)致的高xz區(qū)域漏斗范圍增大
在x.z坐標(biāo)超過(guò)[-2049,+2048](以下簡(jiǎn)稱2048)的時(shí)候。因?yàn)榫认乱绲膯?wèn)題,漏斗上方的吸取范圍重新回到1*0.9998*1(y軸并不可能超過(guò)2048)。這導(dǎo)致的問(wèn)題就是漏斗可以不正確的吸取到處于旁邊方塊邊界的物品。
(僅有x坐標(biāo)超過(guò)[-2049,+2048],而z坐標(biāo)不超過(guò)[-2049,+2048]時(shí),漏斗僅x軸范圍擴(kuò)大,變?yōu)椋?*0.9998*0.9998),可得x,z坐標(biāo)的計(jì)算是獨(dú)立的,當(dāng)x,z坐標(biāo)都超過(guò)[-2049,+2048]時(shí),漏斗范圍才會(huì)變?yōu)?*0.9998*1)

三、區(qū)塊邊界限位失效問(wèn)題的解釋
在代碼研究中可以發(fā)現(xiàn),漏斗的吸取范圍僅限于本區(qū)塊(漏斗遍歷整個(gè)區(qū)塊的實(shí)體)。也就是說(shuō),如果在區(qū)塊邊界(如圖,漏斗和冰中間是區(qū)塊邊界)。

由于掉落物的坐標(biāo)判定以中心點(diǎn)為準(zhǔn),則掉落物在冰側(cè)的區(qū)塊,而漏斗在另一區(qū)塊。漏斗無(wú)法讀取到另一個(gè)區(qū)塊的掉落物(因?yàn)槁┒分蛔x取本區(qū)塊的掉落物),即物品限位后漏斗無(wú)法吸取到物品——這就是常說(shuō)的區(qū)塊邊界漏斗bug。
四、區(qū)域邊界的歸屬判定
區(qū)塊、方塊邊界(以下簡(jiǎn)稱區(qū)域邊界),屬于正方向的區(qū)域
聽(tīng)不懂不要緊,我們來(lái)畫(huà)個(gè)圖。

區(qū)域與區(qū)域之間有交界處,但是在游戲里面這個(gè)交界處卻會(huì)帶來(lái)麻煩——如果一個(gè)實(shí)體正好處于交界處,那么到底如何去判定實(shí)體在哪個(gè)區(qū)域。
Mojang選擇把邊界歸于正方向的區(qū)域——也就是橙色區(qū)域。
那就是假如有個(gè)掉落物實(shí)體中心正好在兩個(gè)區(qū)域中間,這個(gè)掉落物實(shí)體會(huì)被判定為屬于正方向的區(qū)域(橙色),例如說(shuō)摩擦因素取值會(huì)取正方向的方塊的摩擦。
了解了這點(diǎn)以后,我們?cè)賮?lái)看漏斗范圍擴(kuò)大和這個(gè)判定會(huì)產(chǎn)生什么奇妙的化學(xué)反應(yīng)。
五、bug修復(fù)了bug
Mojang對(duì)于漏斗所處位置的判定是將漏斗吸取范圍邊界的坐標(biāo)截?cái)酁檎麛?shù),然后加載坐標(biāo)所處區(qū)塊內(nèi)所有掉落物。值得注意的是漏斗范圍在2048外會(huì)被不正確的擴(kuò)大到1,然后處于區(qū)塊邊界負(fù)方向側(cè)漏斗的正方向邊界已經(jīng)與區(qū)塊邊界重合,而這個(gè)區(qū)塊邊界屬于正方向的區(qū)塊,即這個(gè)漏斗范圍同時(shí)處于左右兩個(gè)區(qū)塊,這個(gè)跨區(qū)塊的漏斗會(huì)吸取兩個(gè)區(qū)塊(在區(qū)塊角落可能是三個(gè))的掉落物——即用bug去解決了區(qū)塊邊界的bug(特性)。
擴(kuò)大的漏斗范圍邊界與正方向區(qū)塊邊界重合
但是反方向(漏斗在正方向側(cè))則不能加載到另一側(cè)區(qū)塊(因?yàn)閰^(qū)塊邊界所屬問(wèn)題,可以自己嘗試分析)
即在2048坐標(biāo)外,區(qū)塊邊界的可用情況為


? ? 本次專欄主要是由 @hhhxiao_ 的代碼研究推論而來(lái),感謝學(xué)姐對(duì)游戲代碼的挖掘讓我們能更加深刻的理解游戲機(jī)制。
? ? 本次專欄內(nèi)容由車軸草 @retrifolium?和影 @T0ShadowX 發(fā)現(xiàn)的bug延申討論而成(最后延申的是不是有點(diǎn)太長(zhǎng)了)
? ? 感謝 @江雁蒼穹 @钚鈷鳥(niǎo) @OEOTYAN 的大量猜想,討論,測(cè)試。
? ? 如果您對(duì)本文有異議或者發(fā)現(xiàn)勘誤,請(qǐng)私信我,我會(huì)盡快改正。

有異議或勘誤去找?@Maple_楓溪