Java,Steam控制器和我
您是否想過是否可以將現有的東西用于新的東西? 我看了一些所謂的“蒸汽控制器”(從現在開始為SC)的鏡頭,并看著我的游戲手柄。 問我自己是否有可能以類似蒸汽的方式使用它,我找到了一些Java庫并創建了一個項目,今天想與您共享。
當然,早在SC發行之前就已經有很多輸入設備(尤其是游戲控制器),但是它具有一個新特性,使其與眾不同。
它具有兩個觸摸板,它們可以模擬鼠標或鍵盤的輸入,以便能夠(實際上幾乎)玩每個游戲。 如一些早期視頻所示,通過使用這種兼容模式,即使像益智游戲“ Portal”之類的鼠標密集型游戲也似乎可以玩。
作為游戲發燒友和Java程序員,我如何使用這樣的東西(我已經擁有的XBOX控制器)來接近它?
一個名為“ StrangeCtrl”的小工具看到了世界的亮光。 與控制器對話需要一些JNI(例如,因為JVM中沒有USB子系統),但是其余部分則是用純Java編寫的。 它位于系統托盤中,并且針對每個配置文件進行了手動配置,盡管也可以構建一個GUI。
它的依存關系是2.0.5版中的“ net.java.jinput.JInput”(仍適用于Windows 8.1)和我編寫的一個小助手(“ com.xafero.SuperLoader” v0.1)。 現在,我將解釋在此過程中采取的步驟。
第一步:我們如何讓Java與我的控制器對話?
幸運的是,BSD許可的JInput項目正是這樣做的。 例如,它連接到Microsoft的XInput接口,并用它獲取的本機數據填充某些Java數據結構。 也涵蓋Linux和Mac OS X,不用擔心。
因此,我插入了游戲手柄(一個兼容XBOX的控制器),方法似乎很清楚:
三大操作系統的庫的本機組件均以Java歸檔文件(至少每個Maven)提供。 但是,您可能已經知道,java.lang.System僅加載文件系統上直接可用的文件。
第二步:那么如何解決這個煩人的局限性呢?
快速搜索后,我發現wcmatthysen的“ mx-native-loader”似乎很有用,因為它聲稱可以提取JAR并加載本地內容。 但這沒有用,因為JInput的庫被打包到幾個“ jinput-platform-***。jar”文件中,而不是像該加載器所建議的那樣,被打包在META-INF / lib下的一個大塊文件中。
因此,名為“ SuperLoader”的新幫助程序庫可以在以下情況下工作:
現在,該應用程序將所有本機庫預加載到一個臨時文件夾中,例如,當要求JInput提供控制器列表時,不必為使用JAR文件而對其進行更改。 它完全可以像任何人一樣使用System.loadLibrary。
第三步:可以模擬什么?
我們終于要閱讀游戲手柄的事件了,那么我們該怎么辦呢? 使用AWT的Robot類,自Java早期以來就可以模擬按鍵或鼠標移動等。 盡管機器人需要一個人來指定應該在其上工作的桌面,但它在多顯示器系統上也可以正常工作。 唯一的區別是它生成的所有事件的偏移量–如果要單擊PC屏幕的特定區域,這一點尤其重要。
到目前為止已實現的命令是:
- MouseMoveCmd –水平或垂直移動鼠標一定量
- MouseClickCmd –在當前屏幕位置單擊給定的鼠標按鈕
- KeyComboCmd –按一些鍵并以相反的順序釋放它們
為了實現某種程度的可擴展性,有一個接口可以接受機器人生成虛擬事件,當前圖形設備以及JInput給定的值:
public interface ICommand {void execute(Robot rbt, GraphicsDevice dev, float value); }它的抽象實現“ AbstractCmd”提供了一個接受一個字符串的構造函數。 作為處理的第一步,來自配置文件的原始字符串被一個空白分隔為一個字符串數組。
第四步:我們可以使用哪種配置格式?
有很多流行的格式,例如YAML,JSON等。但是Java已經為我們提供了一種簡單的方法來實現這一目標。 因此,使用Java屬性機制的XML變體來解析配置文件。 要使用與命令連接的字符串來構建實際地圖,請使用類“ com.xafero.strangectrl.cmd.ConfigUtils”
- 加載配置,
- 遍歷所有條目,
- 通過每個條目的值搜索命令,
- 并生成用于轉換傳入事件的實際地圖。
第五步:實際工作
輔助類“ ControllerPoller”是一個定期執行的TimerTask,負責從任意數量的控制器中收集新的JInput事件,并將每個新內容通知調用者:
public void run() { for (Controller controller : controllers) { if (!controller.poll()) continue; EventQueue queue = controller.getEventQueue(); Event event = new Event(); while (queue.getNextEvent(event)) callback.onNewEvent(this, controller, event); } }調用方(在這種情況下,位于系統托盤中的所謂“ App”)僅實現回調接口,并在發生任何輸入時免費獲取所有信息:
public static interface IControllerCallback { void onNewEvent(ControllerPoller p, Controller c, Event e); }“應用程序”的左側是搜索與傳入游戲手柄事件相關聯的命令,并使用正確的參數執行這些命令。 現在我們可以用它來控制某些游戲,也許是波斯王子之類的舊游戲,或者是其他無法通過游戲手柄玩的游戲。 但是,讓我們走開...
除了游戲以外的示例:如何為行動受限的人配置它?
為了僅顯示另一個可能的應用領域,讓我們為無法同時按下兩個鍵的用戶進行配置。 一個示例應用程序應該是Web瀏覽器。 在配置文件中,有以下設置:
<!-- Button A means now left mouse click --> <entry key="Button 0">mouseClick 1</entry> <!-- Button B will open a new tab --> <entry key="Button 1">keyCombo CONTROL T</entry> <!-- Button X will close an existing tab --> <entry key="Button 2">keyCombo CONTROL W</entry>此示例中的瀏覽器不必知道游戲控制器,因為操作系統將產生新的虛擬輸入事件,并且將按要求運行。 通過使用Java并成為FOSS,該工具還可以進行自定義并且易于以各種方式理解(與模擬輸入設備否則必須使用某些C / C ++代碼相比)。
資源和鏈接
源代碼位于https://github.com/xafero/StrangeCtrl 。 隨時使用,共享或修改任何方面(根據GPL v3許可)。
有關更多信息,請參見:
- JInput – https://java.net/projects/jinput
- AWT機器人-http: //docs.oracle.com/javase/6/docs/api/java/awt/Robot.html
翻譯自: https://www.javacodegeeks.com/2014/01/java-the-steam-controller-and-me.html
總結
以上是生活随笔為你收集整理的Java,Steam控制器和我的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 局域网内ddos(怎么ddos局域网用户
- 下一篇: 四川备案网(四川备案管理)