最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

【Terraria機(jī)制】飛鏢機(jī)關(guān)與青綠壓力墊板的結(jié)算

2019-01-04 22:09 作者:putianyi888  | 我要投稿

內(nèi)容來(lái)源是Terraria電路群231355279的討論和Terraria官方論壇上我和@DRKV 的討論,原帖鏈接https://forums.terraria.org/index.php?threads/question-weird-mechanics-of-dart-traps-and-teal-pressure-plates.75145/

這里對(duì)原帖中的關(guān)鍵內(nèi)容進(jìn)行翻譯。一些價(jià)值不大的內(nèi)容會(huì)省略。

標(biāo)題:【問(wèn)題】飛鏢機(jī)關(guān)與青綠壓力墊板奇怪的機(jī)制

#1 我:

我和電路群里的人討論了一下飛鏢機(jī)關(guān)和青綠壓力墊板的機(jī)制。我們有些分歧,我做了一些實(shí)驗(yàn)來(lái)證明或證偽我的觀點(diǎn)。但是我們沒(méi)有任何一個(gè)人可以解釋這些實(shí)驗(yàn)結(jié)果。我現(xiàn)在在研究另一個(gè)東西,暫時(shí)沒(méi)時(shí)間研究這個(gè)問(wèn)題,所以我把我的實(shí)驗(yàn)發(fā)出來(lái),看看有沒(méi)有人能解釋。

問(wèn)題出自下面這個(gè)驅(qū)動(dòng):

原來(lái)的問(wèn)題是:這些飛鏢發(fā)射是否有間隔?

答案是沒(méi)有。下面的截圖說(shuō)明所有的飛鏢都是同一物理幀發(fā)射的。

也許飛鏢直接生成在機(jī)關(guān)的前方,并且立刻觸發(fā)了壓力板?可能是對(duì)的,但是也有不對(duì)的時(shí)候。

我改變了飛鏢的發(fā)射方向:

現(xiàn)在飛鏢發(fā)射有明顯的延遲了。

從上面的截圖可以看出來(lái)向上發(fā)射的飛鏢直接生成在機(jī)關(guān)之上,也許導(dǎo)致了這個(gè)延遲。

然后我縮短了機(jī)關(guān)和壓力板的距離:

結(jié)果是:第一個(gè)向上射的飛鏢可以觸發(fā)壓力板,但是第二個(gè)向下射的飛鏢不可以。向上和向下的飛鏢機(jī)關(guān)工作原理不同!

那么我只用向下的機(jī)關(guān)試試:

現(xiàn)在飛鏢發(fā)射有延遲。但是這意味著向下的飛鏢機(jī)關(guān)和水平的飛鏢機(jī)關(guān)不一樣嗎?不是的。改變壓力板的方向:

現(xiàn)在所有的飛鏢都在同一物理幀發(fā)射了:

所以壓力板的方向會(huì)影響到觸發(fā)!

讓我們單獨(dú)看看向上發(fā)射的飛鏢機(jī)關(guān)。下面的驅(qū)動(dòng)無(wú)法生效:

但是下面的不僅生效,而且有延遲!

如果直接生成在壓力板上的飛鏢可以觸發(fā)壓力板,為什么第一個(gè)驅(qū)動(dòng)會(huì)失效?

(注:本樓剩余內(nèi)容是無(wú)效實(shí)驗(yàn),故不翻譯)

#2 DRKV:

我感覺(jué)我已經(jīng)搞清楚了大多數(shù)的實(shí)驗(yàn)結(jié)果。我臨時(shí)寫了一個(gè)補(bǔ)丁,它可以暫停射彈的更新,從而我可以手動(dòng)控制射彈的更新。(這應(yīng)該不會(huì)影響實(shí)驗(yàn)結(jié)果的。)而且我還使用了一個(gè)Mod編輯工具去高亮射彈的碰撞箱。

首先,飛鏢生成時(shí)相對(duì)機(jī)關(guān)有一個(gè)偏移量。這個(gè)偏移量根據(jù)機(jī)關(guān)的朝向各有不同。

這是在飛鏢機(jī)關(guān)被激活后立刻發(fā)生的事,在任何的射彈刷新之前。你可以看到,向上發(fā)射的飛鏢與眾不同。我猜測(cè)這可能是由于舍入誤差引起的。

