模拟到數字輸入轉換
analog to digital input translation
模數轉換
通常使用模拟輸入法(控制棒、觸發按鈕)來控制數字系統。也許你想用模拟棒控制菜單。也許你想檢測一下模拟棒的敲擊或輕按兩下。或者,正如本文的重點,您可能想用模拟觸發器發射子彈。要做到這一點,需要比你預期的更為微妙。
雖然inversus并沒有将射擊綁定到模拟觸發器上,但它的開始确實是這樣的。你可以在我關于parry系統的文章中了解到為什麼我改變了計劃(盡管它可能值得它自己的文章),但重要的是要弄清楚它并不是因為觸發器的感覺而改變的;觸發器感覺很棒。
假設我們已經成功地預處理了控制器資料,并且有一個從0.0到1.0的幹淨的浮點值,代表觸發壓力。0表示釋放的觸發器,1表示完全按下的觸發器。
我的具體目标是在玩家扣動扳機的情況下實作一次射擊,但我将把這個目标抽象一點。我真正想要的是把模拟按鈕輸入轉換成數字按鈕輸入。數字按鈕處于按下狀态或釋放狀态。如果我們可以評估一個模拟按鈕的按下/釋放狀态,那麼它應該很容易綁定到任何需要數字輸入的遊戲動作上。對于射擊,我們可以在狀态從釋放狀态轉換為按下狀态時發射子彈。
那麼我們如何将模拟按鈕轉換成數字按鈕呢?
分而治之(有點)
最簡單的事情就是選擇一個壓力門檻值,将壓力範圍分為按下和釋放狀态。例如,如果壓力低于0.5,則釋放壓力,否則壓力将被按下。
如果你曾經玩過這樣的遊戲(不是那麼常見)或者你自己也嘗試過,你可能會注意到在門檻值附近輸入變得易變。不小心來回穿過門檻太容易了。就像用顫抖的手按下數字按鈕。
兩個門檻值門檻總比一個好
對于我們的單門檻值實作,常見的修複方法是将其拆分為單獨的門檻值,以便從release轉換為pressed,再從pressed轉換為release。例如,我們可以說,當按鈕處于釋放狀态時,如果壓力增加到0.6以上,它将轉換為按下狀态。當壓力降到0.4以下時,當壓力降到0.4以下時,它将轉變為釋放狀态。現在中間有一個0.2的緩沖區,你的手指可以随意移動,而不會意外地松開或按下按鈕。
這是一個更常見的實作,可以在野外看到。它需要更多的小心去注意,并在它出錯時給予尊重。打完一個小時後,你的一個球就不會發射了,因為你把扳機扳到了0.5而不是0.6。這在試圖快速連續射擊時更為常見。我發誓我開了五槍而不是四槍!把責任推到球員身上很容易,但通常情況下,應該把責任推到比賽上。我們可以更好地解釋玩家的輸入。
壓力deltas和移動門檻值
人們不善于知道他們輸入了什麼樣的壓力值。當有人試圖射擊時,他們不會考慮扣動扳機來達到0.6的壓力值。他們隻是想扣動扳機。更具體地說,他們正在考慮扣動扳機相對于目前的壓力。遊戲應該用類似的方式來思考。
讓我們改變我們的架構來定義壓力的變化,它将從釋放過渡到壓力,以及從壓力到釋放的轉換。讓我們分别從0.3和-0.2開始(為您的遊戲調整這些)。這些增量将用于動态定義導緻狀态轉換的門檻值。因為deltas是相對值,讓我們定義它們的相對值。
當處于釋放狀态時,我們的轉換門檻值将比所遇到的最小壓力高0.3。例如,讓我們浏覽一個場景,其中我們以0.2的壓力進入釋放狀态。
首先,我們将最小值初始化為目前壓力0.2。進入按下狀态的門檻值現在是0.5,基于0.2最小值加上0.3增量。
在下一幀中,我們輪詢壓力為0.1,并相應地更新最小值。進入按下狀态的門檻值現在是0.4,基于0.1最小值加上0.3增量。
在下一幀中,我們輪詢0.2的壓力,該壓力不影響最小值。根據0.1最小值加上0.3增量,進入按下狀态的門檻值保持在0.4。
在下一幀中,我們輪詢0.4的壓力,該壓力不影響最小值。門檻值再次保持在0.4,我們觸發我們進入按下狀态的轉換。
當處于壓力狀态時,我們的轉換門檻值将比所遇到的最大壓力低0.2。這和上面釋出的示例一樣,隻是方向相反。
邊緣案例
在我們宣布勝利之前,我們要讨論一些邊緣情況。您會注意到,在這個例子中,我選擇了單獨的delta來按下和釋放。這不是必需的,但我确實認為讓釋放更快/更容易感覺更好,因為玩家更清楚他們在對抗按鈕的實體阻力的情況下,拉了多遠。他們不太清楚自己釋放了多大的壓力。不管這是否是最佳的感覺,讓我們看看使用不對稱三角洲的含義。
因為我們選擇了一個比釋放更長的拉力,有一個接近全壓的區域,我們可以釋放按鈕,但沒有足夠的空間再次按下它。具體地說,如果按鈕完全按下,則為1.0。現在釋放-0.2的壓差,進入釋放狀态。這将我們的值設為0.8,并且由于0.3 delta,重新進入按下狀态的門檻值為1.1。不幸的是,我們實際上不能輸入1.1的值,是以我們需要一直釋放到0.7,然後才有足夠的空間再次開火。當壓力增量小于釋放增量時,在接近0.0的情況下,我們也會遇到類似的問題。
我們能做得更好嗎?我認為是這樣。讓我們把門檻值限制在[0,1]範圍内。這意味着對于壓力增量大于釋放增量的情況,我們總是可以從釋放狀态發射,但當接近1.0時,我們有時不需要按得太遠。也就是說,實體播放器的輸入達到了一個極限,因為機械按鈕不能再拉進去,是以對玩家來說就不會覺得奇怪了。
請注意,如果釋放門檻值與按下門檻值(例如0.01和0.3)相比調得非常小,則最好采用另一種方法,該方法要求最小拉力增量接近1.0。
正如我之前所說,如果你能通過控制器的語言準确地翻譯出玩家的意圖,你就可以做出一個嚴格控制的遊戲。這是這條道路上的又一步。
人工智能晶片與自動駕駛