Overview
在Besiege裡,「歸元」一詞指的是一種物件的移動方式,當一物件在距離外繞著一軸或一點公轉時即可稱為「歸元」。一般的歸元只能以一個固定的距離來進行歸元,然而隨著Besiege科技的深入發展,能夠以變數距離來歸元的「高階歸元」愈顯重要。若對本文有任何疑問,可以到Besiege官方Discord來找我:Official Besiege Discord[discord.gg](Nice Name#2895)本指南所使用的用詞參考了CCC與Anvil共同翻譯的《圍城》台灣繁體中文語言套件。
「歸元概述」
一般來說,歸元(Orbit Transformation)是指一物件於距離外繞一軸、點公轉。但Besiege並沒有直接的預設邏輯來達成這些動作,這代表我們必須透過多個邏輯的組合來彌補這點。
步驟分為三個:「歸元、旋轉、還原」
使物件回歸至軸(點)。在這個步驟裡,我們必須先知道使一個物件回歸至軸時的方向及距離,並將兩者以實數的形式輸入「座標變換」。
如字義,旋轉物件。
由於歸元是瞬間性的邏輯,因此旋轉角設定的愈大,物件公轉的速度就愈快。
根據旋轉後的角度使物件還原至軸原本的距離外。
說的詳細點:旋轉後,它所面對的方向便被改變了,接著再反向操作「歸元」步驟,物件便會被移至原本的軌道上,整體的運動方向就會看似在公轉了。
「高階」的差別
高階歸元(Variable Distance Orbit Transformation),說的簡單點,就是普通歸元中公轉物件與軸心的距離從「定值」變成了「變數」。
高階歸元的步驟基本上是跟普通歸元一樣的,但Besiege的預設邏輯無法讓玩家將「座標變換」的值設成變數,所以一般來說一個物件要移動多遠都只能是一個定值。
因此,為了將物件以變數距離來移動,我們需要一套名為SetGet的系統以便玩家瞬間並持續的輸出一個變數。
步驟「旋轉」必須在「歸元」及「還原」兩者之間完成,但SetGet是瞬間性的系統,從第一到最後一條邏輯之間是毫無延遲的,這樣一來要手動控制旋轉方向便成了不可能。因此我們必須要在啟動高階歸元前就先輸入好方向,並用一套特殊邏輯來判定在步驟「歸元」結束的瞬間該把物件往哪個方向旋轉。
這個特殊的邏輯暫時叫做Control Unit(直到我想到該怎麼稱呼它), 簡稱CU。CU可以根據預先輸入的值在步驟「歸元」結束的瞬間讀取預先設定好的「旋轉」的方向,並在旋轉後立即接軌「還原」步驟。
操作須知
要操作高階歸元,你必須知道如何輸入變數、設定各項數值及如何啟動系統:
高階歸元是使用變數距離的歸元,而這個變數必須是使用邏輯事件來增加、減少的:
變數 “i =1 (或-1)“, VDOT
變數「i」的值代表公轉物件離軸數值上與物理上的距離,兩個距離會被同時更動(因為我把它們合併了)。
上述輸入會觸發以下邏輯:
(只以正數為示範)
當 變數(區域) “i =1″
變數 “limit +1”, VDOT
停用
變數 “DG1 +1”, VDOT <──數值上的距離
啟用
變數 “C1 +1”, VDOT
座標變換(區域) “y =1″ <──物理上的距離
你只需要一條邏輯事件來啟動高階歸元:
變數 “d =1 (或 -1)”, VDOT
這會觸發下列邏輯:
(只以正數為示範)
當 變數(區域) “d =1“
停用
變數 “CU =1”, “VDOT”
啟用
變數 “DG1 +0”, “VDOT”
變數「d」代表「direction(方向)」,範例的值是根據Y軸而定的:1是往右轉、-1是往左轉。方向的數量可以不只兩個,在這只是範例。
在這個高階歸元系統中總共需要手動設定兩個區間的數值:「距離輸出」及Control Unit(CU)。
-
距離輸出
可以設定「距離輸出」的地方分別在SetGet的兩個記憶區間DG及dg,各區間中每個閘的最上層就是讓使用者放置輸出邏輯的地方。
範例:
當 變數 “DG1 >0”
座標變換(區域) “y =-1″ <──這裏就是放置輸出邏輯的位置
停用
變數 “dg1 +1”
啟用
變數 “DG1 -1”這裡所輸出的值就是指在「歸元」及「還原」中所需的變數距離,通常是使用邏輯「座標變換」。且距離輸出並不一定要是「移動」,「旋轉」也是可以的,視所需而異。
-
Control Unit
Control Unit就像邏輯閘,用來瞬間判定該往哪個觸發事件(event trigger)走。
在每個CU的觸發事件(註*1)內,最上層就是用來放旋轉邏輯的地方。
這裡以「CU =1」為示範:當 變數(區域) “CU =1”
座標變換 “y =1°” <──預設的旋轉邏輯
變數 “CU =0”, “VDOT”旋轉邏輯能是單一的「移動」事件、也能是歸元,因人而異。
CU觸發事件的數目是根據有多少方向而定,且所有的方向都需要被輸入相應的數值。
/////
註*1:雖說是「每個CU的觸發事件」,但”CU =0″不算,不要在這裡放旋轉邏輯,”CU =0″是用來收束CU系統的。
/////
邏輯總覽
停用
變數 “CU =1”, VDOT
啟用
變數 “DG1 +0”, VDOT
當 變數(區域) “d =-1”
停用
變數 “CU =-1”, VDOT
啟用
變數 “DG1 +0”, VDOT
變數 “limit +1”, VDOT
停用
變數 “DG1 +1”, VDOT
啟用
變數 “C1 +1”, VDOT
座標變換 “y =1”, VDOT
當 變數(區域) “i =-1”
變數 “limit -1”, VDOT
停用
變數 “DG1 -1”, VDOT
啟用
變數 “C1 -1”, VDOT
座標變換 “y =-1”, VDOT
停用
變數 “DG2 +1”, VDOT
變數 “DG1 -37”, VDOT
啟用
變數 “C1 -37”, VDOT
當 變數(區域) “C1 <-37”
停用
變數 “DG2 -1”, VDOT
變數 “DG1 +37”, VDOT
啟用
變數 “C1 +37”, VDOT
變數 “i -1”, VDOT
當 變數(區域) “limit <-1406”
變數 “i +1”, VDOT
座標變換(區域) “y =1”
停用
變數 “dg1 +1”, VDOT
啟用
變數 “DG1 -1”, VDOT
當 變數(區域) “DG1 <0”
座標變換(區域) “y =-1”
停用
變數 “dg1 -1”, VDOT
啟用
變數 “DG1 +1”, VDOT
當 變數(區域) “DG1 =0”
變數 “DG2 +0”, VDOT
當 變數(區域) “DG2 >0”
座標變換(區域) “y =37”
停用
變數 “dg2 +1”, VDOT
啟用
變數 “DG2 -1”, VDOT
當 變數(區域) “DG2 <0”
座標變換(區域) “y =-37”
停用
變數 “dg2 -1”, VDOT
啟用
變數 “DG2 +1”, VDOT
當 變數(區域) “DG2 =0”
變數 “CU +0”, VDOT
座標變換(區域) “y =1°”
變數 “CU =0”, VDOT
當 變數(區域) “CU =-1”
座標變換(區域) “y =-1°”
變數 “CU =0”, VDOT
當 變數(區域) “CU =0”
變數 “dg1 +0”, VDOT
座標變換(區域) “y =-1”
停用
變數 “DG1 +1”, VDOT
啟用
變數 “dg1 -1”, VDOT
當 變數(區域) “dg1 <0”
座標變換(區域) “y =1”
停用
變數 “DG1 -1”, VDOT
啟用
變數 “dg1 +1”, VDOT
當 變數(區域) “dg1 =0”
變數 “dg2 +0”, VDOT
當 變數(區域) “dg2 >0”
座標變換(區域) “y =-37”
停用
變數 “DG2 +1”, VDOT
啟用
變數 “dg2 -1”, VDOT
當 變數(區域) “dg2 <0”
座標變換(區域) “y =37”
停用
變數 “DG2 -1”, VDOT
啟用
變數 “dg2 +1”, VDOT
當 變數(區域) “dg2 =0”
(結束)