另一個(gè)重要的事情是,飛鏢剛生成時(shí)不會(huì)觸發(fā)壓力板。碰撞只會(huì)在刷新后觸發(fā)。這就是壓力板和機(jī)關(guān)之間必須空一格的原因。

在上面這種情況下,飛鏢剛剛好碰到壓力板。

這個(gè)例子很有趣。一開(kāi)始時(shí)是這樣的:

一次刷新之后變成了這樣:

游戲是依次刷新各個(gè)射彈的。游戲按照Main.projectile數(shù)組的下標(biāo)順序遍歷刷新射彈。所以我認(rèn)為是這么回事:

  • 第一個(gè)飛鏢刷新

  • 觸發(fā)壓力板

  • 電路運(yùn)行,觸發(fā)第二個(gè)機(jī)關(guān),生成第二個(gè)飛鏢

  • (第二個(gè)飛鏢的下標(biāo)比第一個(gè)飛鏢下標(biāo)大)

  • 第二個(gè)飛鏢刷新

  • 觸發(fā)下一個(gè)壓力板

  • ……

我改變了飛鏢的發(fā)射方向:

現(xiàn)在飛鏢發(fā)射有明顯的延遲了。

從上面的截圖可以看出來(lái)向上發(fā)射的飛鏢直接生成在機(jī)關(guān)之上,也許導(dǎo)致了這個(gè)延遲。


不是這樣的。無(wú)論向上還是向下,飛鏢觸發(fā)壓力板的時(shí)間相同。

它們初始的偏移量略有不同,但是在這個(gè)情況下不影響結(jié)果。

然后我縮短了機(jī)關(guān)和壓力板的距離:

結(jié)果是:第一個(gè)向上射的飛鏢可以觸發(fā)壓力板,但是第二個(gè)向下射的飛鏢不可以。向上和向下的飛鏢機(jī)關(guān)工作原理不同!

這種情況下偏移量的不同就很重要了。我的垃圾刷新調(diào)試器沒(méi)法暫停碰撞過(guò)程,所以我沒(méi)截到好的圖。

注意觀察第一次更新后飛鏢的移動(dòng)距離,我認(rèn)為當(dāng)飛鏢向下發(fā)射時(shí),飛鏢會(huì)直接錯(cuò)過(guò)壓力板,直接移動(dòng)到了方塊內(nèi),而當(dāng)向上發(fā)射時(shí),飛鏢恰好與壓力板的上一半碰撞。

那么我只用向下的機(jī)關(guān)試試:

現(xiàn)在飛鏢發(fā)射有延遲。

沒(méi)錯(cuò)。飛鏢經(jīng)過(guò)兩次刷新才到達(dá)壓力板。

但是這意味著向下的飛鏢機(jī)關(guān)和水平的飛鏢機(jī)關(guān)不一樣嗎?不是的。改變壓力板的方向:

現(xiàn)在所有的飛鏢都在同一物理幀發(fā)射了:

這和一開(kāi)始的問(wèn)題是一樣的。一次刷新后的飛鏢狀態(tài):

讓我們單獨(dú)看看向上發(fā)射的飛鏢機(jī)關(guān)。下面的驅(qū)動(dòng)無(wú)法生效:

我也不確定到底咋回事。

飛鏢在兩幀中都遇到了壓力板,但是仍然沒(méi)有觸發(fā)。這可能是因?yàn)閴毫Π宓呐鲎蚕浔荣N圖小。

但是下面的不僅生效,而且有延遲!

如果直接生成在壓力板上的飛鏢可以觸發(fā)壓力板,為什么第一個(gè)驅(qū)動(dòng)會(huì)失效?

這個(gè)確實(shí)挺奇怪的。(下面的每張圖之間僅間隔一次刷新)

你可能以為所有飛鏢會(huì)同時(shí)發(fā)射,但是似乎一次只發(fā)射兩個(gè)。這是全過(guò)程:

  • 第一個(gè)飛鏢刷新

  • 觸發(fā)壓力板,觸發(fā)下一個(gè)機(jī)關(guān),下一個(gè)飛鏢生成

  • (第二個(gè)飛鏢的下標(biāo)比第一個(gè)飛鏢大)

  • 第一個(gè)飛鏢被摧毀

  • 第二個(gè)飛鏢刷新

  • 觸發(fā)壓力板,觸發(fā)下一個(gè)機(jī)關(guān),第三個(gè)飛鏢生成

  • (現(xiàn)在射彈數(shù)組中第一個(gè)飛鏢的位置空出來(lái)了,第三個(gè)飛鏢被插入到這里)

  • 第二個(gè)飛鏢摧毀

  • 后面沒(méi)有需要刷新的射彈了,游戲去執(zhí)行別的過(guò)程

  • 新的射彈刷新過(guò)程開(kāi)始

  • 第三個(gè)飛鏢刷新

  • ……

所以這是因?yàn)轱w鏢觸發(fā)壓力板和被摧毀都發(fā)生在同一次刷新中。

#3 是我提的一些問(wèn)題,因?yàn)楫?dāng)時(shí)還沒(méi)有完全理解DRKV的回復(fù),這里省略

#4 DRKV:

我進(jìn)一步研究了一下源碼,根據(jù)Collision.SwitchTiles,青綠壓力墊板只會(huì)在刷新后,當(dāng)射彈的新位置與壓力板碰撞箱相交,而舊的位置不相交時(shí)激活。

另外,似乎壓力板的碰撞箱是10像素*16像素,所以事實(shí)上碰撞箱比貼圖大,貼圖只有8像素*16像素。

事實(shí)上我只是向MechScope里加了一個(gè)補(bǔ)丁,大致是這樣的:

Harmony庫(kù)會(huì)把這段代碼插入到目標(biāo)函數(shù)之前。(在這個(gè)情況下,目標(biāo)函數(shù)是Projectile.Update)如果返回false,剩下的函數(shù)過(guò)程都會(huì)被跳過(guò)。SuspendableWireManager.doProjectile是一個(gè)靜態(tài)變量,每次TModLoader的PostUpdate執(zhí)行時(shí)我都把它置為false。按下熱鍵時(shí)我把它置為true。

所以游戲會(huì)照常運(yùn)行,但是會(huì)跳過(guò)射彈刷新,除非我按下熱鍵。

一個(gè)非常有趣的實(shí)驗(yàn)是先生成一堆射彈,然后在第一個(gè)飛鏢生成后立刻摧毀它們,這樣的話在射彈數(shù)組的前面就會(huì)有一段空位,新的飛鏢會(huì)插入在這個(gè)空位中,不會(huì)立刻刷新。

編輯:我把實(shí)驗(yàn)做了一下


#4 我:

我懂了。游戲在每個(gè)物理幀中以遍歷射彈數(shù)組的方式刷新射彈。射彈刷新后可立刻觸發(fā)壓力板并插入電路過(guò)程,生成新的射彈。新的射彈會(huì)被插入到射彈數(shù)組中的第一個(gè)空位。如果這個(gè)空位在第一個(gè)射彈之前,那么直到下一物理幀才會(huì)刷新;如果空位在第一個(gè)射彈之后,那么在本次遍歷中就會(huì)被刷新。

在那個(gè)奇怪的例子里,第一個(gè)飛鏢在第三個(gè)飛鏢生成前被摧毀,所以第三個(gè)飛鏢被插入到了第一個(gè)飛鏢的位置,到下一物理幀才會(huì)刷新。

#5 DRKV:

沒(méi)錯(cuò),就是這樣。

【Terraria機(jī)制】飛鏢機(jī)關(guān)與青綠壓力墊板的結(jié)算的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
墨玉县| 拜城县| 泾川县| 泸溪县| 文山县| 宁都县| 正安县| 唐山市| 虎林市| 宿松县| 巴青县| 即墨市| 襄垣县| 鄄城县| 蓬溪县| 商都县| 双桥区| 屏东县| 灵山县| 江都市| 阿巴嘎旗| 湖南省| 平谷区| 景德镇市| 房产| 和平区| 昌吉市| 岳阳县| 泸定县| 托里县| 志丹县| 沧源| 日喀则市| 平乡县| 甘德县| 高邮市| 诏安县| 望城县| 丰城市| 枝江市| 丰顺县|